sf-reglanegociom3 1.0.12-beta7 → 1.0.12-beta8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/sf-reglanegociom3.umd.js +11 -1
- package/bundles/sf-reglanegociom3.umd.js.map +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
- package/esm2015/lib/rnm3/Services/m3-reg-service.js +11 -1
- package/esm5/lib/rnm3/Services/m3-reg-service.js +11 -1
- package/fesm2015/sf-reglanegociom3.js +11 -1
- package/fesm2015/sf-reglanegociom3.js.map +1 -1
- package/fesm5/sf-reglanegociom3.js +12 -2
- package/fesm5/sf-reglanegociom3.js.map +1 -1
- package/package.json +1 -1
|
@@ -9760,6 +9760,16 @@
|
|
|
9760
9760
|
packM3PItemsWEB.IDEncRepetido = +this.GetMaxAtributoFromLista(oM3Procesos.M3ENC, "ID") + i + 2; //Esto funciona si tiene solo 2 niveles
|
|
9761
9761
|
//Si esto se cumple este producto es un pack y tiene productos asociados.
|
|
9762
9762
|
oM3PrdPackDet.M3GRP.LoM3PrdGeneral[0].LoM3PrdLista.PRECIO = 0;
|
|
9763
|
+
try {
|
|
9764
|
+
/** @type {?} */
|
|
9765
|
+
var prdGeneral = oM3PrdPackDet.M3GRP.LoM3PrdGeneral[0].M3Cods.find(function (x) { return x.IdCodigo == "UPC"; });
|
|
9766
|
+
if (prdGeneral && prdGeneral.Valor) {
|
|
9767
|
+
packM3PItemsWEB.CodigoBarras = prdGeneral.Valor;
|
|
9768
|
+
}
|
|
9769
|
+
}
|
|
9770
|
+
catch (e) {
|
|
9771
|
+
console.warn("no añadi codigo de barras a producto hijo: " + oM3PrdPackDet.SKUHIJO);
|
|
9772
|
+
}
|
|
9763
9773
|
this.LoadM3PEncItemsFromPrdGrl(oM3Procesos, oM3PrdPackDet.M3GRP, oM3Procesos.M3ENC, packM3PItemsWEB, oM3Ubicacion, oM3ENCPROMO, oDataUser, oM3PEncItems, 0, oM3PDinamicasByActividad);
|
|
9764
9774
|
}
|
|
9765
9775
|
}
|
|
@@ -16896,4 +16906,4 @@
|
|
|
16896
16906
|
|
|
16897
16907
|
})));
|
|
16898
16908
|
|
|
16899
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtcmVnbGFuZWdvY2lvbTMudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvRGF0YS9tMy1jb3VjaC1tYWVzdHJvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9EYXRhL20zLWRhdGEudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vZmlsdHJvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkR3JwLnR5cGUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXAtaW1wdWVzdG9zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGRpbmFtaWNhcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGVuYy1mcC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGVuYy1pdGVtcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcC1lbnZpb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLWYtdHJhYmFqby50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcHJvY2Vzb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXByZWNlcGNpb24udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlci14LXByb2Nlc28udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtZmUuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcHJvY2Vzby5pbnRlcmZhY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NaXNjZWxhbmVhL01hdGhURi5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1jb25maWdscC5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL00zTWFlc3Ryby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1yZWctc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtdHJ4LmludGVyZmFjZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtZGluLXByb2Nlc29zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkUGFja0RldC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9VYmljYWNpb24vTTNVYmlBZGljaW9uYWxlcy50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNDT05ESUFHUlVQQUNJT04uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM0NPTkRJUFJPTU8uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM0RFVENPTkRJUFJPTU8uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy11YmljYWNpb24uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLW1hc2l2by5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1yZWctbWFzaXZvLWFrei5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1yZXZlcnNvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBkaW5hbS1ieS1hY3RpdmlkYWQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtZGluLWJ5LWFjdGl2aWRhZC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtc2FsZG9zLXgtY3VlbnRhLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1yZWctdHJ4LnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9DdXBvbmVzL2N1cG9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9TZXJ2aWNlL2JkLW9mZmxpbmUuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9TZXJ2aWNlL2JkLW9mZmxpbmUtbG9nLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvc2VydmljZS1tMy1tYWVzdHJvLW9mZmxpbmUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvc2VydmljZS1tMy1wcm9jZXNvLW9mZmxpbmUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLW5vdGlmaWNhY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTm90aWZpY2FjaW9uZXMvTTNOb2ZpdGljYWNpb25lcy5tb2RlbC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9tMy1wcmVzZW50YWNpb25lcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvQ29uc3VsdGFzTTMvbTMtY29uc3VsdGFzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vVWJpY2FjaW9uL20zLXRlY2xhcy1yYXBpZGFzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXByZHMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1jb2RzcHJkLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtcHJvbW9jaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC11YmljYWNpb25lcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Ob3RpZmljYWNpb25lcy9ub3RpZmljYWNpb25lcy1tMy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1wYWNrLWJ5LXRpcG8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9TZXJ2aWNlL2ZpbHRyb3MtZGlhcmlvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtcGVyeHRpcG8udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtZGluYW14cHJvY2Vzb3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBIdHRwLCBSZXF1ZXN0T3B0aW9ucywgSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnXHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAvc3JjL3N0YXRpY19yZXNwb25zZSdcclxuaW1wb3J0IHsgdGltZW91dCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3N0U2VydmljZU0zIHtcclxuICAgIGlka2F0aW9zOiBzdHJpbmdcclxuICAgIHNlcnZpZG9yOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvclBlcnNvbmFzOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckdlbmVyYWxlczogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JNMzogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JGRU1YOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckRvY3VtZW50b3M6IHN0cmluZztcclxuICAgIHNlcnZpZG9yQ29udGFibGU6IHN0cmluZztcclxuICAgIHNlcnZpZG9yUHJlc3RhbW86IHN0cmluZztcclxuICAgIFdlYkJhc2U6IHN0cmluZztcclxuICAgIC8qXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHAsIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCkge1xyXG4gICAgICAgIC8vdGhpcy5zZXJ2aWRvcj0gXCJodHRwOi8veWFjdW5hLnRlY2ZpbmFuemFzLmNvbTo4MDg0L1dDRldFN1Jlc3QvXCI7XHJcbiAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly90aWN1bmEudGVjZmluYW56YXMuY29tOjgwODQvV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAvL3RoaXMuc2Vydmlkb3I9IFwiaHR0cDovL3RpY3VuYS50ZWNmaW5hbnphcy5jb20vV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAvL211aXNjYVxyXG4gICAgICAgIC8vdGhpcy5zZXJ2aWRvcj0gXCJodHRwOi8vbXVpc2NhLnRlY2ZpbmFuemFzLmNvbS9XQ0ZXRTdSZXN0L1wiO1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUGVyc29uYXMgPSBqc29uLlNlcnZpZG9yUGVyc29uYXM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvciA9IGpzb24uU2Vydmlkb3I7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcyA9IGpzb24uU2Vydmlkb3JHZW5lcmFsZXM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvck0zID0ganNvbi5TZXJ2aWRvck0zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zID0ganNvbi5TZXJ2aWRvckRvY3VtZW50b3M7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckNvbnRhYmxlID0ganNvbi5TZXJ2aWRvckNvbnRhYmxlO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQcmVzdGFtbyA9IGpzb24uU2Vydmlkb3JQcmVzdGFtbztcclxuICAgICAgICB0aGlzLldlYkJhc2UgPSBqc29uLldlYkJhc2U7XHJcbiAgICB9Ki9cclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwLCBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpIHtcclxuICAgICAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly95YWN1bmEudGVjZmluYW56YXMuY29tOjgwODQvV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly90aWN1bmEudGVjZmluYW56YXMuY29tOjgwODQvV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly90aWN1bmEudGVjZmluYW56YXMuY29tL1dDRldFN1Jlc3QvXCI7XHJcbiAgICAgICAgICAgIC8vbXVpc2NhXHJcbiAgICAgICAgICAgIC8vdGhpcy5zZXJ2aWRvcj0gXCJodHRwOi8vbXVpc2NhLnRlY2ZpbmFuemFzLmNvbS9XQ0ZXRTdSZXN0L1wiO1xyXG4gICAgICAgICAgICB0aGlzLmNhcmdhSW5pY2lhbCgpIDtcclxuICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBwdWJsaWMgY2FyZ2FJbmljaWFsKCl7XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIGpzb24gPXJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJykgO1xyXG4gICAgICAgICAgICBsZXQgc0NvbmZpZ0pTT04gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKTtcclxuICAgICAgICAgICAgaWYgKHNDb25maWdKU09OKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgakNvbmZpZ0pTT04gPSBKU09OLnBhcnNlKHNDb25maWdKU09OKTtcclxuICAgICAgICAgICAgICAgIGlmKGpDb25maWdKU09OLlNlcnZpZG9yUGVyc29uYXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGpzb24gPSBqQ29uZmlnSlNPTjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvclBlcnNvbmFzID0ganNvbi5TZXJ2aWRvclBlcnNvbmFzO1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcyA9IGpzb24uU2Vydmlkb3JHZW5lcmFsZXM7XHJcbiAgICAgICAgICAgIHRoaXMuc2Vydmlkb3JNMyA9IGpzb24uU2Vydmlkb3JNMztcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckRvY3VtZW50b3MgPSBqc29uLlNlcnZpZG9yRG9jdW1lbnRvcztcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckNvbnRhYmxlID0ganNvbi5TZXJ2aWRvckNvbnRhYmxlO1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgICAgIHRoaXMuV2ViQmFzZSA9IGpzb24uV2ViQmFzZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvbmZpZ0pzb24oaWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCB0aGlzLmdldFdpdGhCb2R5R2VuZXJhbGVzKCdHZW5lcmFsZXMvZ2V0Q29uZmlnSnNvbi8nICsgaWRLYXRpb3MsIG51bGwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcE9rX2dldENvbmZpZ0pzb24ocmVzcHVlc3RhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzcE9rX2dldENvbmZpZ0pzb24oanNvbil7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvclBlcnNvbmFzID0ganNvbi5TZXJ2aWRvclBlcnNvbmFzO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3IgPSBqc29uLlNlcnZpZG9yO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMgPSBqc29uLlNlcnZpZG9yR2VuZXJhbGVzO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JNMyA9IGpzb24uU2Vydmlkb3JNMztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRkVNWCA9IGpzb24uU2Vydmlkb3JGRU1YO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zID0ganNvbi5TZXJ2aWRvckRvY3VtZW50b3M7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckNvbnRhYmxlID0ganNvbi5TZXJ2aWRvckNvbnRhYmxlO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQcmVzdGFtbyA9IGpzb24uU2Vydmlkb3JQcmVzdGFtbztcclxuICAgICAgICB0aGlzLldlYkJhc2UgPSBqc29uLldlYkJhc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VVJMU2VydmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpZG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVSTFNlcnZlckRvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL2h0dHBHZXRcclxuICAgIGh0dHBHZXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL2h0dHBHZXRcclxuICAgIGh0dHBHZXRXaXRoVGltZU91dCh1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHRpbWVvdXRUaW1lOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChpU2Vydmlkb3IgKyB1cmxHZXQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRpbWVvdXQodGltZW91dFRpbWUpXHJcbiAgICAgICAgKS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cEdldFdpdGhCb2R5KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBHZXRXaXRoQm9keVRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCBwYXJhbWV0cm9zOiBhbnksIHRpbWVvdXRUaW1lOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcblxyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGlTZXJ2aWRvciArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGltZW91dCh0aW1lb3V0VGltZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBodHRwX2dldF9ibG9iKHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7ICAgICAgICBcclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdSZXNwb25zZSBUeW9lJywgJ2Jsb2InKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIH0pLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cF9nZXRfYXJyYXlidWZmZXIodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCBwYXJhbWV0cm9zOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsgICAgICAgIFxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ1Jlc3BvbnNlIFR5b2UnLCAnYmxvYicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIH0pLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBnZXRQcmVzdGFtbyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRXaXRoQm9keU0zVGltZU91dCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnksIHRpbWVvdXRUaW1lOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHlUaW1lT3V0KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCBwYXJhbXMsIHRpbWVvdXRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRXaXRoQm9keVByZXN0YW1vKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoQm9keSh1cmxHZXQsIHRoaXMuc2Vydmlkb3JQcmVzdGFtbywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2l0aEJvZHlNMyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yTTMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlQZXJzb25hcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yUGVyc29uYXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlHZW5lcmFsZXModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRXaXRoQm9keURvY3VtZW50byh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgncmVzcG9uc2VUeXBlJywgJ1Jlc3BvbnNlQ29udGVudFR5cGUuQmxvYicpO1xyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRfYmxvYl9Eb2N1bWVudG9zKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBfZ2V0X2Jsb2IodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRfYXJyYXlidWZmZXJfRG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwX2dldF9hcnJheWJ1ZmZlcih1cmxHZXQsIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc3RzKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBlcnNvbmFzKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JQZXJzb25hcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0R2VuZXJhbGVzKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE0zKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TTNXaXRoVGltZU91dCh1cmxHZXQ6IHN0cmluZywgdGltZU91dDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhUaW1lT3V0KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCB0aW1lT3V0KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICBnZXREb2N1bWVudG9zKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0Q29udGFibGUodXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0KHVybEdldCwgdGhpcy5zZXJ2aWRvckNvbnRhYmxlKTtcclxuICAgIH1cclxuICAgIC8vL0VuZCBodHRwR2V0XHJcblxyXG4gICAgZ2V0UG9zdHNXaXRoT3V0SnNvbih1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuc2Vydmlkb3IgKyB1cmxHZXQpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHAodXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChcclxuICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzVGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvLy9wb3N0U2VydmljZVJlc3BvbnNlSHR0cFxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHAodXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZVJlc3BvbnNlSHR0cENhbGxTZXJ2aWNlKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGlTZXJ2aWRvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChpU2Vydmlkb3IgKyB1cmxHZXQsIHBhcmFtcykubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBQcmVzdGFtb3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JQcmVzdGFtbyk7XHJcbiAgICB9XHJcbiAgICAvLy9FbmQgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBcclxuXHJcblxyXG4gICAgLy8vcG9zdFNlcnZpY2VIdHRwT3B0aW9uc1xyXG4gICAgcG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGhlYWRlcnMsIGlTZXJ2aWRvcikge1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zLCBvcHRpb25zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGhlYWRlcnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBPcHRpb25zQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIGhlYWRlcnMsIHRoaXMuc2Vydmlkb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNNMyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNEb2NzKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGhlYWRlcnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBPcHRpb25zQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIGhlYWRlcnMsIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9FbmQgcG9zdFNlcnZpY2VIdHRwT3B0aW9uc1xyXG5cclxuICAgIC8vL3Bvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxcclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChcclxuICAgICAgICAgICAgcmVzID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3IpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbFBlcnNvbmFzKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvclBlcnNvbmFzKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsTTModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlV2ViQXBpKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxGRU1YKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvckZFTVgpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxHZW5lcmFsZXModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbFByZXN0YW1vcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxcclxuICAgIHBvc3RTZXJ2aWNlV2ViQXBpKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGlTZXJ2aWRvcikge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMsIG9wdGlvbnMpLm1hcChcclxuICAgICAgICAgICAgcmVzID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgeG1sVG9Kc29uVEZ7XHJcblxyXG4gICAgY29udmVydFhtbFRvSnNvbihpbnB1dFhtbCl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcGFyc2VTdHJpbmcgPSByZXF1aXJlKCd4bWwyanMnKS5wYXJzZVN0cmluZztcclxuICAgICAgICBjb25zdCB4bWwgPSBpbnB1dFhtbDtcclxuICAgICAgICBsZXQgcmVzdWx0YWRvO1xyXG4gICAgICAgIHBhcnNlU3RyaW5nKHhtbCwgKGVyciwgcmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdGFkbz0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG87XHJcbiAgICB9XHJcblxyXG4gICAgcmVwbGFjZUNoYXJYbWwoaW5wdXRYbWwpe1xyXG4gICAgICAgIGxldCBndCA9IC8mZ3Q7L2dpOyAgICAgICAgXHJcbiAgICAgICAgbGV0IGx0ID0gLyZsdDsvZ2k7XHJcbiAgICAgICAgbGV0IHF1b3QgPSAvJnF1b3Q7L2dpO1xyXG4gICAgICAgIGxldCByZXN1bHRhZG8gPSBpbnB1dFhtbC5yZXBsYWNlKGd0LFwiPlwiKTtcclxuICAgICAgICByZXN1bHRhZG8gPSByZXN1bHRhZG8ucmVwbGFjZShsdCxcIjxcIik7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gcmVzdWx0YWRvLnJlcGxhY2UocXVvdCxcIidcIik7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG87XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXByb2Nlc29zJztcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNDb3VjaE1hZXN0cm8ge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIHNUaXBvSHViOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgc1RpcG9IdWIgPSB0aGlzLkdldFRpcG9IdWJGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICBpZiAoc0lka2F0aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc1RpcG9IdWIgJiYgc1RpcG9IdWIudG9VcHBlckNhc2UoKS50cmltKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tRWNjX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21FY2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0VFQ0MhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Z1bmNpb24gcXVlIHRyYWVyYSBlbCB0aXBvIGRlIGh1YlxyXG4gICAgcHVibGljIEdldFRpcG9IdWJGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uTTNIVUJTWzBdLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIGJhc2UgZGUgZGF0b3MuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIC8vICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAvLyAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAvLyAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgLy8gICAgIG9wdGlvbnMyXHJcbiAgICAgICAgLy8gfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJDb21wbGV0bzpcIiArIGNoYW5nZSlcclxuICAgICAgICAvLyB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgLy8gfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM0RhdGEge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIkNhcnJpdG9Db21wcmFzXCIsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvL3RoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQih0aGlzLkdldFNlcnZlcigpICsgXCJjYXJyaXRvXCIpO1xyXG4gICAgICAgICAgICAvL3RoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJjYXJyaXRvXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2gsIEFzeW5jLlxyXG4gICAgcHVibGljIGFzeW5jIEFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCB0aGlzLmdldChpZCk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgIC8vICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgLy8gICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgLy8gfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgYmFzZSBkZSBkYXRvcy5cclxuICAgIHB1YmxpYyBHZXREYXRhUG91Y2hCRChpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgYmFzZSBkZSBkYXRvcy5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uczIgPSB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy90aGlzLmF1dGVudGljYWNpb25TZXJ2ZXIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2Uuc3luYyhyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCBvcHRpb25zMik7XHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCBvcHRpb25zMik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLy9hcm1hciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgSURLYXRpb3MsIHRkb2MgeSBuZG9jLlxyXG4gICAgcHVibGljIEdldEtleUNhcnJpdG9Db21wcmFzKGlzSURLYXRpb3M6IHN0cmluZywgaXNUZG9jOiBzdHJpbmcsIGlzTmRvYzogc3RyaW5nLCBpc1ViaWNhY2lvbjogc3RyaW5nLCBpc0lkSHViOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gXCJDQz9cIiArIGlzSURLYXRpb3MgKyBcIj9cIiArIGlzVWJpY2FjaW9uICsgXCI/XCIgKyBpc0lkSHViICsgXCI/XCIgKyBpc1Rkb2MgKyBcIj9cIiArIGlzTmRvYztcclxuICAgIH1cclxuXHJcbiAgICAvL0Rlc3RydWlyIHkgcmVjb25zdHJ1aXIgbGEgYmFzZSBkZSBkYXRvcyBwb3VjaERCXHJcbiAgICBwdWJsaWMgUmVzZXJCRCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoJ0NhcnJpdG9Db21wcmFzJywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgRmlsdHJvcyB7XHJcbiAgICBwdWJsaWMgQXRyaWJ1dG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihpc0F0cmlidXRvOnN0cmluZywgaXNWYWxvcjpzdHJpbmcpe1xyXG4gICAgICAgIHRoaXMuQXRyaWJ1dG8gPSBpc0F0cmlidXRvO1xyXG4gICAgICAgIHRoaXMuVmFsb3IgPSBpc1ZhbG9yO1xyXG4gICAgfVxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1ByZEFkaWNpb25hbGVze1xyXG4gICAgU0tQMTpzdHJpbmc7XHJcbiAgICBBVFJJQlVUTzpzdHJpbmc7XHJcbiAgICBWQUxPUjpzdHJpbmc7XHJcbiAgICBOSVZFTDE6bnVtYmVyO1xyXG4gICAgTklWRUwyOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUHJlc2VudGFjaW9uZXMgfSBmcm9tIFwiLi9tMy1wcmVzZW50YWNpb25lc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkTGlzdGF7XHJcbiAgICBJRExJU1RBOnN0cmluZztcclxuICAgIFNLVTpzdHJpbmc7XHJcbiAgICBMT1RFOnN0cmluZztcclxuICAgIFBSRUNJTzpudW1iZXI7XHJcbiAgICBMQjogbnVtYmVyO1xyXG4gICAgTEM6IG51bWJlcjtcclxuICAgIExEOiBudW1iZXI7XHJcbiAgICBTVUJJTkRJQ0U6IHN0cmluZztcclxuICAgIFBPUklHSU5BTDogbnVtYmVyO1xyXG4gICAgcHVibGljIE0zUHJlc2VudGFjaW9uZXMgPSBuZXcgQXJyYXk8TTNQcmVzZW50YWNpb25lcz4oKTtcclxufSIsImltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tIFwiLi9NM1ByZExpc3RhLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrRGV0IH0gZnJvbSBcIi4vTTNQcmRQYWNrRGV0XCI7XHJcbmltcG9ydCB7IE0zQ29kc1hQUkQgfSBmcm9tIFwiLi9NM0NvZHNYUFJELnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrUmVnbGFzIH0gZnJvbSBcIi4vTTNQcmRQYWNrUmVnbGFzXCI7XHJcbmV4cG9ydCBjbGFzcyBNM1ByZEdlbmVyYWwge1xyXG4gICAgU0tVOiBzdHJpbmc7XHJcbiAgICBMT1RFOiBzdHJpbmc7XHJcbiAgICBOT01CUkUxOiBzdHJpbmc7XHJcbiAgICBOT01CUkVMQVJHTzogc3RyaW5nO1xyXG4gICAgQUNUMUNUQkw6IHN0cmluZztcclxuICAgIEFDVDJDVEJMOiBzdHJpbmc7XHJcbiAgICBDVEJMRFBSRDogc3RyaW5nO1xyXG4gICAgQ1RCTERJTVBQUkQ6IHN0cmluZztcclxuICAgIFNLUDE6IHN0cmluZztcclxuICAgIFNLUDI6IHN0cmluZztcclxuICAgIFNLUDM6IHN0cmluZztcclxuICAgIFNLUDQ6IHN0cmluZztcclxuICAgIFNLUDU6IHN0cmluZztcclxuICAgIERJU1BPTklCTEU6IG51bWJlcjtcclxuICAgIERJU1BPTklCTEVSZWY6IG51bWJlcjtcclxuICAgIE0zUEFDSzogQXJyYXk8TTNQcmRQYWNrRGV0PiA9IG51bGw7XHJcbiAgICBNM1BhY2tSZWdsYXM6IEFycmF5PE0zUHJkUGFja1JlZ2xhcz4gPSBudWxsO1xyXG4gICAgTG9NM0xpc3RhUHJlY2lvID0gbmV3IEFycmF5PE0zUHJkTGlzdGE+KCk7XHJcbiAgICBMb00zUHJkTGlzdGEgPSBuZXcgTTNQcmRMaXN0YSgpO1xyXG4gICAgTTNDb2RzID0gbmV3IEFycmF5PE0zQ29kc1hQUkQ+KCk7XHJcbiAgICBJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8TTNQUkRJbXB1ZXN0b3M+KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BSREltcHVlc3RvcyB7XHJcbiAgICBDb2RJbXA6IHN0cmluZztcclxuICAgIE1ldG9kb2xvZ2lhOiBzdHJpbmc7XHJcbiAgICBWYWxvcjogbnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQcmRHZW5lcmFsIH0gZnJvbSBcIi4vTTNQcmRHZW5lcmFsLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tCeVRpcG8gfSBmcm9tIFwiLi9tMy1wYWNrLWJ5LXRpcG9cIjtcclxuaW1wb3J0IHsgTTNQVW5pZE1lZGlkYSB9IGZyb20gXCIuL20zcC11bmlkLW1lZGlkYVwiO1xyXG5pbXBvcnQgeyBNM1ByZEdycEFzb2NpYWRvIH0gZnJvbSBcIi4vTTNQcmRHcnBBc29jaWFkb1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFR5cGVNM1ByZEdycCB7XHJcbiAgICBTS1AxOiBzdHJpbmc7XHJcbiAgICBSQVRJTkc6IG51bWJlcjtcclxuICAgIEZJQ0hBVEVDTklDQTogc3RyaW5nO1xyXG4gICAgTUFSQ0E6IHN0cmluZztcclxuICAgIENMQVNJRklDQUNJT046IHN0cmluZztcclxuICAgIE5PTUJSRTogc3RyaW5nO1xyXG4gICAgVElQTzogc3RyaW5nO1xyXG4gICAgQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIENhbXBvc0FkaWNpb25hbGVzOiBzdHJpbmc7XHJcbiAgICBMb00zUHJkR2VuZXJhbCA9IG5ldyBBcnJheTxNM1ByZEdlbmVyYWw+KCk7XHJcbiAgICBMb00zUHJkQWRpY2lvbmFsZXMgPSBuZXcgQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4oKTtcclxuICAgIE0zUEFDS0JZVElQTyA9IG5ldyBBcnJheTxNM1ByZFBhY2tCeVRpcG8+KCk7XHJcbiAgICBNM1ByZEdycEFzb2NpYWRvOkFycmF5PE0zUHJkR3JwQXNvY2lhZG8+ID0gbnVsbDtcclxuXHJcbiAgICBsaXN0SW1hZ2VuZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgSW1wdWVzdG9zID0gbmV3IEFycmF5PFR5cGVJbXB1ZXN0b3NQUkQ+KCk7XHJcbiAgICBNM1BVbmlkTWVkaWRhOiBNM1BVbmlkTWVkaWRhO1xyXG5cclxuICAgIGVuY29udHJhZG9Mb2NhbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFR5cGVJbXB1ZXN0b3NQUkQge1xyXG4gICAgQ29kSW1wOiBzdHJpbmc7XHJcbiAgICBNZXRvZG9sb2dpYTogc3RyaW5nO1xyXG4gICAgVmFsb3I6IHN0cmluZ1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUEltcHVlc3Rvc3tcclxuICAgIHB1YmxpYyBQb3JjZW50YWplOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxvcjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTGltaXRlT3B1ZXN0bzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29kSW1wdWVzdG86c3RyaW5nO1xyXG4gICAgcHVibGljIEJhc2U6bnVtYmVyO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1BEZXRhbGxlSXRlbXMge1xyXG4gICAgcHVibGljIE5vbWJyZUNvbmNlcHRvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEl0ZW1zV0VCIHtcclxuICAgIHB1YmxpYyBkQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBkUHJlY2lvVG90YWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBCaXNQcm9kdWN0b1Byb21vOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQmlzT2JzZXF1aW86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgVW5pZGFkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENsYXZlUHJkU1JWOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENsYXZlUHJkVW5pZGFkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIElkUHJvY2Vzbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvYnNlcnZhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgU3ViRXN0YWRvX286IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgRXN0YWRvX286IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgUGF0aEltYWdlbjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgSURFbmNSZXBldGlkbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgSURFbmNQcm9jZXNhZG86IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIElERW5jUGFkcmU6IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIFRpcG9BZ3J1cGFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENvZGlnb0JhcnJhczogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBDYW1wb3NBZGljaW9uYWxlcyA9IFtdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQRGV0YWxsZUN1cG9uIHtcclxuICAgIHB1YmxpYyBJZEN1cG9uOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6IG51bWJlcjtcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgTTNQRGluYW1pY2FzIHtcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQRW5jRlAge1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBEZXNjcmlwY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvOnN0cmluZztcclxuICAgIHB1YmxpYyBJZFRpcG9QYWdvOm51bWJlcjsgLy8xOiBFZmVjdGl2byAyOiBUYXJqZXRhIGRlIGNyw4PCqWRpdG8gMzogVGFyamV0YSBEZWJpdG8gNDogUFNFXHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbENhbWJpbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsT3RyYUNsYXNpOm51bWJlciA9MDtcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcblxyXG5cclxuICAgIC8vVmFyaWFibGVzIFNvbG9Gcm9udFxyXG4gICAgcHVibGljIEFQTENhbWJpbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQVBMRmlkZWxpemFjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBkZWphcl9ib3JyYXI6Ym9vbGVhbiA9IHRydWU7XHJcblxyXG59IiwiaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BEZXRhbGxlQ3Vwb24gfSBmcm9tIFwiLi9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi9tMy1wLWltcHVlc3Rvc1wiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQRW52aW9zIH0gZnJvbSBcIi4vbTMtcC1lbnZpb3NcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbmNJdGVtcyB7XHJcbiAgICBwdWJsaWMgSWRQcm9kdWN0bzogc3RyaW5nO1xyXG4gICAgcHVibGljIExvdGU6IHN0cmluZztcclxuICAgIHB1YmxpYyBJRDogbnVtYmVyO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ29kaWdvQmFycmFzOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbnZpbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRElTUE9OSUJMRTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBQYXRoSW1hZ2U6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zREVUID0gbmV3IEFycmF5PE0zUERldGFsbGVJdGVtcz4oKTsgICAgXHJcbiAgICBwdWJsaWMgTTNEZXRDdXBvbmVzID0gbmV3IEFycmF5PE0zUERldGFsbGVDdXBvbj4oKTtcclxuICAgIHB1YmxpYyBNM1BJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8TTNQSW1wdWVzdG9zPigpO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcbiAgICAvL0VzdGFzIHByb3BpZWRhZGVzIG5vIHNvbiByZXBsaWNhIGEgYmFzZSBkZSBkYXRvcywgc29uIHBhcmEgdXNvIGludGVybm8uXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuXHJcbiAgICBwdWJsaWMgSWRFbmNQYWRyZTpudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb0FncnVwYWNpb246c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvL09idGVuZXIgZWwgcHJlY2lvIHVuaXRhcmlhXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VVbml0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWEsIGNvbiBkZXNjdWVudG9zIGluY2x1aWRvc1xyXG4gICAgcHVibGljIEdldFByaWNlVW5pdE5ldG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgZWwgcHJlY2lvIHVuaXRhcmlhLCBjb24gZGVzY3VlbnRvcyBpbmNsdWlkb3NcclxuICAgIHB1YmxpYyBTZXRQcmljZVVuaXROZXRvKGlWYWxvcikge1xyXG4gICAgICAgIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gaVZhbG9yO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgZWwgcHJlY2lvIHRvdGFsLlxyXG4gICAgcHVibGljIEdldFByaWNlVG90YWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbnZpb3N7XHJcbiAgICBwdWJsaWMgSWRFbnZpbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRGb3JtYUVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmVGRW52aW86c3RyaW5nO1xyXG4gICAgcHVibGljIERpcmVjY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUGFpczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2l1ZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNGVHJhYmFqb3tcclxuICAgIHB1YmxpYyBJZEh1YjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRVYmljOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEh1YlByZTpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRVYmljUHJlOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSBcIi4vbTMtcGVuYy1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNGUCB9IGZyb20gXCIuL20zLXBlbmMtZnBcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBNM1Byb21Db21iaW5hZGFYUHJvY2VzbyB9IGZyb20gXCIuL20zLXByb20tY29tYlwiO1xyXG5pbXBvcnQgeyBNM0ZUcmFiYWpvIH0gZnJvbSBcIi4vbTMtZi10cmFiYWpvXCI7XHJcbmltcG9ydCB7IE0zUEVudmlvcyB9IGZyb20gXCIuL20zLXAtZW52aW9zXCI7XHJcbmltcG9ydCB7IE0zUFJlY2VwY2lvbiB9IGZyb20gXCIuL20zLXByZWNlcGNpb25cIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi9tMy1wZXIteC1wcm9jZXNvXCI7XHJcbmltcG9ydCB7IE0zUmVnaXN0cm9UcnggfSBmcm9tIFwiLi9tMy1yZWctdHJ4XCI7XHJcbmltcG9ydCB7IE0zT3RDbGFzaWZpY2FjaW9uZXMgfSBmcm9tIFwiLi9tMy1vdC1jbGFzaWZpY2FjaW9uZXNcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuZXhwb3J0IGNsYXNzIE0zUHJvY2Vzb3Mge1xyXG4gICAgcHVibGljIElkTTM6c3RyaW5nO1xyXG4gICAgcHVibGljIEZlY2hhOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvVGVyY2VybzpudW1iZXI7XHJcbiAgICBwdWJsaWMgVERvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVWJpYzE6bnVtYmVyO1xyXG4gICAgcHVibGljIFViaWMyOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxvck5ldG86bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlciA9MDtcclxuICAgIHB1YmxpYyBWYWxPdHJhQ2xhc2k6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFN1YkVzdGFkb0RlczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvRGVzOnN0cmluZztcclxuICAgIHB1YmxpYyBTdWJFc3RhZG9BbnQ6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkb0FudDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVE1JZFByb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIElERGlhcmlvOnN0cmluZztcclxuICAgIHB1YmxpYyBJRERpYXJpb0NpZXJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSURIdWI6bnVtYmVyO1xyXG4gICAgcHVibGljIFRpcG9UUlg6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgcHVibGljIE0zT3RDbGFzaWZpY2FjaW9uZXMgPSBuZXcgQXJyYXk8TTNPdENsYXNpZmljYWNpb25lcz4oKTtcclxuICAgIHB1YmxpYyBsTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgIHB1YmxpYyBNM1BlclhQcm9jZXNvID0gbmV3IEFycmF5PE0zUGVyWFByb2Nlc28+KCk7XHJcbiAgICBwdWJsaWMgbE0zUEVuY0ZQID0gbmV3IEFycmF5PE0zUEVuY0ZQPigpO1xyXG4gICAgcHVibGljIE0zRlRyYWJham8gPSBuZXcgTTNGVHJhYmFqbygpO1xyXG4gICAgcHVibGljIE0zUEVudmlvcyA9IG5ldyBBcnJheTxNM1BFbnZpb3M+KCk7XHJcbiAgICBwdWJsaWMgTTNQUmVjZXBjaW9uID0gbmV3IEFycmF5PE0zUFJlY2VwY2lvbj4oKTtcclxuICAgIHB1YmxpYyBsTTNSZWdpc3Ryb1RyeCA9IG5ldyBBcnJheTxNM1JlZ2lzdHJvVHJ4PigpO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgRmVjaGFIb3JhRXN0YWRvOnN0cmluZztcclxuICAgIHB1YmxpYyBJZEVzdGFkbzpzdHJpbmc7XHJcblxyXG5cclxuICAgIC8vRXN0YXMgcHJvcGllZGFkZXMgbm8gc29uIHJlcGxpY2EgYSBiYXNlIGRlIGRhdG9zLCBzb24gcGFyYSB1c28gaW50ZXJuby5cclxuICAgIC8vcHVibGljIGxNM1Byb21Db21iaW5hZGEgPSBuZXcgQXJyYXk8TTNQcm9tQ29tYmluYWRhWFByb2Nlc28+KCk7XHJcblxyXG4gICAgcHVibGljIFByb21vc0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG5cclxuICAgIHB1YmxpYyBBcGxQYWdvRW5MaW5lYTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIEFwbERlc2RlU2VydmVyOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgbmRvY1VBY3Rpdm86c3RyaW5nOyAvL0pBR00gMjAxOTEwMTcgTnVldm9zIHBhcmFtZXRyb3MscGFyYSBsbGV2YXIgZWwgcmVnaXN0cm8gZGVsIHVzdWFyaW8gYWN0aXZvLCBxdWUgY3JlbyBlc3RlIHByb2Nlc29cclxuICAgIHB1YmxpYyB0ZG9jVUFjdGl2bzpzdHJpbmc7Ly9KQUdNIDIwMTkxMDE3IE51ZXZvcyBwYXJhbWV0cm9zLHBhcmEgbGxldmFyIGVsIHJlZ2lzdHJvIGRlbCB1c3VhcmlvIGFjdGl2bywgcXVlIGNyZW8gZXN0ZSBwcm9jZXNvXHJcbiAgICAvL3B1YmxpYyBiQVBMQ29tYmluYWRhc0FjdW06Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5GZWNoYSA9bW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQUmVjZXBjaW9ue1xyXG4gICAgcHVibGljIElkUmVjZXBjaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEVuYzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6bnVtYmVyO1xyXG4gICAgcHVibGljIEZlY2hhOkRhdGU7ICAgIFxyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuICAgIHB1YmxpYyBFc3RhZG86IHN0cmluZztcclxufSIsImV4cG9ydCBjbGFzcyBNM1BlclhQcm9jZXNve1xyXG4gICAgcHVibGljIFRpcG9QZXJzb25hOnN0cmluZztcclxuICAgIHB1YmxpYyBUZG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBOZG9jOnN0cmluZzsgICAgXHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBEZXNjVGlwb1A6c3RyaW5nO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyAgTTNPdENsYXNpZmljYWNpb25lc3tcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRQcm9kdWN0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6bnVtYmVyO1xyXG4gICAgcHVibGljIE9yZGVuOm51bWJlcjsvL1ZhcmlhYmxlIGRlIG9yZGVuYW1pZW50byBlbiBlbCBmcm9udFxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZU0zRkUge1xyXG5cclxuICAgIHB1YmxpYyBhZGRfcHJvY2Vzb19nZW5lcmFyRkUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9hZGRfcHJvY2Vzb19nZW5lcmFyRkUvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkX3Byb2Nlc29fZ2VuZXJhck5DKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvYWRkX3Byb2Nlc29fZ2VuZXJhck5DL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGFkZFByb2Nlc29HZW5lcmFyRkVBc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBqc29uO1xyXG4gICAgICAgIGxldCByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM0ZFL2FkZF9wcm9jZXNvX2dlbmVyYXJGRS9cIiArIHNJREthdGlvcywgakRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShyZXNwKVxyXG4gICAgICAgICAgICByZXR1cm4ganNvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2VuZXJhckNhcnRhUG9ydGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGlkbTM6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWChcIkZFTVgvZ2VuZXJhckNhcnRhUG9ydGUvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIGlkbTMsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRJbmZvRmFjdHVyYUVsZWN0cm9uaWNhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCkgfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM0ZFL2dldEluZm9GYWN0dXJhRWxlY3Ryb25pY2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEluZm8pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0SHRtbEZyb21GRShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBpZE0zOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVzcDtcclxuICAgICAgICBsZXQgZGF0YSA9IHsgJ2lkTTMnOiBpZE0zIH07XHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNGRS9nZXRIdG1sRnJvbUZFLycgKyBpZEthdGlvcywgZGF0YSkudG9Qcm9taXNlKClcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgSVVfSW5mb0ZhY3R1cmFFbGVjdHJvbmljYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0ZhY3R1cmE6IGFueSwgdVRBY3Rpdm86IHN0cmluZywgdU5BY3Rpdm86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBpZF9rYXRpb3MudHJpbSgpLCAnb0ZhY3R1cmEnOiBvRmFjdHVyYSwgJ3VUQWN0aXZvJzogdVRBY3Rpdm8sICd1TkFjdGl2byc6IHVOQWN0aXZvIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM0ZFL0lVX0luZm9GYWN0dXJhRWxlY3Ryb25pY2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbEluc1Nlcmllc3hVYmljKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvZGVsSW5zU2VyaWVzeFViaWMvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7ICAgICAgICBcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoSlNPTi5wYXJzZShKU09OLnBhcnNlKGVycltcIl9ib2R5XCJdKS5NZXNzYWdlKS5SRVNQVUVTVEFbXCIwXCJdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJvY2Vzb1NlcnZpY2Uge1xyXG5cclxuICAgIHB1YmxpYyBhZGRfcHJvY2Vzb0VBKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIlByb2Nlc29zTTMvYWRkX3Byb2Nlc29FQS9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsYSBsaXN0YSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhLCB1biBhcnJheSBkZSBmaWx0cm9zLlxyXG4gICAgTTNHZXRfUHJvY2Vzb3NQb3JDYW50aWRhZChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ1Byb2Nlc29zTTMvTTNHZXRfUHJvY2Vzb3NQb3JDYW50aWRhZC8nICsgc0lES2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvbFByb2Nlc29zLlJFU1BVRVNUQS5UUC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuVFAgPSBuZXcgQXJyYXkob2xQcm9jZXNvcy5SRVNQVUVTVEEuVFApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9sUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgbGlzdGEgZGUgcHJvZHVjdG8sIHRlbmllbmRvIGVuIGN1ZW50YSwgdW4gYXJyYXkgZGUgZmlsdHJvcy5cclxuICAgIHB1YmxpYyBNM0dldF9BY3RpdmlkYWRlc1lQcm9jZXNvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldF9BY3RpdmlkYWRlc1lQcm9jZXNvcy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb2xQcm9jZXNvcztcclxuICAgICAgICAgICAgb2xQcm9jZXNvcyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGFzIGFjdGl2aWRhZGVzIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBpZiAob2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9sUHJvY2Vzb3MuUkVTUFVFU1RBLkFDVElWSURBREVTID0gbmV3IEFycmF5KG9sUHJvY2Vzb3MuUkVTUFVFU1RBLkFDVElWSURBREVTKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsb3MgcHJvY2Vzb3Mgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3MuUkVTUFVFU1RBLkFDVElWSURBREVTLmZvckVhY2goQWN0aXZpZGFkID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChBY3RpdmlkYWQuUFJPQ0VTT1MgIT09IHVuZGVmaW5lZCAmJiBBY3RpdmlkYWQuUFJPQ0VTT1MubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBBY3RpdmlkYWQuUFJPQ0VTT1MgPSBuZXcgQXJyYXkoQWN0aXZpZGFkLlBST0NFU09TKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9sUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBwdWJsaWMgTTNHZXRfTTNQcm9jZXNvc0J5SWRQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRfTTNQcm9jZXNvc0J5SWRQcm9jZXNvLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcm9jZXNvLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb2xQcm9jZXNvc00zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zTTMgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxhcyBhY3RpdmlkYWRlcyBubyB2aWVuZW4gY29tbyB1biBhcnJheSwgY29udmVydGlybG9cclxuICAgICAgICAgICAgaWYgKG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TID0gbmV3IEFycmF5KG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbG9zIHByb2Nlc29zIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zTTMuUkVTUFVFU1RBLlNVQkVTVEFET1MuZm9yRWFjaChzdWJzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJzLk0zUFJPQ0VTT1MgIT09IHVuZGVmaW5lZCAmJiBzdWJzLk0zUFJPQ0VTT1MubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJzLk0zUFJPQ0VTT1MgPSBuZXcgQXJyYXkoc3Vicy5NM1BST0NFU09TKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9sUHJvY2Vzb3NNMyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIE0zcHJvY2Vzb3MsIGRlc2RlIGVsIGlkZGlhcmlvLlxyXG4gICAgcHVibGljIGFzeW5jIEdldE0zUHJvY2Vzb3NCeUlkRGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWREaWFyaW86IHN0cmluZykge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiSWREaWFyaW9cIjogc0lkRGlhcmlvIH07XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc287XHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRNM1Byb2Nlc29zQnlJZERpYXJpby8nICsgc0lES2F0aW9zLCBvRGF0YSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBNM3Byb2Nlc29zLCBUZW5pZW5kbyBlbCBJRE0zLiAgICBcclxuICAgIHB1YmxpYyBNM0dldF9NM1Byb2Nlc29zQnlJZE0zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSURNMzogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNVYmljYWNpb246IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCB1YmljRXh0ZXJubyA9IGZhbHNlLCBiQVBMUGFnb3NQRCA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZE0zXCI6IHNJRE0zLCBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH07XHJcbiAgICAgICAgaWYgKGJBUExQYWdvc1BEKSB7XHJcbiAgICAgICAgICAgIG9EYXRhLmJBUExQYWdvc1BEID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRQcm9jZXNvTTNCeUlkTTMvJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBhbnk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gcmVzcDtcclxuXHJcbiAgICAgICAgICAgIC8vVmFsaWRhciBxdWUgbGEgdWJpY2FjaW9uIGFjdHVhbGVzIHZhbGlkYSBwYXJhIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgLy9wY2FzdHJvLCBzZSBjb21lbnRhcmVhIHBvcnF1ZSBubyBmdW5jaW9uYSBjb24gdGYsIHJldG9ybmEgcGFyYSBURiBTSUVNUFJFIE5VTEwsIG5vIHNlIG1hbmVqYSB1YmljYWNpb25lc1xyXG4gICAgICAgICAgICAvL1NlIGNvbG9jYSBkaWYgYSAwLCBwb3IgdmVyc2lvbiBURiwgcXVlIG5vIHV0aWxpemEgZnVuY2lvbmFsaWRhZCBkZSBVYmljYWNpb25lc1xyXG4gICAgICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUudG9TdHJpbmcoKSAhPSBcIjBcIiAmJiBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZS50b1N0cmluZygpICE9IHNVYmljYWNpb24udG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1YmljRXh0ZXJubykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9tYSBlbCBwcm9jZXNvIHF1ZSB0aWVuZSBwb3IgZGluYW1pY2EgX0lETTNSZXRvbWFkbyBlbCBpZG0zIGVudmFpZG8gcG9yIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIHNJRE0zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNM1Byb2Nlc29zQnlJZE0zUmV0b21hZG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJRE0zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiaWRNM1JldG9tYWRvXCI6IHNJRE0zIH07XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9nZXRNM1Byb2Nlc29zQnlJZE0zUmV0b21hZG8vJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHByb2Nlc28gTTMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJZCBNMyB5IElkcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIHNJRE0zIFxyXG4gICAgICogQHBhcmFtIHNJZFByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gc1ViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zR2V0X00zUHJvY2Vzb3NCeUlkTTNBc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lETTM6IHN0cmluZyxcclxuICAgICAgICBzSWRQcm9jZXNvOiBzdHJpbmcsIHNVYmljYWNpb246IHN0cmluZywgYkFQTFBhZ29zUEQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiSWRNM1wiOiBzSURNMywgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbyB9O1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIGlmIChiQVBMUGFnb3NQRCkge1xyXG4gICAgICAgICAgICBvRGF0YS5iQVBMUGFnb3NQRCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvR2V0UHJvY2Vzb00zQnlJZE0zLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHByb2Nlc28gTTMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJZERpYXJpb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkRGlhcmlvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbTNfZ2V0UHJvY2Vzb00zQnlJZERpYXJpb0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZERpYXJpbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhO1xyXG4gICAgICAgIG9EYXRhID0geyBcImlkRGlhcmlvXCI6IGlkRGlhcmlvIH07XHJcbiAgICAgICAgdmFyIHJlc3A6IGFueSA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9tM19nZXRQcm9jZXNvTTNCeUlkRGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYSBlc3R1cmN0dXJhcyBkZSBsYXMgY2FwdHVyYXMgZGluYW1pY2FzIGFzb2NpYWRhcyBhdW4gcHJvY2VvcyB5IHVuIGlkcHJvY2Vzb1xyXG4gICAgcHVibGljIG0zX2dldF9kYXRhX2NhcHRfZGluYW0oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vL29EYXRhID0ge1wiaWRfcHJvY2Vzb1wiOlwiXCIsXCJpZF9zdWJfcHJvY2Vzb1wiOlwiXCJ9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9tM19nZXRfZGF0YV9jYXB0X2RpbmFtLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBSZXRvcm5hIGVsIFJQVGVtcGxhdGUgcGFyYSBlbCBhcm1hZG8gZGVsIFJlcG9ydGVcclxuICAgIC8vICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgLy8gICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgIC8vICAqIEBwYXJhbSBpZF9yZXAgXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBhc3luYyBnZXRfdGVtcGxhdGVfcmVwb3J0ZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcmVwOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICB2YXIgb0RhdGE7XHJcbiAgICAvLyAgICAgdmFyIHJlc3A7XHJcbiAgICAvLyAgICAgdmFyIG9Kc29uO1xyXG4gICAgLy8gICAgIG9EYXRhID0geyBcImlkX3JlcFwiOiBpZF9yZXAgfTtcclxuICAgIC8vICAgICB0cnkge1xyXG4gICAgLy8gICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL2dldF90ZW1wbGF0ZV9yZXBvcnRlLycgKyBpZF9rYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgIC8vICAgICAgICAgb0pzb24gPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gb0pzb247XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGNhdGNoe1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGxvcyBwcm9jZXNvcyBhc29jaWFkb3MgYSB1bmEgcGVyc29uYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNM0dldFByb2Nlc29CeVBlcnNvbmEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldFByb2Nlc29CeVBlcnNvbmEvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBNM0dldFByb2Nlc29CeUlkRGlhcmlvQ2llcnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRQcm9jZXNvQnlJZERpYXJpb0NpZXJyZS8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9jZXNvcyBPZmYgbGluZVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNM0dldFByb2Nlc29zT2ZmTGluZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0UHJvY2Vzb3NPZmZMaW5lLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvZW5hIGVsIFREZXRhbGxlUHJvY2VzbyBkZSB1biBwcm9jZXNvIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBvRGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZGV0YWxsZVByb2Nlc29CeVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvbTNfZGV0YWxsZVByb2Nlc29CeVByb2Nlc28vJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLkRldGFsbGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0ZW5jaWFQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy92YWxpZGFyRXhpc3RlbmNpYVByb2Nlc28vJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvUHJvZHVjdG86IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICBwdWJsaWMgUHJlY2lvVG90YWw6IG51bWJlcjsgLy9QcmVjaW8gaW5jbHV5ZW5kbyBsYXMgcHJvbW9jaW9uZXNcclxuICAgIHB1YmxpYyBQcmVjaW9Ub3RhbFByb21vY2lvbjogbnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yVG90YWxNb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBMaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICBwdWJsaWMgSURQcm9tb2Npb246IG51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU7XHJcbiAgICBwdWJsaWMgVmFsb3I7XHJcbiAgICBwdWJsaWMgVmFsb3JQb3JjZW50YWplID0gMDtcclxuICAgIHB1YmxpYyBMaXN0T2JzU0tVID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgIHB1YmxpYyBQcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSA9IG51bGw7XHJcbiAgICBwdWJsaWMgVmFsb3JNb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBJZEN1cG9uOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHVibGljIFJlZ2xhOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQXBsaWNhZGE6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgVGlwbzogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlZ2xhT2JzZXE6IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZE9ic2VxOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZmxhZ3MgPSB7IGZvcm1hUGFnbzogZmFsc2UgfTtcclxuICAgIHB1YmxpYyBsSWRBY3RpdmFQcm9tbzogQXJyYXk8bnVtYmVyPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb21vY2lvbkNvbWJpbmFkYSB7XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb25YUHJvY2VzbzogbnVtYmVyO1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uQ29tYmluYWRhOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwbzI6IHN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6IHN0cmluZztcclxuICAgIHB1YmxpYyBBY2Npb246IGFueTtcclxuICAgIC8vcHVibGljIElkQ29uZGljaW9uOnN0cmluZzsgLy9Fc3RvIHBhcmEgYWdydXBhY2lvbiBkZSBsYSBwcm9tb2Npb24gZGUgY29tYm8uXHJcbn0iLCJleHBvcnQgY2xhc3MgTWF0aFRGIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcm91bmQoYTogYW55LCBkZWNpbWFsczogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IG11bHRpcGxvRGUxMCA9IE1hdGgucG93KDEwLCBkZWNpbWFscyk7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoK2EgKiBtdWx0aXBsb0RlMTApIC8gbXVsdGlwbG9EZTEwO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDg8Kzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw4PCs24gZXN0YSBkaXNlw4PCsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDg8KxYWRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcyl7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob0xpc3RhUHJlY2lvW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9kdWN0byhvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWwsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTTNQcmRHZW5lcmFsW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGRlIHByb2R1Y3RvIGFncnVwYWRvLlxyXG4gICAgICogQHBhcmFtIG9UeXBlTTNQcmRHcnAgXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9kdWN0b1BSREdSUChvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvVHlwZU0zUHJkR3JwW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGFkaWNpb25hbCwgZXN0YSBpbmZvcm1hY2lvbiBhZGljaW9uYWwgZXN0YSBlbiB1bmEgdmFyaWFibGUgZ2xvYmFsOiBnb0RhdGFBZGljaW9uYWxcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9BZGljaW9uYWwoY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgIGlmICh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKHRoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiTU9EXCIgJiYgK3RoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10gPiArY29uZGljaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBjb250cmEgdXN1YXJpbyBkYXRhLlxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvVXNlckRhdGEoY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgIGlmICh0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXSAmJiB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXS5pbmNsdWRlcygnLCcpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXS5zcGxpdCgnLCcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGVsZW1lbnQsIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgY29udHJhIGVsIGRldGFsbGUgZGUgbGEgY29uZGljacODwrNuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sXHJcbiAgICAgICAgZGV0Q29uZGljaW9uZXM6IEFycmF5PE0zREVUQ09ORElQUk9NTz4sIGNvbmNlcHRvQ29uZGljaW9uOiBzdHJpbmcsIGpBZGljaW9uYWxlc0NvbmRpY2lvbikge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgb2RldENvbmRpY2lvbmVzRmluZGVkO1xyXG4gICAgICAgIHN3aXRjaCAoY29uY2VwdG9Db25kaWNpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tQMVwiOlxyXG5cclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDErMlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb1R5cGVNM1ByZEdycC5TS1AxICsgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5TS1AyKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tVXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tVLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfRElTUFwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRS50b1N0cmluZygpLCBkZXQuVmFsb3IudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9USVBPXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuVElQTy50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJQRVJfUFJPQ0VTT1wiOi8vKiBTb2xvIHZhbGlkYSB1bmEgZGV0Q29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyWFByb2Nlc286IE0zUGVyWFByb2Nlc287XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBwZXJYUHJvY2VzbyA9IG9NM1Byb2Nlc29zLk0zUGVyWFByb2Nlc28uZmluZCh4ID0+IHguVGlwb1BlcnNvbmEgPT0gZGV0Q29uZGljaW9uZXNbMF0uVmFsb3IudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkVOXCIgJiYgcGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIgJiYgIXBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBTE1BQ0VOXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJIT1JBUklPX0hPUkFcIjpcclxuICAgICAgICAgICAgICAgIHZhciBvVGltZU5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UaW1lTm93LmdldEhvdXJzKCkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiTG9NM1ByZEFkaWNpb25hbGVzXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0byAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZsckFkaSA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLkNvbmNlcHRvKS5WQUxPUlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBWbHJBZGkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAvL1Byb2Nlc29zXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVswXS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvTTNQcm9jZXNvc1twcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW3Byb3BlcnR5XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZXNwdWVzdGEsIGNvbiBvYmpldG8gYSB2YWxpZGFyXHJcbiAgICBwdWJsaWMgVmFsaWRhclJlc3B1ZXN0YShvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgakFkaWNpb25hbGVzO1xyXG4gICAgICAgIGlmIChvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKG9iamVjdFZhbGlkYXRlLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNSBBZ3JlZ2FyIHNlY2Npb24gZGUgdmFsaWRhY2lvbmVzLlxyXG4gICAgICAgICAgICB2YXIgYlJlc3AgPSB0aGlzLlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzKGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIGVudmlhIGVuIGFkaWNpb25hbGVzLCBlbCBqc29uIGRlIGxhIGluZm9ybWFjaW9uIGVuY29udHJhZGEgZGVsIGRldGFsbGUuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciByZWdsYXMgY29uZmlndXJhZGFzIGRlc2RlIEpTT04gZGUgQWRpY2lvbmFsZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXM6IGFueSkge1xyXG4gICAgICAgIHZhciBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXNcIilcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMgJiYgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVklHRU5DSUFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLlZhbGlkYXJWaWdlbmNpYShqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVkFMMSwgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipFcnJvclwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJWaWdlbmNpYSh2YWwxOiBEYXRlLCB2YWwyOiBEYXRlKSB7XHJcblxyXG4gICAgICAgIHZhciBGZWNoYUFjdHVhbCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwyKVxyXG5cclxuICAgICAgICAvLyB2YXIgZFZhbDEgPSBuZXcgRGF0ZSh2YWwxKTtcclxuICAgICAgICAvLyB2YXIgZFZhbDIgPSBuZXcgRGF0ZSh2YWwyKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDIpXHJcblxyXG5cclxuICAgICAgICB2YXIgbkZlY2hhQWN0dWFsOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcihGZWNoYUFjdHVhbCk7IC8vKyhGZWNoYUFjdHVhbC5nZXRGdWxsWWVhcigpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldE1vbnRoKCkgKyBcIlwiICsgRmVjaGFBY3R1YWwuZ2V0RGF0ZSgpKTtcclxuICAgICAgICB2YXIgblZhbDE6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDEpOyAvLysoZFZhbDEuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMS5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDEuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICB2YXIgblZhbDI6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDIpIC8vKyhkVmFsMi5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRWYWwyLmdldE1vbnRoKCkgKyBcIlwiICsgKCtkVmFsMi5nZXREYXRlKCkgKyAxKSApO1xyXG4gICAgICAgIGlmIChuRmVjaGFBY3R1YWwgPj0gblZhbDEgJiYgbkZlY2hhQWN0dWFsIDw9IG5WYWwyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRGZWNoYU51bWJlcihkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgYWNjaW9uLCBzaSBubyB0aWVuZSBjYXJnYWRhIHVuYS4gRXN0YSBhY2Npb24gc2UgY2FyZ2EgamVyYXJxdWljYW1lbnRlLlxyXG4gICAgcHVibGljIFZhbGlkYXJBY2Npb24oalJlc3AsIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqc29uQWRpYyA9IEpTT04ucGFyc2UoakFkaWNpb25hbGVzKTtcclxuICAgICAgICBpZiAoalJlc3AuQWNjaW9uID09IG51bGwgJiYganNvbkFkaWMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqc29uQWRpYy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvbWFyIGluZm9ybWFjacODwrNuIFxyXG4gICAgcHVibGljIFJldG9tYXJWYWxvcmVzUHJvbW9jaW9uKG9NM0VOQ1BST01POiBNM0VOQ1BST01PLCBqUmVzcCkge1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbiA9IHt9O1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5Ob21icmUgPSBvTTNFTkNQUk9NTy5Ob21icmU7XHJcbiAgICAgICAgalJlc3AuUHJvbW9jaW9uLklEID0gb00zRU5DUFJPTU8uSWRQcm9tb2Npb247XHJcbiAgICAgICAgLy9TaSBubyB0dXZvIG5pbmd1bmEgYWNjaW9uXHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IHsgXCJUaXBvMlwiOiBvTTNFTkNQUk9NTy5UaXBvMiwgXCJUaXBvXCI6IG9NM0VOQ1BST01PLlRpcG8gfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLy8gUmV0b21hciBkZXNkZSBlbCBlbmNhYmV6YWRvIHByb21vLCBzaSBubyBleGlzdGUgZWwgdGlwbyB5IFRpcG8yXHJcbiAgICAgICAgICAgIGlmICghalJlc3AuQWNjaW9uLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcC5BY2Npb24uVGlwbzIgPSBvTTNFTkNQUk9NTy5UaXBvMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcC5BY2Npb24uVGlwbyA9IG9NM0VOQ1BST01PLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FtaWVudG8gZGUgcHJvbW9jacODwrNuLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgYXBsaWNhciBsYSBwcm9tb2Npb24geSBsYXMgcHJvbW9jaW9uZXMgYSBhcGxpY2FyXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb2Npb24oSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICByZXR1cm4gdGhpcy5Qcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXMsIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgdmFyIG9MaXN0YVByb21vc0Fzb2MgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIG5QcmVjaW8sIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01PKTtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICAgICAgb0xpc3RhUHJvbW9zQXNvYy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuVmFsaWRhck1lam9yUHJvbW9jaW9uKG9MaXN0YVByb21vc0Fzb2MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG5QcmVjaW8pO1xyXG5cclxuICAgICAgICAvLyBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybztcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsIDwgMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvZG5lbyBkZSBsb3MgdmFsb3JlcyB0b3RhbGVzXHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjaW9uIGRlIG1lam9yIG9wY2lvbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyBwcm9tb2Npb25lcyBwcm9jZXNhZGFzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgTGlzdGEgZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgUHJvbW9jaW9uIHByb2Nlc2FkYSwgcXVlIHJldG9ybmFyw4PCoSBhIGZsdWpvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck1lam9yUHJvbW9jaW9uKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW86IG51bWJlcik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgbGV0IHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgIC8vU2kgZWwgcHJvZHVjdG8gZXN0YSByZXN0cmluZ2lkbyBsZSBkYSBtYXlvciBwcmlvcmlkYWQgYSBlc3RhIHByb21vY2nDg8KzblxyXG4gICAgICAgIGlmICghcHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgIC8vMS4gU3VtYSBkZSB0b2RhcyBsYXMgcHJvbW9jaW9uZXMgQWN1bXVsYWJsZXNcclxuICAgICAgICAgICAgLy92YXIgZFByb21vQUNNOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAvL2RQcm9tb0FDTSA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiQUNNXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vRVhDID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJFWENcIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIGxldCBkUHJvbW9BQ01ESU4gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTURJTlwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgLy9Qcm9tb2Npb25lcyBObyBBY3VtdWxhYmxlc1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcm9tb0FDTURJTiA8IGRQcm9tb0VYQykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcGxpY2FQcm9tb0VYQyhvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBkUHJvbW9FWEMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBkUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYy8vLnB1c2gob0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpKTtcclxuXHJcbiAgICAgICAgICAgIC8vUmVjb3JyZXIgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLy8vLy8vRlVOQ0lPTkFMSURBRCBQUk9EUklBIEZVTkNJT05BUiBNw4PCgVMgQURFTEFOVEUsIFNJIFNFIFFVSUVSRSBBR1JVUEFSIExBUyBQUk9NT0NJT05FUyBBQ00gWSBFWENcclxuICAgICAgICAgICAgLy8gaWYoZFByb21vQUNNID09IDAgJiYgZFByb21vRVhDID09IDApe1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZSBlbmNvbnRyYXJvbiBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgIGlmKGRQcm9tb0FDTSA+IGRQcm9tb0VYQyl7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGFjdW11bGF0aXZhcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikuZm9yRWFjaCh4ID0+IHguQXBsaWNhZGEgPSB0cnVlKTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYzsvLy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yTW9uZWRlcm8pLCAwKTtcclxuICAgICAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBleGNsdXllbnRlcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jLy8ucHVzaChvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykpO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgfVxyXG5cclxuICAgIGFwbGljYVByb21vRVhDKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vRVhDOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvbW9FeGM6IFByb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIGlmICh2YWxvclByb21vRVhDID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tb0V4YyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gdmFsb3JQcm9tb0VYQyB8fCB4LlZhbG9yTW9uZWRlcm8gPT0gdmFsb3JQcm9tb0VYQyk7XHJcbiAgICAgICAgICAgIHByb21vRXhjLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW9FeGMuVmFsb3JNb25lZGVybztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0FDTURJTjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9BQ01ESU4gPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYSA9PSBcIkFDTURJTlwiKSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW8uVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSB2YWxvclByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgdmFsb3JQcm9tb0FDTURJTik7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgbWF4aW1vIHZhbG9yIHNlZ3VuIGxhIHJlZ2xhIGEgY29tcGFyYXJcclxuICAgICAqIEBwYXJhbSBvTGlzdGFQcm9tb3NBc29jIFxyXG4gICAgICogQHBhcmFtIHNSZWdsYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIHNSZWdsYTogc3RyaW5nLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc1JlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQUNNXCI6XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVzdWx0ID0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAheC5mbGFncy5mb3JtYVBhZ28pLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBQ01ESU5cIjpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlY2lvQWN0dWFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JUb3RhbERlc2N1ZW50byA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01ESU5cIiAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uVmFsb3JQb3JjZW50YWplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAocHJlY2lvQWN0dWFsICogcHJvbW8uVmFsb3JQb3JjZW50YWplIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxvclRvdGFsRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkVYQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLlZhbG9yID4gby5WYWxvck1vbmVkZXJvID8gby5WYWxvciA6IG8uVmFsb3JNb25lZGVybzsgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb24gc2VndW4gZWwgdGlwbyBcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQnlUaXBvKHByb21vY2lvbjogYW55LCBQcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4pOiBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIEFjY2lvbjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBQcm9tb2Npb25lc0Fzb2NpYWRhcygpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5Qcm9tb2Npb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24gPSBwcm9tb2Npb24uUHJvbW9jaW9uLklEO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZSA9IHByb21vY2lvbi5Qcm9tb2Npb24uTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgQWNjaW9uID0gcHJvbW9jaW9uLkFjY2lvbjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb24uUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBBY2Npb24uUmVnbGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IFwiRVhDXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzI7XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPXyVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JQb3JjZW50YWplID0gK0FjY2lvbi5WYWxvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAoK1ByZWNpbykgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkRUT19FWEFDVFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAtICgrQWNjaW9uLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhT2JzZXEgPSBBY2Npb24uUmVnbGFPYnNlcTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQ2FudGlkYWRPYnNlcXVpb3Mob00zRU5DUFJPTU8sIEFjY2lvbi5PQlNFUVVJT1MsIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFsaWRhciBjYW50aWRhZCB2cyBjYW50aWRhZCBkZSBvYnNxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTU9ORURFUk9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICtBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vRlMgMjAxOTA4MjcgWWEgbm8gc2UgZ3VhcmRhIGVsIHZhbG9yIHRvdGFsIGRlbCBtb25lZGVybyBzaSBubyB1bmljYW1lbnRlIGVsIHBvcmNlbnRhamUuLi4gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yTW9uZWRlcm8gPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpICogKCgrQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDVVBPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JZEN1cG9uID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQUNUSVZBX1BST01PXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLmxJZEFjdGl2YVByb21vID0gQWNjaW9uLlZhbG9yLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJSRVNUUklDQ0lPTl9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJNT0RfQ0FOVElEQURcIjpcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy90aGlzLkFwbGljYXJSZWdsYU1vZENhbnRpZGFkKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcywgb1Byb21vY2lvblByb2Nlc2FkYSwgQWNjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5UaXBvID09IFwiQ09NQklOQURBXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhID0gbmV3IFByb21vY2lvbkNvbWJpbmFkYSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSA9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIgPSBBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLk5vbWJyZSA9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbiA9IEFjY2lvbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTywgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vY2lvbi5Gb3JtYVBhZ28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuZmxhZ3MuZm9ybWFQYWdvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sXHJcbiAgICAgICAgb2JzZXF1aW9zOiBBcnJheTxhbnk+LCBvUHJvbW9jaW9uZXNBc29jaWFkYXM6IFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEOiBudW1iZXIgPSAtMTtcclxuICAgICAgICAgICAgdmFyIFZhbG9yQ2FudFBSRFJlYWw6IG51bWJlciA9IHRoaXMuZ29EYXRhQWRpY2lvbmFsLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgVmFsb3JDYW50UFJEID0gK3guTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuQ2FudGlkYWRPYnNlcSA9IFZhbG9yQ2FudFBSRFxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgY2FtcG9zIGFkaWNpb25hbGVzIGVuIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zRU5DUFJPTU8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBcclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbjogYW55KSB7XHJcbiAgICAgICAgc3dpdGNoIChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJPQlNFUV9DSUVSUkVcIjpcclxuICAgICAgICAgICAgICAgIC8vQWdyZWdhciBDYW50aWRhZC5cclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHZhciBzVmFsb3JDYW50aWRhZDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JDYW50aWRhZCA9IHguTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DYW50aWRhZE9ic3EgPSBzVmFsb3JDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICAvLyBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGpBZGljOmFueSA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIC8vIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNsYXNpZmljYWNpb24gPSBqQWRpYy5ST09ULkFjY2lvbi5DYXJhY3RlcmlzdGljYTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQ09NQk9cIjpcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMgPSBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTlswXS5NM0NPTkRJUFJPTU8ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vY2lvbi5JRENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLklkQ29uZGljaW9uID0gcHJvbW9jaW9uLklEQ29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIENvbWJpbmFkYSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgIHB1YmxpYyBQcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvbW9Db21iaW5hZGFzVjIob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9jZXNhckNvbWJpbmFkYVwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1YyIENPTUJJTkFEQVxyXG4gICAgLyoqXHJcbiAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcyBkZSBNM1Byb2Nlc29zXHJcbiAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBNMyBQcm9jZXNvcywgZWwgY3VhbCBzZSByZWNvcnJlcsODwqEgbGEgaW5mb3JtYWNpb24gZGUgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAqL1xyXG4gICAgcHVibGljIFByb21vQ29tYmluYWRhc1YyKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICBsZXQgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsID0gXy5jbG9uZURlZXAoaW9NM1Byb2Nlc28uTTNFTkMpO1xyXG5cclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIHZhciBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhc1tpXTtcclxuICAgICAgICAgICAgdmFyIGVzQWN1bXVsYWJsZSA9IHRoaXMuR2V0RXNBY3VtdWxhYmxlUHJvbW8oY29tYmkpXHJcbiAgICAgICAgICAgIC8vL09idGVuZXIgdG9kb3MgbG9zIEVuY2FiZXphZG9zIHF1ZSBhcGxpY2FuIGEgbGEgcHJvbW9jaW9uIGEgbGEgcXVlIHNlIGVzdGEgaXRlcmFuZG9cclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IHRoaXMuR2V0RW5jYWJlemFkb0J5Q29tYmkoY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21iaS5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlczogMyBnYXNlb3NhcyBwb3IgJDUwMFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Qcm9jZXNhclByb21vT2JzcUNpZXJyZShsUHJlY2lvcywgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX1NVTVRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhck9ic2VxU3VtVG90YWwob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiLCBjb21iaSwgbFByZWNpb3MsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBUEFSQ0lBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZW5hckxpc3RhRW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGxDb21ibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFwbENvbWJvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbENvbWJvID0gdGhpcy5Qcm9tb2Npb25Db21iaW5hZGFDb21ibyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JUT1RBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9EX0FQTERFU0NcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWIsIGNvbWJpLCBpb00zUHJvY2VzbywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlcyBwYXJhIDJ4MSwgM3gxLCA0eDIsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTGlzdEVuY2FiICYmIG9MaXN0RW5jYWIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVlc3RhYmxlY2UgbGEgY2FudGlkYWQgb3JpZ2luYWwgcGFyYSBxdWUgbm8gc2UgcXVlZGUgZW4gdW4gYnV2bGUgaW5maW5pdG9cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1BFbmNPcmlnaW5hbGVzIG9mIGVuY0NvbkxhQ2FudGlkYWRPcmlnaW5hbCkge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRPcmlnaW5hbCA9IG9NM1BFbmNPcmlnaW5hbGVzLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNPcmlnaW5hbGVzLklEKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGNhbnRpZGFkT3JpZ2luYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9yZGVuYXJMaXN0YUVuYyhvbGlzdGFFbmM6IE0zUEVuY0l0ZW1zW10sIGVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgIGlmIChlc0FjdW11bGFibGUpIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUTkVUTycpLlZhbG9yKSAtICgrYS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpKTtcclxuICAgICAgICBlbHNlIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVCcpLlZhbG9yKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG4gICAgICAgIHZhciBjYW50aWRhZERlc2NQcm9tbzogbnVtYmVyID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxDb21wcmE6IG51bWJlciA9IGxQcmVjaW9zLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArIE51bWJlcihiLlBVTklUTkVUTyk7IH0sIDApO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcocHJlY2lvVG90YWxDb21wcmEpO1xyXG4gICAgICAgIGxldCBkZXNjQWN1bSA9IDA7XHJcbiAgICAgICAgbGV0IGRlc2NQcm9kQWN0dWFsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRlc2NQcm9kQWN0dWFsID0gKGxQcmVjaW9zW2ldLlBVTklUTkVUTyAvIHByZWNpb1RvdGFsQ29tcHJhKSAqIGNhbnRpZGFkRGVzY1Byb21vIC8vNDBcclxuICAgICAgICAgICAgZGVzY0FjdW0gKz0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIC8vIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gICAgIGlmIChsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPCBjYW50aWRhZERlc2NQcm9tbykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGNhbnRpZGFkRGVzY1Byb21vIC09IGxQcmVjaW9zW2ldLlBVTklUTkVUTztcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLT0gY2FudGlkYWREZXNjUHJvbW87XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IGRlc2NBY3VtIHx8IGNhbnRpZGFkRGVzY1Byb21vIDwgZGVzY0FjdW0pIHtcclxuICAgICAgICAgICAgLy9maW5kIGRlbCB1bHRpbW8gXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbmNvbnRyZSBkaWZlcmVuY2lhIGVuIHByb21vcyBjb21iaW5hZGFzOiBcIiArIGNhbnRpZGFkRGVzY1Byb21vICsgXCIgdnMgXCIgKyBkZXNjQWN1bSk7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyA9IGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyAtIChjYW50aWRhZERlc2NQcm9tbyAtIGRlc2NBY3VtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJPYnNlcVN1bVRvdGFsKHByb2R1Y3Rvc0FwbGljYVByb21vOiBNM1BFbmNJdGVtc1tdLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB2YWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZFByb2R1Y3RvQWN0dWFsID0gMTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbmNJdGVtIG9mIHByb2R1Y3Rvc0FwbGljYVByb21vKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgICAgICBsZXQgcFVuaXRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA8PSBjYW50aWRhZEFjdHVhbCkge1xyXG4gICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHBVbml0QWN0dWFsO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCsrO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IGVuY0l0ZW0uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBlbmNJdGVtLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdW1hVmFsb3JQcm9kdWN0b3MgKyBkaWZlcmVuY2lhID49IHZhbG9yUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIG9NM1Byb2Nlc29zLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHN1bWFWYWxvclByb2R1Y3RvcyAtIHZhbG9yUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIHZhbG9yQ29tYm8sIDEpO1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBvTTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcykge1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgcHJvZEhpam86IE0zUEVuY0l0ZW1zO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwcm9kUmV2aXNhZG8gb2YgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9kUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IHByb2RSZXZpc2Fkby5JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kSGlqbyA9IF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ocHJvZEhpam8sIHByb2RSZXZpc2Fkby5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChwcm9kSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhckFQcm9kdWN0b3NRdWl0YXJDb21iaShvTTNQcm9jZXNvLCBwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm9TdW1Ub3RhbChwcm9kdWN0b3NFbk0zUHJvY2VzbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMaXN0YVByZWNpb3MobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc0ZpbHRlciA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih5ID0+IHkuSUQgPT0gb0xpc3RFbmNhYltpXS5JRCkuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zRmlsdGVyLnB1c2goeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uIGRlIGNvbWJvLCB4IHByb2R1Y3RvcywgeSBwcm9kdWN0b3MsIC4uLiBuIHByb2R1Y3RvcyBcclxuICAgICAqIHBvciAkMTAwMFxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKiBAcGFyYW0gYkVzQWN1bXVsYWJsZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4sIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGxldCBmbGFnQXBsaWNvUHJvbW8gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbk51bWVyb0NvbmRpY2lvbmVzOiBudW1iZXIgPSArY29tYmkuQWNjaW9uLk51bUNvbmRpY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JQcm9tbyA9ICtjb21iaS5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBMaXN0Q29uZGljaW9uZXMgPSBuZXcgQXJyYXk8QXJyYXk8YW55Pj4oKTtcclxuICAgICAgICAgICAgdmFyIG1pbmltb0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcG9yY2VudGFqZVByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxTaW5Qcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG5OdW1lcm9Db25kaWNpb25lczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBjb25kaWNpb24gMS5cclxuICAgICAgICAgICAgICAgIHZhciBMaXN0UHJvbW9Db21iaTogQXJyYXk8TTNQRW5jSXRlbXM+ID0gdGhpcy5CdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYiwgaS50b1N0cmluZygpLCBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIExpc3RDb25kaWNpb25lcy5wdXNoKHRoaXMuR2V0TGlzdGFQcmVjaW9zKGxQcmVjaW9zLCBMaXN0UHJvbW9Db21iaSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRyYXJMaXN0YUNvbmRpY2lvbmVzQ29tYm8oTGlzdENvbmRpY2lvbmVzLCBvTGlzdEVuY2FiKTtcclxuICAgICAgICAgICAgaWYgKExpc3RDb25kaWNpb25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBlbCB2YWxvciBtZW5vciBkZSBsYXMgaXRlbXMgYWdyZWdhZGFzXHJcbiAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IExpc3RDb25kaWNpb25lc1swXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGorKykgey8vQ29taWVuemEgZGVzZGUgMSBwb3JxdWUgZWwgMCB5YSBzZSB2YWxpZG8gZW4gbGEgYW50ZXJpb3IgbGluZWFcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXNQcmVjaW9zOiBBcnJheTxhbnk+ID0gTGlzdENvbmRpY2lvbmVzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdNaW4gPSBpdGVtc1ByZWNpb3MubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdNaW4gPCBtaW5pbW9JdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IG5ld01pbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0xvcyBjb21ib3MgZGViZW4gcHJvY2VzYXJzZSBkZSBhIHVubyBwYXJhIHN1IGNvcnJlY3RvIGZ1bmNpb25hbWllbnRvXHJcbiAgICAgICAgICAgICAgICBpZiAobWluaW1vSXRlbXMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1vSXRlbXMgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjb3JyZSB0b2RvcyBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zIGRlIGxhIHByb21vIHBhcmEgc2FiZXIgY3VhbCBlcyBlbCB2YWxvciByb2FsIGRlIGxhIHByb21vXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5Qcm9tbyArPSArbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9DYWxjdWxhIGVsIHZhbG9yIGRlbCBwb3JjZW50YWplIGRlIGxhIHByb21vIGEgcGFydGlyIGRlbCBjYWxvciBkZWwgY29tYm8geSBkZSBsYSBzdW1hIGRlIGxvcyBwcmVjaW9zIG9yaWdpbmFsZXMgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICAgICAgICAgICAgcG9yY2VudGFqZVByb21vID0gMTAwIC0gKCtWYWxvclByb21vICogMTAwIC8gdmFsb3JUb3RhbFNpblByb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5mb3JFYWNoKHByZWNpbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlY2lvLkluZGljZSA9PSBlbmMuSW5kaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjaW8uUHJvbW9BcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSBwcmVjaW8uUFVOSVRORVRPO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Nb2RpZmljYSBlbCBwcmVjaW8gZGUgbG9zIHByb2R1Y3RvcyBhIHN1IG51ZXZvIHZhbG9yIGNvbiBsYSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IHZhbG9yIC0gKHZhbG9yICogcG9yY2VudGFqZVByb21vIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlByb21vQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJlY2lvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRW4gbGFzIHByb21vcyBwb3IgY29tYm8gbm8gYXBsaWNhbiBlbCBwcmVjaW8gZGUgbG9zIG90cm9zIHByb2R1Y3RvcyBxdWUgbm8gaGFjZW4gcGFydGUgZGVsIGNvbWJvIDopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xQcmVjaW9zLmZpbmQoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LkluZGljZSA9PSBlbmMuSW5kaWNlKS5QVU5JVE5FVE8gPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ0FwbGljb1Byb21vID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdBcGxpY29Qcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gY29tYmkuQWNjaW9uLkNvZGlnbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFwcm9kdWN0b1Byb21vQ29tYmlFeGlzdGVudGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8oaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIGNvbWJpLkFjY2lvbi5WYWxvciwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGltcGlhckVuY0l0ZW1QcmRDb25kaShvTGlzdEVuY2FiKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9tb2Npb25Db21iaW5hZGFDb21ib1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWdBcGxpY29Qcm9tbztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhsaXN0Q29uZGljaW9uZXM6IEFycmF5PGFueT4sIG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0Q29uZGljaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBudWV2YUNvbmRpY2lvbiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpY2lvbiBvZiBsaXN0Q29uZGljaW9uZXNbX2ldKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5jSXRlbSA9IG9NM1BFbmNJdGVtc0xpc3QuZmluZCh4ID0+IHguSUQgPT0gY29uZGljaW9uLklEKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA9IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA/IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldENhbnRpZGFkID4gZW5jSXRlbVtcIlByZENvbmRpXCJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51ZXZhQ29uZGljaW9uID0gW2NvbmRpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlzdENvbmRpY2lvbmVzW19pXSA9IG51ZXZhQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsaW1waWFyRW5jSXRlbVByZENvbmRpKG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIG9NM1BFbmNJdGVtc0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGVsZW1lbnRbXCJQcmRDb25kaVwiXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkID0gMSkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b1F1aXRhcjtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0gPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByb2R1Y3RvUXVpdGFyID0gb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9RdWl0YXIpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9RdWl0YXIuQ2FudGlkYWQgKz0gKC0xICogY2FudGlkYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLnB1c2goeyBJRDogb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8sIENhbnRpZGFkOiAoLTEgKiBjYW50aWRhZCkgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZ3JlZ2EgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGUgZW50cmFkYSBhIHVuIGFycmVnbG8gZGUgcHJvZHVjdG9zIHF1ZSBwb3N0ZXJpb3JtZW50ZSBzZXJhIGxvcyBwcm9kdWN0b3MgaGlqb3MgZGVsIHByb2R1Y3RvIENvbWJvXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3MocHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gdGhpcy5nZXRQcm9kdXRvUHJvbW9Db21ibyhvTTNQcm9jZXNvLk0zRU5DLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAvL0xhIGNhbnRpZGFkIGRpc21pbnV5ZSBwZXJvIGVzdGUgbW92aW1pZW50byBzZSByZXZlcnNhIGFsIHRlcm1pbmFyIGRlIHZhbGlkYXIgZXN0YSBwcm9tb1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIDEpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0Rpc21pbnV5ZSBlbiB1bm8gbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvIHkgcmV0b3JuYSB1biBjbG9uIGRlIGVzdGVcclxuICAgIGdldFByb2R1dG9Qcm9tb0NvbWJvKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBlbiBoYXNobWFwIGRlIHByZWNpb3NcclxuICAgICAqIEBwYXJhbSBobWxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIElEIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkdG9IbVByZWNpb3MoaG1sUHJlY2lvczogQXJyYXk8YW55PiwgSUQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBmaW5kZWQ6IGFueSA9IGhtbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gSUQpO1xyXG4gICAgICAgIGlmIChmaW5kZWQpIHtcclxuICAgICAgICAgICAgZmluZGVkLkluZGljZSA9ICtmaW5kZWQuSW5kaWNlICsgKzE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmluZGVkID0geyBcIklEXCI6IElELCBcIkluZGljZVwiOiAwIH07XHJcbiAgICAgICAgICAgIGhtbFByZWNpb3MucHVzaChmaW5kZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluZGVkLkluZGljZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1c2NhciBlbmNhYmV6YWRvcyBxdWUgdGVuZ2EgbGEgcHJvbW9jaW9uIHkgY29uZGljaW9uIGVudmlhZGEgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIElkQ29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGlkUHJvbW9jaW9uZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBJZENvbmRpY2lvbjogc3RyaW5nLCBpZFByb21vY2lvbmVzOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0VuY0ZpbmRlZCA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUpXHJcbiAgICAgICAgICAgICAgICBpZiAoIW9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlIHx8ICEob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXQgJiYgZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9zOiBBcnJheTxhbnk+ID0gSlNPTi5wYXJzZShkZXQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9GaW5kZWQgPSBwcm9tb3MuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gaWRQcm9tb2Npb25lcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGljaW9uRmluZGVkID0gcHJvbW9GaW5kZWQuQWNjaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQuZmluZCh4ID0+IHggPT0gSWRDb25kaWNpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCA9PSBJZENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0VuY0ZpbmRlZC5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvRW5jRmluZGVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw4PCs24gc2kgbGEgcHJvbW9jacODwrNuIHF1ZSBsbGVnYSBjb21vIHBhcmFtZXRybywgZXMgYWN1bXVsYWJsZSBvIG5vXHJcbiAgICAgKiBAcGFyYW0gcHJvbW9jaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0RXNBY3VtdWxhYmxlUHJvbW8ocHJvbW9jaW9uOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbi5SZWdsYSAmJiBwcm9tb2Npb24uQWNjaW9uLlJlZ2xhID09IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRFc0FjdW11bGFibGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb2R1Y3RvQXBsRGVzYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGxldCBwcm9kc0FwbERlc2N1ZW50bzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHNrdUFwbERlc2N1ZW50b3M6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uc2t1QXBsRGVzYzsgLy9be1NLVTpcIlhYWFhYWFwifSwge1NLVTpcIllZWVlZWVlcIn1dXHJcbiAgICAgICAgbGV0IG1heE51bURlc2N1ZW50b3MgPSArY29tYmkuQWNjaW9uLm1heE51bURlc2M7XHJcbiAgICAgICAgbGV0IGNvbnREZXNjQXBsaWNhZG9zID0gMDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9DYWxjdWxhIGVsIG51bWVybyBtYXhpbW8gZGUgZGVzY2luZXRvcyBxdWUgcHVlZGUgYXBsaWNhciBsYSBwcm9tbyBxdWUgZXMgY29tYmkuQWNjaW9uLm1heE51bURlc2MgbXVsdGlwbGljYWRvIHBvciBsYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHBhbGljYW4gbGEgcHJvbW8gZW4gZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICBtYXhOdW1EZXNjdWVudG9zID0gb0xpc3RFbmNhYi5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgfSwgMCkgKiBtYXhOdW1EZXNjdWVudG9zO1xyXG5cclxuICAgICAgICAgICAgLy9EZSBsb3MgcHJvZHVjdG9zIGRlbCBwcm9jZXNvIGZpbHRybyBsb3MgcHJvZHVjdG9zIHF1ZSBhcGxpY2FyYW4gZWwgZGVzY3VlbnRvIHNlZ3VuIGxvcyBTS1UgY29uZmlndXJhZG9zIGVuIGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLk0zRU5DLmZvckVhY2gob00zUEVuY0l0ZW1zID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChza3VBcGxEZXNjdWVudG9zLmZpbmQoeCA9PiB4LlNLVSA9PSBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bykpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kc0FwbERlc2N1ZW50by5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy9Dw4PCoWxjdWxvIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcyBkZSBsb3MgcHJvZHVjdG9zIGEgbG9zIHF1ZSBsYSBwcm9tbyBhcGxpY2FyYSBkZXNjdWVudG9cclxuICAgICAgICAgICAgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhwcm9kc0FwbERlc2N1ZW50bywgZXNBY3VtdWxhYmxlKTtcclxuXHJcbiAgICAgICAgICAgIC8vQXBsaWNhIHRhbnRvcyBkZXNjdWVudG9zIHNlIHB1ZWRhbiBhIHBsYWljYXIgYSBjYWRhIHZhbG9yIGRlIGxQcmVjaW9cclxuICAgICAgICAgICAgd2hpbGUgKGNvbnREZXNjQXBsaWNhZG9zIDwgbWF4TnVtRGVzY3VlbnRvcyAmJiBjb250RGVzY0FwbGljYWRvcyA8IGxQcmVjaW9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcysrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1JlY2FsY3VsYSBsb3MgdmFsb3JlcyBkZWwgcHJvZHVjdG8gYXBsaWNhbmRvIGVsIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHNBcGxEZXNjdWVudG8sIGNvbWJpLCB0cnVlLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3MgZW4gZWwgY2llcnJlXHJcbiAgICAgKiBWYWxpZGEgdG9kYSBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAqIFZhbGlkYSBsYSBwcm9tb2Npw4PCs24sIHBvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MsIGN1w4PCoW50b3Mgb2JzZXF1aW9zIHNlIHB1ZWRlbiBkYXIuXHJcbiAgICAgKiBUcmFlIHRvZG9zIGxvcyBvYnNlcXVpb3MgcXVlIHNlIGluZ3Jlc2Fyb24gZW4gZWwgY2Fycml0byBkZSBjb21wcmFzLCBsb3MgbGlzdGFcclxuICAgICAqIGNvbG9jYSBlbiB2YWxvciAwIGxvcyBvYnNlcXVpb3MgcXVlIHNlbGVjY2lvbm8gYXV0b21hdGljYW1lbnRlIGVsIGFsZ29yaXRtb1xyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MsIGltcHVlc3RvcyB5IGRlbWFzIHZhbG9yZXMgdG90YWxlcy5cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGxvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcyBhbCBjYXJyaXRvIHF1ZSB0aWVuZW4gb2JzZXF1aW9cclxuICAgICAqIEBwYXJhbSBjb21iaSBJbmZvcm1hY2nDg8KzbiBkZSBwcm9tb2Npw4PCs24gZGUgb2JzZXF1aW9zXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gUHJvY2VzbyBjb24gdG9kb3MgbG9zIHByb2R1Y3RvcyBlIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb09ic3FDaWVycmUob0xpc3RFbmNhYjogQXJyYXk8YW55PiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlvTTNQcm9jZXNvWydQcm9kdWN0b3NDb21iaSddID0gW107XHJcbiAgICAgICAgbGV0IGNhbnRQb3JPYnMgPSArY29tYmkuQWNjaW9uLkNhbnRpZGFkT2JzcTsgLy9Qb3IgY2FkYSBjdWFudG9zIHByb2R1Y3RvcyBjb24gbGEgcHJvbW9jacODwrNuIHNlIGRhcsODwqEgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgbGV0IGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgbGV0IHN1bWFWYWxvclByb2R1Y3RvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkT2JzZXF1aW9zID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgbTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zQ2FudGlkYWQgPSAwXHJcbiAgICAgICAgLy8gdmFyIGNhbnRPYnNlcXVpb3M6IG51bWJlciA9IDA7IC8vQ2FudGlkYWQgZGUgb2JzZXF1aW9zIHF1ZSBzZSBkYXLDg8KhIHBvciBlc3RhIGNvbXByYS5cclxuXHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjdG8gb2Ygb0xpc3RFbmNhYikge1xyXG4gICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcHJvZHVjdG8uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICBjYW50QWdyZWdhZGErKztcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gcHJvZHVjdG8uSUQpO1xyXG4gICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9SZXZpc2Fkby5DYW50aWRhZCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zLnB1c2goeyBJZDogcHJvZHVjdG8uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FudEFncmVnYWRhID09PSBjYW50UG9yT2JzKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZE9ic2VxdWlvcysrO1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICBjYW50QWdyZWdhZGEgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG0zUmVnU2VydmljZS5hcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIHByb2R1Y3RvQ29tYm8sIGNhbnRpZGFkT2JzZXF1aW9zKTtcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc29bXCJvTTNSZWdTZXJ2aWNlXCJdID0gbTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwbGljYXIgcmVnbGFzLCByZXNwZWN0byBhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYS5cclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyBcclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAqL1xyXG4gICAgcHVibGljIEFwbGljYXJSZWdsYU1vZENhbnRpZGFkKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IEFjY2lvbi5DYW50aWRhZDsgLy9FamVtcGxvIDogM1xyXG4gICAgICAgIC8vdmFyIGlDYW50aWRhZEFQTFByb21vOiBudW1iZXI7IC8vTnVtZXJvIHJlYWwgZGUgYXBsaWNhY2lvbiBkZSBwcm9tb2Npb25lcywgU2kgYXBsaWNhIHJlc3RhIGVsIHJlc2lkdW8uXHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlcjsgLy9DYW50aWRhZCByZWFsIGluZ3Jlc2FkYS5cclxuICAgICAgICB2YXIgVmFsb3JQcm9tbzogbnVtYmVyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIHZhciB2YWxvclByb21vVW5pdDogbnVtYmVyID0gKCtWYWxvclByb21vKSAvICgraUNhbnRpZGFkUHJvbW8pXHJcbiAgICAgICAgaUNhbnRpZGFkUmVhbCA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgPj0gaUNhbnRpZGFkUHJvbW8pIHsgLy9KQUdNIDIwMTkwNDI2IFNFIENBTUJJQSwgQU5URVMgRVNUQUJBIExBIEZVTkNJT05BTElEQUQgREUgQ0FOVElEQUQgUkVBTCBWUyBDQU5USURBRCBQUk9NT0NJT04uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9pQ2FudGlkYWRBUExQcm9tbyA9IGlDYW50aWRhZFJlYWwgLyBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICBpQ2FudGlkYWRSZWFsID0gaUNhbnRpZGFkUmVhbCAtIFJlc2lkdW87XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlDYW50aWRhZFJlYWw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA+IHZhbG9yUHJvbW9Vbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gdmFsb3JQcm9tb1VuaXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJBcGxpY2FyUmVnbGFNb2RDYW50aWRhZFwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBjb21iaW5hZGFzIGRlc2RlIGRpbmFtaWNhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgc0NvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgb0NvbWJpbmFkYSA9IEpTT04ucGFyc2Uoc0NvbWJpbmFkYSk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID0gb0NvbWJpbmFkYTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhciBwcm9tb2Npb25lcywgc2VndW4gbGEgbGlzdGEgZGUgcHJlY2lvcyBkaXZpZGlkYS5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBkZSBwcmVjaW9zLCBjb250cmEgZXN0ZSBvYmpldG8gc2UgaXRlcmFyw4PCoSB5IHNlIG9yZGVuYXLDg8KhIGRlIG1heW9yIGEgbWVub3JcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAgICAgdmFyIGl4OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBpeTogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgICAgICB2YXIgeTogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMF0gLSAoK3gpO1xyXG4gICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgYkVudHJvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgcmVzaWR1b1ggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgICAgICAgICAgeCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vU2UgaXRlcmEgZWwgYXJyZWdsbyBkZSBwcmluY2lwaW8gYSBmaW4geSBkZSBmaW4gYSBwcmluY2lwaW8uLi4gXHJcbiAgICAgICAgLy8vQ29uZm9ybWUgc2UgcmVjb3JyZSBlbCBhcnJlZ2xvIGRlIGZpbiBhIHByaW5pY2lvLCBzZSB2YSBkYW5kbyBsYSBwcm9tb2Npw4PCs24gYSBsb3MgcHJvZHVjdG9zIGRlIG1lbm9yIHZhbG9yLlxyXG4gICAgICAgIC8vL1NpIGxhIHByb21vY2nDg8KzbiBlc3RhIGluY29tcGxldGEsIGxvcyBwcm9kdWN0b3MgZGUgbGEgbWl0YWQgcXVlZGFuIHNpbiBwcm9tb2Npw4PCs24gXHJcbiAgICAgICAgdmFyIGk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGogPSArbFByZWNpb3MubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBsUHJlY2lvcy5sZW5ndGggJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaXggPSAwO1xyXG4gICAgICAgICAgICAgICAgaXkgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeCA8IHgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaXgrKztcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXkgPCB5ICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2pdLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl5Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgai0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAgICAgICAgIC8vSkdBTSAyMDE5MTAyMywgZnVuY2lvbmFsaWRhZCBkZSBxdWUgc29sbyBlbnRyYSBhY8ODwqEgY3VhbmRvIHNlIGNhbWJpbyBhbGd1biBwcmVjaW9cclxuICAgICAgICAgICAgaWYgKGJFbnRybykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBmYWxzZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgLy8gICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLlNldFZhbG9yUHJvbW9jaW9uZXMoZW5jKTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuQWdyZWdhckxpc3RhUHJvbW8oZW5jLCBjb21iaSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByZWNpbyB0b3RhbCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MgYSB0ZW5lciBlbiBjdWVudGFcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgUHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJBcGxWYWxpZGE6IGJvb2xlYW4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICB2YXIgZFZhbG9yUHJvbW9BbnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy92YXIgZFZhbG9yUHJvbW9BbnRBY3VtOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVmFsb3JBY3Q6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9OdWV2byA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgICAgICAgICB2YXIgcHJlY2lvVG90YWxBbnRlcmlvcjtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxBbnRlcmlvciA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxOCBTRSBRVUlUQSBWQUxJREFDSU9OLCBQT1IgRkxVSk8gUVVFIFNJIFNFIERFVlVFTFZFIFRSQUUgTEEgUFJPTU8sIFBFUk8gU0kgU0UgQk9SUkEuIGlmIChkUHJlY2lvTnVldm8gPCBwcmVjaW9Ub3RhbEFudGVyaW9yKSB7IC8vIFNlIGFncmVnYSB2YWxpZGFjaW9uIGRlIHByZWNpbywgcGFyYSBlc2NvZ2VyIGVsIG1lam9yLiBObyBwdWVkZW4gYSB2ZXIgMiBwcm9tb2Npb25lcy5cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gZFByZWNpb051ZXZvO1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFJFQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vTGltcGlhciBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvcywgZW5jKSB8fCAhYkFwbFZhbGlkYSkgJiYgIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIC8vIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGRWYWxvckFjdCA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9IHRoaXMuR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zLCBlbmMpO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gdGhpcy5HZXRWYWxvclByb21vQUN0KGVuYywgZFZhbG9yUHJvbW9BbnQsIGRQcmVjaW9OdWV2bywgcHJlY2lvVG90YWxBbnRlcmlvciwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2UgYWdyZWdhIHBhcmEgcHJvbW9jaW9uZXMgYWN1bXVsYWJsZXMuIGFjdW11bGFiXHJcbiAgICAgICAgICAgICAgICBpZiAoIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IGRWYWxvclByb21vQW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRXMgYWN1bXVsYWJsZSwgdXRpbGl6YXIgbGEgaW5mb3JtYWNpw4PCs24gXHJcbiAgICAgICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvciAtIHByZWNpb1RvdGFsQW50ZXJpb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMsIGRWYWxvckFjdCArIGRWYWxvclByb21vQW50KTtcclxuICAgICAgICAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpLCBkVmFsb3JBY3QpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYywgZFByZWNpb051ZXZvKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9NT0NfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST19DT01CSV9cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW8gdW5pdGFyaW8sIGEgcGFydGlyIGRlIHVuIG51ZXZvIHByZWNpbyBUb3RhbC5cclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gbmV3UHJpY2UgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmM6IE0zUEVuY0l0ZW1zLCBuZXdQcmljZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA9ICgrbmV3UHJpY2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1biBwcm9kdWN0byBzZSBjYW1iaWFyb24gbyBuby5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBjb24gdG9kb3MgbG9zIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIC8vQ2hlY2ssIHNpIGFsZ3VubyBkZSBsYSBsaXN0YSBkZSBwcmVjaW8gZXMgaWd1YWwgYWwgcHJlY2lvIGFudGVyaW9yXHJcbiAgICAgICAgdmFyIHByZWNpb0FudGVyaW9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZpbmQoeCA9PiB4LlBVTklUTkVUTyA9PSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIGlmIChwcmVjaW9BbnRlcmlvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvcmVzIGRlIHByb21vY2lvbmVzIGRlcGVuZGllbmRvIGRlbCBudW1lcm8gZGUgaXRlbXMgcXVlIG5vIHNlIG1vZGlmaWNhcm9uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRWYWxvciA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG51bWVyb0l0ZW1zID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBkVW5pdFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtudW1lcm9JdGVtcyAqICtkVW5pdFByb21vO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIGRlIGxhIHByb21vY2lvbiBxdWUgc2UgZXN0YSBwcm9jZXNhbmRvIGFjdHVhbG1lbnRlXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIHZhbG9yUHJvbW9BbnQgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3RUb3RhbE51ZXZvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FDdChlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vQW50OiBudW1iZXIsIHZhbG90VG90YWxOdWV2bzogbnVtYmVyLCBwcmVjaW9Ub3RhbEFudDogbnVtYmVyLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yVG90YWxTaW5EdG86IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW9BY3Q6IG51bWJlcjtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNpIHZpZW5lIGFjdW11bGFibGUgdXRpbGl6YXIgZWwgcHJlY2lvIGFudGVyaW9yLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgZHRvLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9IHByZWNpb1RvdGFsQW50O1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG9yUHJvbW9BbnQgLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbG9yUHJvbW9BY3Q7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRWYWxvclByb21vQUN0OiBcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXMoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tbzogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vRlMgMjAxOTA3MjUgUmVkb25kZW8gZGVsIHZhbG9yIGRlIHByb21vY2lvblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IChNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MTggU2UgYWdyZWdhIGVsIHZhbG9yIHVuaXRhcmlvIGRlIGxhIHByb21vY2nDg8KzblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvciA9ICgrKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vICAvKipcclxuICAgIC8vICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgIC8vICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lc0Zyb21MaXN0YVByZWNpb3MoZW5jOiBNM1BFbmNJdGVtcywgbFByZWNpb3M6IEFycmF5PGFueT4pIHtcclxuICAgIC8vICAgICB0cnkge1xyXG4gICAgLy8gICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEICYmIHguUFVOSVRORVRPID09IGRWYWxvcilcclxuICAgIC8vICAgICB9IGNhdGNoe1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlY0JldGEobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgLy8gICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgIC8vICAgICAgICAgdmFyIGlTaXplUHJlYzogbnVtYmVyID0gbFByZWNpb3MubGVuZ3RoO1xyXG4gICAgLy8gICAgICAgICB2YXIgaU1pdGFkOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgLy8gICAgICAgICB2YXIgeTogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMF0gLSAoK3gpO1xyXG4gICAgLy8gICAgICAgICB2YXIgaUR0bzogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgcmVzaWR1b1ggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgaU1pdGFkID0gKCt5KSAvICgraVNpemVQcmVjKTtcclxuICAgIC8vICAgICAgICAgaU1pdGFkID0gTWF0aC5jZWlsKCgraU1pdGFkKSAqICgreCkpIC0gMTtcclxuXHJcbiAgICAvLyAgICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG5cclxuICAgIC8vICAgICAgICAgdmFyIGlYID0gMDtcclxuICAgIC8vICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGlEdG8gPSBpTWl0YWQ7XHJcbiAgICAvLyAgICAgICAgICAgICB3aGlsZSAoaUR0byA8IGlTaXplUHJlYykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZShpWCA8IHgpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpWCsrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIGlYID0gMDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgLy8gICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBsaXN0YSBkZSBkZXRhbGxlIGVsOiAgTk9NQl9QUk9NT0MsIFZBTF9QUk9NT0MgeSBJRF9QUk9NT0NcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZ3JlZ2FyTGlzdGFQcm9tbyhlbmM6IE0zUEVuY0l0ZW1zLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBkVmFsb3JQcm9tb0NvbWJpOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGV0Tm9tYnJlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRWYWxvcmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldElkczogc3RyaW5nO1xyXG5cclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc05hbWVzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc1ZhbHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zSWRzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpO1xyXG5cclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtc05hbWVzKSB7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5Ob21icmVDb25jZXB0byA9IFwiTk9NQl9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5Ob21icmVDb25jZXB0byA9IFwiVkFMX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuTm9tYnJlQ29uY2VwdG8gPSBcIklEX1BST19DT01CSVwiXHJcblxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gXCJcIlxyXG5cclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc05hbWVzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zVmFscylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc0lkcylcclxuXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yICsgY29tYmkuTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgKyBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgKyBkVmFsb3JQcm9tb0NvbWJpLnRvU3RyaW5nKCkgKyBcIixcIjtcclxuXHJcbiAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDg8KzblxyXG4gICAgICAgIGxldCBsaXN0Tm9tYnJlID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0SWQgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0VmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvci5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9fQ09NQklfXCIgKyBfaSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShlbmMuTTNERVQsIGxpc3ROb21icmVbX2ldLCBcIklEX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiVkFMX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShhcnJheURpbmFtaWNhczogQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPiwgbm9tYnJlRGluYW1pY2E6IHN0cmluZywgVmFsb3JEaW5hbWljYTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9NM1BEZXRhbGxlSXRlbXMgPSBhcnJheURpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBub21icmVEaW5hbWljYSk7XHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gbm9tYnJlRGluYW1pY2E7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBWYWxvckRpbmFtaWNhO1xyXG4gICAgICAgICAgICBhcnJheURpbmFtaWNhcy5wdXNoKG9NM1BEZXRhbGxlSXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgbGlzdGEgZGUgZW5jYWJlemFkb3MsIHF1ZSBhcGxpY2FuIGEgbGEgbGlzdGEgY29tYmluYWRhIHF1ZSB0aWVuZVxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Db21iaW5hZGEgT2JqZXRvIGRlIHByb21vY2lvbiBjb21iaWFuZGFcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gZGUgTTNQcm9jZXNvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0RW5jYWJlemFkb0J5Q29tYmkob1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgIG9MaXN0RW5jYWIgPSBpb00zUHJvY2Vzby5NM0VOQy5maWx0ZXIoZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuUHJvbW9Db21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFByb21vQ29tYmluYWRhRU5DKGVuYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIShlbmMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgJiYgK2VuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTEyMDggc2UgY2FtYmlhIHZhbGlkYWNpb24sIHBhcmEgcXVlIHRlbmdhIGVuIGN1ZW50YSBjdWFscXVpZXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdEVuY2FiO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNldFByb21vQ29tYmluYWRhRU5DKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyA9IEpTT04ucGFyc2Uob00zUERldGFsbGVJdGVtcy5WYWxvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXIgbGlzdGEgZGUgcHJlY2lvcyB5IGlkIGRlIGVuY2FiZXphZG8sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBsaXN0YSBkZSBlbmNhYmV6YWRvc1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcm9jZXNhclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLy9EZXNBY29wbGFyIGxpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgdmFyIGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgbkNhbnRpZGFkOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgICAgICBuQ2FudGlkYWQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHZhbGlkYSBzaSBsYSBwcm9tb2Npb24gZXMgYWN1bXVsYWJsZS5cclxuICAgICAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3JcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbkNhbnRpZGFkOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAvLyAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgLy8gICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgIC8vICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgLy8gICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAvLyAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgLy8gICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgLy8gICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgLy8gICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgLy8gfVxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0ZJTiBWMiBDT01CSU5BREFcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFByb2Nlc2FyQ29tYmluYWRhWHBvcllcclxuICAgICogUHJvY2VzYXIgcHJvbW9jaW9uIGNvbWJpbmFkYSBxdWUgc2UgbGxldmFuIHggcHJvZHVjdG9zIHBvciBlbCBwcmVjaW9uIGRlIHkgcHJvZHVjdG9zLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhckNvbWJpbmFkYVhwb3JZKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBtM0VuY0FncmVnYWRvOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHZhciBtM0VuY3NDb25Qcm9tbzogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIHZhciBtM0NvbWJpbmFkYXhQcm9jZXNvOiBNM1Byb21Db21iaW5hZGFYUHJvY2VzbztcclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gYWdyZWdhZG8sIHRpZW5lIHVuYSBtaXNtYSBwcm9tb2Npb24gYWN0aXZhIGVuIGxhIGZhY3R1cmEuXHJcbiAgICAgICAgLy8gaWYgKG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5sTTNQcm9tQ29tYmluYWRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyAgICAgbTNDb21iaW5hZGF4UHJvY2VzbyA9IG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEuZmluZChjb21iaW5hZGFzID0+IGNvbWJpbmFkYXMuSWRQcm9tb2Npb24gPT0gbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25Db21iaW5hZGEgJiYgY29tYmluYWRhcy5UZXJtaW5hZGEgPT0gZmFsc2UpO1xyXG4gICAgICAgIC8vICAgICAvL1ZhbGlkYSBzaSB5YSBleGlzdGUgdW4gcHJvY2Vzby5cclxuICAgICAgICAvLyAgICAgaWYgKG0zQ29tYmluYWRheFByb2Nlc28gIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9IG0zQ29tYmluYWRheFByb2Nlc28uSWRQcm9tb2Npb25YUHJvY2VzbztcclxuICAgICAgICAvLyAgICAgICAgIC8vVHJhZSBsb3MgRW5jYWJlemFkb3MgY29uIGxhIHByb21vY2lvbiBcclxuICAgICAgICAvLyAgICAgICAgIG0zRW5jc0NvblByb21vID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuY3MgPT4gZW5jcy5Qcm9tb0NvbWJpbmFkYXMgIT0gbnVsbCAmJiBlbmNzLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzWzBdLklkUHJvbW9jaW9uWFByb2Nlc28gPT0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvKTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByb21vWFBvclkobTNFbmNzQ29uUHJvbW8sIG0zQ29tYmluYWRheFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEgPSBuZXcgQXJyYXk8TTNQcm9tQ29tYmluYWRhWFByb2Nlc28+KCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuQWdyZWdhclByb21vY2lvbkNvbWJpbmFkYUFQcm9jZXNvKG9NM1Byb2Nlc29zLCBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3JlY2FsY3VsYXIgcHJvbW9jaW9uLCBkZXBlbmRpZW5kbyBkZSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgZW5jYWJlemFkb3MuXHJcbiAgICAvLzEuVmFsaWRhciBzaSB5YSBlc3RhbiB0b2RvcyBsb3MgaXRlbXMgcGFyYSByZWNhbGN1bGFyIGxhIHByb21vY2lvblxyXG4gICAgLy8yLiBPcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBkZSBtYXlvciBhIG1lbm9yIHByZWNpby5cclxuICAgIC8vMy4gRGVqYXIgZWwgcHJlY2lvIGRlIGxvcyBpdGVtcyBkZSBtZW5vciBwcmVjaW9uIGVuIDBcclxuICAgIC8vIHB1YmxpYyBSZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBtM0NvbWJpbmFkYXhQcm9jZXNvOiBNM1Byb21Db21iaW5hZGFYUHJvY2Vzbykge1xyXG4gICAgLy8gICAgIHZhciBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGE7XHJcbiAgICAvLyAgICAgdmFyIHZhcng6IG51bWJlcjtcclxuICAgIC8vICAgICB2YXIgdmFyeTogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciBwYXJ0ZURlY1k6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb1Byb21vY2lvbkNvbWJpbmFkYSA9IG0zRW5jc0NvblByb21vWzBdLlByb21vQ29tYmluYWRhc1swXTtcclxuXHJcbiAgICAvLyAgICAgdmFyeCA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzBdKTtcclxuICAgIC8vICAgICB2YXJ5ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMV0pO1xyXG5cclxuICAgIC8vICAgICBpZiAoU3RyaW5nKHZhcnkpLmluY2x1ZGVzKFwiLlwiKSkge1xyXG4gICAgLy8gICAgICAgICBwYXJ0ZURlY1kgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXS5zcGxpdChcIi5cIilbMV0pO1xyXG4gICAgLy8gICAgICAgICB2YXJ5ID0gcGFyc2VGbG9hdChTdHJpbmcodmFyeSkuc3BsaXQoXCIuXCIpWzBdKTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGlmICh2YXJ4ID09IG0zRW5jc0NvblByb21vLmxlbmd0aCkge1xyXG4gICAgLy8gICAgICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvLlRlcm1pbmFkYSA9IHRydWU7XHJcbiAgICAvLyAgICAgICAgIC8vT3JkZW5hciBsb3MgZW5jYWJlemFkb3MgcG9yIHByZWNpbyBtYXlvciBhIG1lbm9yXHJcbiAgICAvLyAgICAgICAgIG0zRW5jc0NvblByb21vID0gbTNFbmNzQ29uUHJvbW8uc29ydCgoYSwgYikgPT5cclxuICAgIC8vICAgICAgICAgICAgIChhLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IDEgOlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICgoYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPCBhLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcikgPyAtMSA6IDApKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbTNFbmNzQ29uUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vVmFsaWRhIHNpIHlhIFxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHBhcnRlRGVjWSAhPSAwICYmICgraSkgPT0gKCt2YXJ5KSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcnRlRGVjWSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbTNFbmNzQ29uUHJvbW9baV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gKCgrbTNFbmNzQ29uUHJvbW9baV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSAqICgrKCtwYXJ0ZURlY1kpIC8gMTAwKSkudG9TdHJpbmcoKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCtpKSArIDEgPiB2YXJ5KSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbTNFbmNzQ29uUHJvbW9baV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gXCIwXCI7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB0b3RhbCBkZSBwdW50b3MgZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRyYW5zYWNjacODwrNuIHJlZG9uZGVhZG9zIGhhY8ODwq1hIGFiYWpvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfdG90YWxfZmlkZWxpemFjaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsX2ZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0b3RhbF9maWRlbGl6YWNpb24gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkZJREVMSVpBQ0lPTlwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCgoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJGSURFTElaQUNJT05cIikuVmFsb3IpIC8gMTAwKSAqICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSksIDApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVkb25kZWFyYSBubyBhY2Egc2lubyBlbiBsYSBzdW1hIHRvdGFsIGRlbCBmaWRlbGl6YWNpb24gZGUgY2FkYSBmb3JtYSBkZSBwYWdvXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGllbmUgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1biBwcm9jZXNvLCBldmFsdWFuZG8gY2FkYSBmb3JtYSBkZSBwYWdvXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF92YWx1ZV9maWRlbGl6YWNpb25fYnlfcHJvY2Vzbyhwcm9jZXNvOiBNM1Byb2Nlc29zLCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuXHJcbiAgICAgICAgdmFyIHBhZ29fdG90YWxfcHJvY2VzbzogbnVtYmVyID0gcHJvY2Vzby5WYWxvck5ldG87XHJcbiAgICAgICAgLy92YXIgbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbjogbnVtYmVyID0gdGhpcy5nZXRfdG90YWxfZmlkZWxpemFjaW9uKHByb2Nlc28pO1xyXG4gICAgICAgIHZhciByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbywgXCJQQUdPXCIsIFwiTU9ORURFUk9cIik7XHJcblxyXG4gICAgICAgIGlmIChwcm9jZXNvLmxNM1BFbmNGUCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvY2Vzby5sTTNQRW5jRlAubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZm9ybWFfcGFnbzogTTNQRW5jRlAgPSBwcm9jZXNvLmxNM1BFbmNGUFtfaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbW9BcGxpY2FkYTogTTNDT05ESVBST01PO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbGljYV9maWRlbGl6YWNpb24gPSB0aGlzLnZhbGlkYXRlX2NvbmRpX2J5X2Zvcm1hX3BhZ28oZm9ybWFfcGFnbywgbGlzdF9jb25kaV9wcm9tbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFwbGljYV9maWRlbGl6YWNpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclBhZ28gPSBmb3JtYV9wYWdvLlZhbG9yIC0gZm9ybWFfcGFnby5WYWxDYW1iaW87XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gKz0gdGhpcy5jYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvLCBwcm9jZXNvLk0zRU5DLCB2YWxvclBhZ28sIGFwbGljYV9maWRlbGl6YWNpb24sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uID4gbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbikge1xyXG4gICAgICAgIC8vICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IG1heF92YWx1ZV9maWRlbGl6YWNpb247XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMub01hdGhURi5yb3VuZChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiwgMik7XHJcbiAgICAgICAgcmV0dXJuIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIGRlIHRpcG8gZGUgcGFnbyBhIHBhcnRpciBkZSBBcnJheTxNM0NPTkRJUFJPTU8+XHJcbiAgICAgKiBAcGFyYW0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvIC5cclxuICAgICAqIEBwYXJhbSBsaXN0TTNFbmNJdGVtIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG86IEFycmF5PE0zQ09ORElQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPik6IEFycmF5PE0zQ09ORElQUk9NTz4ge1xyXG4gICAgICAgIGxldCByZXN0cmljY2lvbmVzQWN0aXZhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgaWYgKGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0TTNFbmNJdGVtLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RNM0RldCA9IGxpc3RNM0VuY0l0ZW1bX2ldLk0zREVUO1xyXG4gICAgICAgICAgICAgICAgaWYgKCtsaXN0TTNFbmNJdGVtW19pXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tb2Npb25lcyA9IGxpc3RNM0RldC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRQcm9tb2Npb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tbyA9IGlkUHJvbW9jaW9uZXMuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgaWRQcm9tby5sZW5ndGg7IF9rKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9ICtpZFByb21vW19rXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaVByb21vID0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaVByb21vICYmICFyZXN0cmljY2lvbmVzQWN0aXZhcy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljY2lvbmVzQWN0aXZhcy5wdXNoKGNvbmRpUHJvbW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3RyaWNjaW9uZXNBY3RpdmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIHBhcmEgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBhY3R1YWxcclxuICAgICAqIEBwYXJhbSBsaXN0RW5jUHJvbW8gXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXNGcm9tRW5jUHJvbW8obGlzdEVuY1Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgbGlzdE0zRW5jSXRlbTogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RFbmNQcm9tbywgXCJQQUdPXCIsIFwiUkVTVFJJQ0NJT05fUEFHT1wiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8sIGxpc3RNM0VuY0l0ZW0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIG1vdmltaWVudG9zIHJlYWxpemFkb3MgcG9yIHVuIG0zc2FsZG9zeGN1ZW50YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBtb3ZzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcF9tb3ZzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiAoIW1vdnMuTU9WUy5NT1YubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzLnB1c2gobW92cy5NT1ZTLk1PVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBtb3ZzLk1PVlMuTU9WO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcF9tb3ZzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgbGEgZm9ybWEgZGUgcGFnbyBjdW1wbGUgYWxndW5hIGNvbmRpY2lvbiBkZSBmaWRlbGl6YWNpb25cclxuICAgICAqIEBwYXJhbSBmb3JtYV9wYWdvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfY29uZGlfcHJvbW86IGxpc3RhZG8gZGUgY29uZGljaW9uZXMgZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ286IE0zUEVuY0ZQLCBsaXN0X2NvbmRpX3Byb21vOiBBcnJheTxNM0NPTkRJUFJPTU8+KSB7XHJcbiAgICAgICAgLy9yZXR1cm4gbGlzdF9jb25kaV9wcm9tb1swXTtcclxuICAgICAgICBsZXQgcHJvbW9zQXBsaWNhZGFzID0gbmV3IEFycmF5PE0zQ09ORElQUk9NTz4oKTtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdF9jb25kaV9wcm9tby5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbmRpX3Byb21vID0gbGlzdF9jb25kaV9wcm9tb1tfaV07XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbmRpX3Byb21vLkNvbmNlcHRvLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVsIG9wZXJhZG9yIGVzIERJRkYgY3JlYSB1bmEgZXhwcmVzaW9uIHJlZ3VsYSBwYXJhIGV4Y2x1aXIgbG8gdGlwb2RlcGFnbyBjb25maWd1cmFkb3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYSAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkRJRkZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaV9wcm9tby5WYWxvciA9IFwiXig/IShcIiArIGNvbmRpX3Byb21vLlZhbG9yICsgXCIpXFxcXGIpXFxcXHcrJFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKSRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChjb25kaV9wcm9tby5WYWxvciwgXCJpXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS50ZXN0KGZvcm1hX3BhZ28uSWRUaXBvUGFnby50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3NBcGxpY2FkYXMucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9tb3NBcGxpY2FkYXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGxpc3RhZG8gZGUgY29uZGljaW9uZXMgdmFsaWRhcyBwYXJhIHVuYSBhY3RpdmlkYWQgZGFkYVxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgYWN0aXZpZGFkOiBzdHJpbmcsIHRpcG8yOiBzdHJpbmcpOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPiA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGlzdF9lbmNfcHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5jYWJlemFkb1Byb21vID0gbGlzdF9lbmNfcHJvbW9bX2tdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSAmJiBlbmNhYmV6YWRvUHJvbW8uVGlwbzIgPT0gdGlwbzIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfYWdydXBhY2lvbiA9IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTltfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaiA9IDA7IF9qIDwgY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU8ubGVuZ3RoOyBfaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfcHJvbW8gPSBjb25kaV9hZ3J1cGFjaW9uLk0zQ09ORElQUk9NT1tfal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEICYmIGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBhY3RpdmlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9jb25kaV9wcm9tby5wdXNoKGNvbmRpX3Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2NvbmRpX3Byb21vO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuYSBmb3JtYSBkZSBwYWdvIGRlIGFjdWVyZG8gYSBzdSBwb3JjZW50YWplIHJlc3BlY3RvIGVsIHZhbG9yIHRvdGFsIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcGFnb190b3RhbF9wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIG1heF92YWx1ZV9maWRlbGl6YWNpb24gXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVfZm9ybWFfcGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciwgbGlzdE0zRW5jOiBNM1BFbmNJdGVtc1tdLCB2YWx1ZV9mb3JtYV9wYWdvOiBudW1iZXIsIHByb21vc0FwbGljYWRhOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICBsZXQgbGlzdFByb21vc0FwbGljYWRhcztcclxuICAgICAgICBsZXQgZGV0YWxsZUlkUHJvbW9jO1xyXG4gICAgICAgIGxldCB2YWxvckZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRfZm9ybWFfcGFnbzogbnVtYmVyID0gdmFsdWVfZm9ybWFfcGFnbyAvIHBhZ29fdG90YWxfcHJvY2VzbztcclxuICAgICAgICB2YXIgcHJlY2lvUHJvZHVjdG8gPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0TTNFbmMpIHtcclxuICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkZXRhbGxlSWRQcm9tb2MgPSBpdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPTU9DXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZUlkUHJvbW9jICYmIGRldGFsbGVJZFByb21vYy5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IGRldGFsbGVJZFByb21vYy5WYWxvci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tb0FwbCBvZiBwcm9tb3NBcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RQcm9tb3NBcGxpY2FkYXMuZmluZCh4ID0+ICt4ID09IHByb21vQXBsLklkUHJvbW9jaW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9IGxpc3RfZW5jX3Byb21vLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vQXBsLklkUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckZpZGVsaXphY2lvbiArPSAocHJlY2lvUHJvZHVjdG8gKiB0aGlzLmdldFBvcmNlbnRhamVGaWRlbGl6YWNpb25Gcm9tRW5jUHJvbW8ocHJvbW8pIC8gMTAwKSAqIChwZXJjZW50X2Zvcm1hX3BhZ28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvckZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYSB1bmEgZGluYW1pY2EgY29uIGVsIHZhbG9yIGRlIGxhIGZpZGVsaXphY2nDg8KzbiBkZSBkaWNobyBwcm9jZXNvIHkgcmV0b3JuYSBkaWNobyBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZF9kaW5hbWljYV9maWRlbGl6YWNpb25fdG9fcHJvY2Vzbyhwcm9jZXNvOiBNM1Byb2Nlc29zLCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICB2YXIgdmFsdWVfZmlkZWxpemFjaW9uID0gMFxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICB2YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLmdldF92YWx1ZV9maWRlbGl6YWNpb25fYnlfcHJvY2Vzbyhwcm9jZXNvLCBsaXN0X2VuY19wcm9tbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWVfZmlkZWxpemFjaW9uID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZGluYW1pY2FfZmlkZWxpemFjaW9uOiBNM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIGRpbmFtaWNhX2ZpZGVsaXphY2lvbi5Ob21icmUgPSBcIkZJREVMSVpBQ0lPTlwiXHJcbiAgICAgICAgICAgIGRpbmFtaWNhX2ZpZGVsaXphY2lvbi5WYWxvciA9IHZhbHVlX2ZpZGVsaXphY2lvbi50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAgICAgcHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2goZGluYW1pY2FfZmlkZWxpemFjaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxhIGV4aXN0ZW5jaWEgZGUgdW4gZG9jdW1lbnRvIGRlIGZpZGVsaXphY2lvbiBlbiBsYSB0YWJsYSBNM1NhbGRvc1hDdWVudGFcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRvY3VtZW50byBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL3ZhbGlkYXRlX2RvY19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc2FsZG9feF9jdWVudGE7XHJcbiAgICAgICAgICAgIHNhbGRvX3hfY3VlbnRhID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpLlJFU1BVRVNUQS5NM1NhbGRvc1hDdWVudGE7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhzYWxkb194X2N1ZW50YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphIGVsIHNhbGRvIHN1bWFuZG9sZSBlbCB2YWxvciBlbnZpYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vZGF0YSA9IHtcImRvY3VtZW50b1wiOmRvY3VtZW50bywgXCJ2YWxvcl9tb3ZpbWllbnRvXCI6dmFsb3JfbW92aWVudG8sIFwicGFnb1wiOnBhZ28gfVxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvYWN0dWFsaXphcl9zYWxkb19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBkYXRhLnBhZ28uaWREaWFyaW8gPSByZXNwW1wiX2JvZHlcIl0ucmVwbGFjZSgnXCInLCAnJykucmVwbGFjZSgnXCInLCAnJyk7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhkYXRhLnBhZ28pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmEgVW4gYm9ubyBkZSBkZXZvbHVjaW9uIHBvciBlbCB2YWxvciBkYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhID0ge1wicHJvY2Vzb1wiLHByb2Nlc28sXCJ2YWxvclwiOnZhbG9yfVxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19nZW5lcmFyX2Jvbm9fZGV2b2x1Y2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL20zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhIHVuIG51ZXZvIHJlZ2lzdHJvIGVuIGxhIHRhYmxhIFNhbGRvWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNJbnNlcnRTYWxkb1hDdWVudGEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL3ZhciBkYXRhID0geyAnRG9jdW1lbnRvJzogdGhpcy5kb2N1bWVudG8sICdURG9jVGl0dWxhcic6ICc1JywgJ05Eb2NUaXR1bGFyJzogdGhpcy5uZG9jX2NsaWVudGUsICdOb21DdWVudGEnOiAnRklERUxJWkFDSU9OJywgJ1ZhbEN1ZW50YSc6IDAgfVxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNJbnNlcnRTYWxkb1hDdWVudGEvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbChNM0VOQzogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgaWYgKE0zRU5DKSB7XHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWQgPSBNM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApO1xyXG4gICAgICAgICAgICBpZiAoZENhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRDYW50aWRhZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvbmZpZ0xQU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiQ29uZmlnTFBfXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8vIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLnN5bmNDb3VjaCgpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyB2YWxpZGFyUGFxdWV0ZXMoKSB7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMuYXBsUGFxdWV0ZXMpIHtcclxuICAgIC8vICAgICAgICAgbGV0IHViaWNhY2lvbiA9IHRoaXMuZ2V0VWJpY2FjaW9uKCk7XHJcbiAgICAvLyAgICAgICAgIGlmICh1YmljYWNpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzYVwiICsgdWJpY2FjaW9uICsgXCJfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGVsc2Uge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHN5bmNDb3VjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaWRrYXRpb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJjb25maWdscF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFViaWNhY2lvbigpIHtcclxuICAgICAgICBsZXQgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICBsZXQgb1NVYmljYWNpb247XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uSURVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU1ViaWNhY2lvbi5JRFViaWNhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgLy8gcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAvLyAgICAgdmFyIEthdGlvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuaWRrYXRpb3MudG9VcHBlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgaWYgKEthdGlvcyAhPT0gdW5kZWZpbmVkICYmIEthdGlvcyAhPSBudWxsKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBqS2F0aW9zTTMgPSBKU09OLnBhcnNlKEthdGlvcyk7XHJcbiAgICAvLyAgICAgICAgIGlmIChqS2F0aW9zTTMgJiYgakthdGlvc00zLkthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3NNMy5hcGxQYXFzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmFwbFBhcXVldGVzID0gakthdGlvc00zLkthdGlvc00zLmFwbFBhcXNcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveShpZGthdGlvcykge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXBsU3luY0NvdWNoQXV0byA9IHRoaXMuZ2V0RmxhZ1N5bmNDb3VjaCgpO1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdGhpcy5hcGxTeW5jQ291Y2hBdXRvLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIENPTkZJR0xQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuaW5mbygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlTHAoaWQpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCB7IENvdWNoQ29uZmlnTFBTZXJ2aWNlIH0gZnJvbSBcIi4uL09mZmxpbmUvY291Y2gtY29uZmlnbHAuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tIFwiLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8ge1xyXG4gICAgcHJpdmF0ZSBvTWF0aFRGID0gbmV3IE1hdGhURigpO1xyXG4gICAgcHJpdmF0ZSBnc2lka2F0aW9zOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGFwbFByZWNpb3NEaW5hbWljb3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZGthdGlvcykge1xyXG4gICAgICAgIHRoaXMuZ3NpZGthdGlvcyA9IGlka2F0aW9zO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIGxldCBLYXRpb3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0thdGlvc1wiICsgdGhpcy5nc2lka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTExQRElOQU1JQ09TXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFwbCAmJiBhcGwuVmFsb3IgPT0gXCIxXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwbFByZWNpb3NEaW5hbWljb3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL0FzaWduYXIgbGlzdGEgZGUgcHJlY2lvcywgc2VndW4gbGlzdGEgZGUgcHJlY2lvcyBhc29jaWFkbyBhIHVzdWFyaW8gcG9yIGNhZGEgdWpubyBkZSAgbG9zIHByb2R1Y3RvcyBoaWpvc1xyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb00zUGFjayhQcm9kdWN0b01hZXN0cm86IFR5cGVNM1ByZEdycCwgb0RhdGFVc2VyOiBhbnksIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zKSB7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUHJkR3JwQXNvY2lhZG8gb2YgUHJvZHVjdG9NYWVzdHJvLk0zUHJkR3JwQXNvY2lhZG8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW8ob00zUHJkR3JwQXNvY2lhZG8uTTNHUlAsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByZEdlbmVyYWwgb2YgUHJvZHVjdG9NYWVzdHJvLkxvTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbTNQYWNrIG9mIHByZEdlbmVyYWwuTTNQQUNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkFzaWduYXJMaXN0YVByZWNpbyhtM1BhY2suTTNHUlAsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vQXNpZ25hciBsaXN0YSBkZSBwcmVjaW9zLCBzZWd1biBsaXN0YSBkZSBwcmVjaW9zIGFzb2NpYWRvIGEgdXN1YXJpby5cclxuICAgIHB1YmxpYyBhc3luYyBBc2lnbmFyTGlzdGFQcmVjaW8oUHJvZHVjdG9NYWVzdHJvOiBUeXBlTTNQcmRHcnAsIG9EYXRhVXNlcjogYW55LCBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmIChvRGF0YVVzZXIgIT0gbnVsbCAmJiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9kdWN0b01hZXN0cm8uTG9NM1ByZEdlbmVyYWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcmRHcmwgPSBQcm9kdWN0b01hZXN0cm8uTG9NM1ByZEdlbmVyYWxbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBvTGlzdGFGaW5kZWQgPSBwcmRHcmwuTG9NM0xpc3RhUHJlY2lvLmZpbmQobFByZSA9PiBsUHJlLklETElTVEEgPT0gc3BsaXRQcmVjaW9bMF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBsUHJlY2lvc0RpbmFtaWNvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0UHJlY2lvWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTEJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MaXN0YUZpbmRlZC5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9Db3VjaENvbmZpZ0xQU2VydmljZSA9IG5ldyBDb3VjaENvbmZpZ0xQU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RhQ291Y2ggPSBhd2FpdCBvQ291Y2hDb25maWdMUFNlcnZpY2UuZ2V0KHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpDb25maWdMUCA9IEpTT04ucGFyc2UobGlzdGFDb3VjaC5KQ29uZmlndXJhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakNvbmZpZ0xQICYmIGpDb25maWdMUC5GYWN0b3JlcyAmJiBqQ29uZmlnTFAuRmFjdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmYWN0b3IgPSBwYXJzZUZsb2F0KGpDb25maWdMUC5GYWN0b3Jlcy5maW5kKHggPT4geC5Ob21icmUgPT0gc3BsaXRQcmVjaW9bMV0pLkZhY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IHRoaXMub01hdGhURi5yb3VuZChvTGlzdGFGaW5kZWQuUFJFQ0lPICogZmFjdG9yLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKHByZXNlbnRhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhY2lvbi5WQUxPUiA9IHRoaXMub01hdGhURi5yb3VuZChwcmVzZW50YWNpb24uVkFMT1IgKiBmYWN0b3IsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGVuIGFzaWduYXJsaXN0YXByZWNpbzogXCIgKyBFeC5tZXNzYWdlICsgXCIgLSBcIiArIHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTGlzdGFGaW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZEdybC5Mb00zUHJkTGlzdGEgPSBvTGlzdGFGaW5kZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuVmFsaWRhckRhdGFGcm9tSW52ZW50YXJpbyhwcmRHcmwsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBNM1ByZEFkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgICAgIG9NM1ByZEFkaWNpb25hbGVzLkFUUklCVVRPID0gXCJMSVNUQVBSRUNJT1wiO1xyXG4gICAgICAgICAgICBvTTNQcmRBZGljaW9uYWxlcy5WQUxPUiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW87XHJcbiAgICAgICAgICAgIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkQWRpY2lvbmFsZXMucHVzaChvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChQcm9kdWN0b01hZXN0cm8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb0FHZW5lcmFsKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvKTtcclxuICAgICAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb0xpc3RhRmluZGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5WYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybCwgb0RhdGFVc2VyLCBvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB2YXIgc0xpc3RhOiBzdHJpbmcgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vVmFsaWRhciBzaSBlcyB1biB2YWxvciBkZSBpbnZlbnRhcmlvLlxyXG4gICAgICAgIGlmIChzTGlzdGEuc3BsaXQoJ18nKVswXSA9PSBcIklOVlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBqRGF0YTogYW55ID0geyBcInViaWNhY2lvblwiOiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcInNrdVwiOiBwcmRHcmwuU0tVLCBcImxvdGVcIjogcHJkR3JsLkxPVEUsIFwiY29uY2VwdG9cIjogc0xpc3RhLnNwbGl0KCdfJylbMV0gfTtcclxuICAgICAgICAgICAgdmFyIHByZWNpbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UuR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihvUG9zdFNlcnZpY2VNMywgdGhpcy5nc2lka2F0aW9zLCBqRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwcmVjaW8gJiYgcHJlY2lvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmRMaXN0YS5JRExJU1RBID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLkxPVEUgPSBwcmRHcmwuTE9URTtcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlBSRUNJTyA9IHByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlNLVSA9IHByZEdybC5TS1U7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb00zUHJkTGlzdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IHNlc3Npb25XRTggfSBmcm9tIFwiLi4vLi4vLi4vU2Vzc2lvbi9zZXNzaW9uLmNsYXNzXCI7XHJcbmltcG9ydCB7IEZpbHRyb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9maWx0cm9zXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyDDicK1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNNYWVzdHJvIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NQb3JDcmVkaXRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRNM1Byb2Nlc29zUG9yQ3JlZGl0by8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb0J5SWRQcmVzdGFtbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkUHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcmVzdGFtbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG4gICAgLy9yYWUgZWwgVElQTywgU0tQMSwgTk9NQlJFIGRlIGxhIHRhYmxhIHByZGdycFxyXG4gICAgcHVibGljIG0zR2V0UFJER1JQKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0TTNQUkRHUlAvJyArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgY2FudGlkYWQgZGlzcG9uaWJsZSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIFNLUDEgeSBsYSB1YmljYWNpw4PCs24uXHJcbiAgICAvL0xhIGRhdGEgZGViZSB0ZW5lciB1bmEgZXN0cnVjdHVyYToge1wiVUJJQ0FDSU9OXCI6XCIxMTExXCIsIFwiU0tQMVwiOlwiOTk5OWFcIn1cclxuICAgIHB1YmxpYyBNM0dldENhbnRpZGFkQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXRDYW50aWRhZEJ5U0tQMS8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIGdvRGF0YURpc3A6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmIChvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vTm8gZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIGdvRGF0YURpc3AgPSBuZXcgQXJyYXk8YW55PihvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ29EYXRhRGlzcCA9IG9EYXRhLlJFU1BVRVNUQS5ESVNQT05JQklMSURBRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnb0RhdGFEaXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhnb0RhdGFEaXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBHZXRMaXN0YVByZFhGaWx0cm9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9sRmlsdHJvczogQXJyYXk8RmlsdHJvcz4sIHNJRExpc3RhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGlkVWJpY2FjaW9uID0gXCItMVwiLCBAT3B0aW9uYWwoKSBhcGxVbHRpbW9GaWx0cm8gPSB0cnVlLCBAT3B0aW9uYWwoKSB0b3BMaW1pdCA9IFwiMFwiLCBAT3B0aW9uYWwoKSBmaWx0cmFySW52VWJpYyA9IFwiMFwiKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwiRmlsdHJvc1wiOiBKU09OLnN0cmluZ2lmeShvbEZpbHRyb3MpLCBcIklkTGlzdGFcIjogc0lETGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiYXBsVWx0aW1vRmlsdHJvXCI6IGFwbFVsdGltb0ZpbHRybywgXCJ0b3BMaW1pdFwiOiB0b3BMaW1pdCwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIGlmIChvbEZpbHRyb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTGlzdFBSREZpbHRyb3MvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwLCBvbEZpbHRyb3MpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihcIk5vIGhheSBmaWx0cm9zIHBhcmEgbGEgYnVzcXVlZGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0NhdGVnb3JpYTogc3RyaW5nLCBvRGF0YUNsYXNpZmljYWNpb24sIElkTGlzdGE6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgQE9wdGlvbmFsKCkgaWRVYmljYWNpb24gPSBcIi0xXCIsIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG4gICAgICAgIHZhciBvbEZpbHRyb3M6IEFycmF5PEZpbHRyb3M+O1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb2xGaWx0cm9zID0gdGhpcy5GaW5kRmlsdGVySW5DbGFzaWZpY2FjaW9uKHNDYXRlZ29yaWEsIHNJREthdGlvcywgb0RhdGFDbGFzaWZpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcIkZpbHRyb3NcIjogSlNPTi5zdHJpbmdpZnkob2xGaWx0cm9zKSwgXCJJZExpc3RhXCI6IElkTGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiZmlsdHJhckludlViaWNcIjogZmlsdHJhckludlViaWMgfTtcclxuICAgICAgICBpZiAob2xGaWx0cm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vR2V0X0xpc3RQUkRGaWx0cm9zLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgb2xGaWx0cm9zKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiTm8gaGF5IGZpbHRyb3MgcGFyYSBsYSBidXNxdWVkYVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfS8vRW5kIEdldExpc3RhUHJkWENhdGVnb3JpYVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWFXaXRoT3V0RmlsdGVycyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzQ2F0ZWdvcmlhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlDbGFzaWZpY2FjaW9uLycgKyBzSURLYXRpb3MgKyAnLycgKyBzQ2F0ZWdvcmlhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0TGlzdGFQcmRYQ2F0ZWdvcmlhXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBlbCBub21icmUgbyBkZXNjcmlwY2nDg8Kzbi5cclxuICAgIEdldExpc3RhUHJkWE5vbWJyZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FyZ2FyTGlzdFByZEJ5R2VuZXJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2Nhcmdhckxpc3RQcmRCeUdlbmVyaWMvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2FyZ2FyIGluZm9ybWFjaW9uIGRlIGNsYXNpZmljYWNpb25cclxuICAgIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqc29uUmVzcCxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vdmFyIG9zZXNzaW9uV0U4ID0gbmV3IHNlc3Npb25XRTgoKTtcclxuXHJcbiAgICAgICAgLy9qc29uUmVzcCA9IG9zZXNzaW9uV0U4LkdldERhdGFDTEFTSUZJQ0FDSU9OKHNJREthdGlvcyk7XHJcbiAgICAgICAgaWYgKGpzb25SZXNwID09PSB1bmRlZmluZWQgfHwganNvblJlc3AgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL00zR2V0Q2xhc2lmaWNhY2lvbi9cIiArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAganNvblJlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQXJyYXlDbGFzaWZpY2FjaW9uKGpzb25SZXNwKTtcclxuICAgICAgICAgICAgICAgIC8vb3Nlc3Npb25XRTguU2V0RGF0YUNMQVNJRklDQUNJT04oanNvblJlc3AsIHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfS8vRW5kIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uXHJcblxyXG4gICAgLy9WYWxpZGFyIHF1ZSBsYSBjbGFzaWZpY2FjaW9uLCBlc3RlbiBjb21vIGFycmF5LlxyXG4gICAgVmFsaWRhckFycmF5Q2xhc2lmaWNhY2lvbihvRGF0YUNsYXMpIHtcclxuICAgICAgICB0aGlzLlJlY3Vyc2l2ZUNvbnZlcnRBcnJheShvRGF0YUNsYXMuUkVTUFVFU1RBLkNMQVNJRklDQUNJT05FUyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQXBsaWNhciBmaWx0cm9zIGEgbGEgY2F0ZWdvcmlhIGVudHJhbnRlLlxyXG4gICAgRmluZEZpbHRlckluQ2xhc2lmaWNhY2lvbihzQ2xhc0ZpbmQ6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhQ2xhc2lmaWNhY2lvbikge1xyXG4gICAgICAgIHZhciBzQ2xhc2lmaWNhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgb0RhdGFGaWx0cmFkYTtcclxuICAgICAgICAvL3ZhciBvc2Vzc2lvbldFOCA9IG5ldyBzZXNzaW9uV0U4KCk7XHJcbiAgICAgICAgdmFyIG9sRmlsdHJvcyA9IG5ldyBBcnJheTxGaWx0cm9zPigpO1xyXG4gICAgICAgIHZhciBvRmlsdHJvczogRmlsdHJvcztcclxuICAgICAgICB2YXIgZmlsdHJvQXRyaWJ1dG86IHN0cmluZztcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzQ2xhc0ZpbmQpO1xyXG4gICAgICAgIC8vb0RhdGFDbGFzaWZpY2FjaW9uID0gb3Nlc3Npb25XRTguR2V0RGF0YUNMQVNJRklDQUNJT04oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgb0RhdGFGaWx0cmFkYSA9IG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTO1xyXG5cclxuICAgICAgICBpZiAoc0NsYXNGaW5kLmxlbmd0aCAlIDMgPT0gMCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoc0NsYXNGaW5kICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBzQ2xhc2lmaWNhY2lvbiA9IHNDbGFzaWZpY2FjaW9uICsgc0NsYXNGaW5kLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICAgICAgICAgIHNDbGFzRmluZCA9IHNDbGFzRmluZC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgICAgICBvRGF0YUZpbHRyYWRhID0gb0RhdGFGaWx0cmFkYS5DQVRFR09SSUEuZmluZChmaWx0cm8gPT4gZmlsdHJvLkNMQVNJRklDQUNJT04udG9TdHJpbmcoKSA9PSBzQ2xhc2lmaWNhY2lvbi50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0cm9BdHJpYnV0byA9IG9EYXRhRmlsdHJhZGEuQVRSSUJVVE87XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRyb0F0cmlidXRvLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJST09UXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0ZpbHRyb3MgPSBuZXcgRmlsdHJvcyhvRGF0YUZpbHRyYWRhLkFUUklCVVRPLCBvRGF0YUZpbHRyYWRhLkRlc2NyaXBjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvbEZpbHRyb3MucHVzaChvRmlsdHJvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vb0RhdGFSZXNwQ2xhID0gdGhpcy5SZWN1cnNpdmVDbGFzaWZpY2FjaW9uKG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTLkNBVEVHT1JJQSwgc0NsYXNGaW5kKTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFSZXNwQ2xhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2xGaWx0cm9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjdXJzaXZpZGFkLCBwYXJhIHZhbGlkYXIgcXVlIHRvZG9zIGxvcyBub2Rvcywgc2VhbiB0aXBvIGFycmF5XHJcbiAgICBSZWN1cnNpdmVDb252ZXJ0QXJyYXkob0RhdGFDbGFzKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhQ2xhcy5DQVRFR09SSUEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob0RhdGFDbGFzLkNBVEVHT1JJQS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQSA9IG5ldyBBcnJheShvRGF0YUNsYXMuQ0FURUdPUklBKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KG9EYXRhQ2xhcy5DQVRFR09SSUFbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQS5mb3JFYWNoKGNsYXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KGNsYXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYSB1biBwcm9kdWN0b1xyXG4gICAgbTNBZGRQcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgdGRvY1VBY3Rpdm86IHN0cmluZywgbmRvY1VBY3Rpdm86IHN0cmluZywgb00zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIGRpc2FibGVkV2ViOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBkYXRhID0geyAnc1Rkb2NVc3VhcmlvJzogdGRvY1VBY3Rpdm8sICdzTmRvY1VzdWFyaW8nOiBuZG9jVUFjdGl2bywgJ29NM1ByZEdycCc6IG9NM1ByZEdycCwgJ2Rpc2FibGVkV2ViJzogZGlzYWJsZWRXZWIgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vYWRkUHJvZHVjdG8vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gcG9yIFNLUDEuXHJcbiAgICBNM0dldFByb2R1Y3RvQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vTTNHZXRQcm9kdWN0b0J5U0tQMS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHJhbmRvbSBwb3IgU0tQMS5cclxuICAgIE0zR2V0UHJvZHVjdG9SYW5kb21CeVNLUDEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9NM0dldFByb2R1Y3RvUmFuZG9tQnlTS1AxL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBwb3IgU0tQMS5cclxuICAgIE0zR2V0Q2F0QXNvY2lhZGFzQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBza3AxOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoXCJNM01hZXN0cm8vTTNHZXRDYXRBc29jaWFkYXNCeVNLUDEvXCIgKyBzSURLYXRpb3MgKyAnLycgKyBza3AxKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vR2V0IEltYWdlbmVzIGVudmlhbmRvIGVuIGxhIG9EYXRhOiB7XCJQYXRoXCI6XCJ4eHhcIiwgXCJTS1VcIjpcIlNLVXh4eFwifVxyXG4gICAgcHVibGljIE0zR2V0SW1hZ2VuZXNCeVBhdGgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTTNNdWx0aW1lZGlhQnlQYXRoLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9vYnRlbmVyIGluZm9ybWFjaW9uIGRlIHBsYW50aWxsYXMsIGRlc2RlIHNlcnZpZG9yLi4uIFxyXG4gICAgR2V0X00zU0tQbGFudGlsbGFCeVNLVUlEKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBTS1VJRDogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL0dldF9NM1NLUGxhbnRpbGxhQnlTS1VJRC9cIiArIHNJREthdGlvcyArIFwiL1wiICsgU0tVSUQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcHJvZHVjdG9zLCBkZXNkZSBjb2RpZ28gZGUgYmFycmFzXHJcbiAgICBHZXRJbmZvQnlGaWx0ZXJDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzRmlsdGVyQ29kZTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiRklMVEVSQ09ERVwiOiBzRmlsdGVyQ29kZSB9O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFNLUDFQcmRzQnlGaWx0ZXJzQ29kZS8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0SW5mb0J5RmlsdGVyQ29kZSBcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9NM1ViaWNhY2lvbmVzLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zVWJpY2FjaW9uZXNcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXNDb21wbGV0YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uOiBzdHJpbmcsIHNJZEh1Yjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zV2l0aFRpbWVPdXQoJ00zTWFlc3Ryby9nZXRfTTNVYmljYWNpb25lc0NvbXBsZXRhLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24gKyAnLycgKyBzSWRIdWIsIDEwMDAwKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9NM1ViaWNhY2lvbmVzQ29tcGxldGFcclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIHB1YmxpYyBNM0dldFByb2R1Y3RvQnlTS1UoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhQb3N0U2VydmljZU0zKTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFByb2R1Y3RvQnlTS1UvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIGFzeW5jIE0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzU0tVOiBzdHJpbmcsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIFViaWNhY2lvbjogc3RyaW5nID0gXCItMVwiLCBzQXBsRXhjOiBzdHJpbmcgPSBcIjFcIikge1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGRhdGEgPSB7ICdTS1UnOiBzU0tVLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb24gPT0gXCItMVwiID8gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiA6IFViaWNhY2lvbiwgJ0FwbEV4Yyc6IHNBcGxFeGMgfTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuXHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0UHJvZHVjdG9CeVNLVS8nICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocmVzcCwgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIGVzcGVjZmljbyB0ZW5pZW5kbyBlbiBjdWVudGEgY29kaWdvLlxyXG4gICAgYXN5bmMgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1RyYWUgbG9zIHJlZ2lzdHJvcyBxdWUgc2UgZW5jdWVudHJlbiBlbiBNM1Byb2Nlc29zIHF1ZSBzZSBlbmN1ZW50cmVuIGNvbiBlc3RhZG9nZW5lcmFsIHByb2Nlc29cclxuICAgIE0zZ2V0UmVnaXN0cm9zRW5Qcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRfUmVnaXN0cm9zRW5Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JTb2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRpZW5lIGVsIHRvcCAyMCBkZSBwcm9kdWN0b3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIGdldF9NM1ByZEdycEJ5Tm9tYnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzTm9tYnJlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X00zUHJkR3JwQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLk0zR1JQO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zUHJkR3JwQnlOb21icmVcclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIHB1YmxpYyBHZXRNM1ByZEFncnVwYWRvQnlOb21icmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNOb21icmU6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfbTNfcHJkX2J5X25vbWJyZV9hZ3J1cGFkby8nICsgc0lES2F0aW9zICsgJy8nICsgc05vbWJyZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuTTNHUlA7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG8geSBxdWUgbm8gZXN0ZW4gZXhsY3VpZG9zIChNM0V4Y1ByZFhVYmljKVxyXG4gICAgcHVibGljIGdldF9tM19wcmRfYnlfbm9tYnJlX2FncnVwYWRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2RhdGEgPSB7bm9tYnJlOidhc2Rhc2QnLCBpZFViaWNhY2lvbjonMSd9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X20zX3ByZF9ieV9ub21icmVfYWdydXBhZG8vJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQS5NM0dSUDtcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGllbmUgZWwgcGF0aCBiYXNlIGRvbmRlIHNlIGVuY3VlbnRyYSBhbG9qYWRhcyBsYXMgaW1hZ2VuZXMgZW4gZWwgc2Vydmlkb3JcclxuICAgIHB1YmxpYyBnZXRfUGF0aFNlcnZpZG9ySW1hZ2VuZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzLycgKyBzSURLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3ApXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzXHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBlc3BlY2ZpY28gdGVuaWVuZG8gZW4gY3VlbnRhIGNvZGlnby5cclxuICAgIEdldF9NM1Byb2R1Y3RvRXNwZWNCeUNvZGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9HZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvUHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhvUHJvZHVjdG8sIG9EYXRhVXNlciwgUG9zdFNlcnZpY2VNMykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlVGltZU91dChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXRUaW1lICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykgZGF0YS5mZWNoYUxQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW87XHJcbiAgICAgICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSwgdGltZW91dFRpbWUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRfRG9jc0Zyb21Db3VjaE1hZXN0cm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybywgc0lkS2F0aW9zOiBzdHJpbmcsIHNEb2M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0X0RvY3NGcm9tQ291Y2hNYWVzdHJvXCIpXHJcbiAgICAgICAgdmFyIHNJZEtleURvYyA9IG9NM0NvdWNoTWFlc3Ryby5HZXRLZXlEb2N1bWVudG9EQihzSWRLYXRpb3MsIHNEb2MpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNJZEtleURvYylcclxuICAgICAgICBvTTNDb3VjaE1hZXN0cm8uR2V0RGF0YVBvdWNoQkQoc0lkS2V5RG9jKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzdWx0KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRQcm9kdWN0b0VzcGVjQnlDb2RlRnJvbUNvdWNoKGpQcm9kdWN0c0NvdWNoOiBhbnksIHNDb2RlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGpQcm9kdWN0c0ZpbCA9IGpQcm9kdWN0c0NvdWNoLmZpbmQoeCA9PiB4LkxvTTNQcmRHZW5lcmFsICE9IHVuZGVmaW5lZCAmJiB4LkxvTTNQcmRHZW5lcmFsLmZpbmQodyA9PiB3Lk0zQ29kcyAhPSB1bmRlZmluZWQgJiYgdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpICE9IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RfY2xvbmUgPSBfLmNsb25lRGVlcChqUHJvZHVjdHNGaWwpO1xyXG5cclxuICAgICAgICBpZiAoalByb2R1Y3RzRmlsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YXIgalByZEVzcCA9IGpQcm9kdWN0c0ZpbC5Mb00zUHJkR2VuZXJhbC5maW5kKHcgPT4gdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHByb2R1Y3RfY2xvbmUuTG9NM1ByZEdlbmVyYWwgPSBbXTtcclxuICAgICAgICAgICAgcHJvZHVjdF9jbG9uZS5Mb00zUHJkR2VuZXJhbC5wdXNoKGpQcmRFc3ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInByb2R1Y3RfY2xvbmVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdF9jbG9uZSlcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0X2Nsb25lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnJvcihcIk5vIHNlIGVuY29udHLDg8KzIG51bmfDg8K6biByZWdpc3Ryby5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBUaXBvcyBkZSBwcm9jZXNvcyBkZXNkZSBlbCBzZXJ2aWRvclxyXG4gICAgcHVibGljIGdldF9UaXBvc1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgYWN0aXZpZGFkOiBzdHJpbmcgPSAnVmVudGFzJykge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1RpcG9zUHJvY2Vzby8nICsgc0lES2F0aW9zICsgJy8nICsgYWN0aXZpZGFkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9UaXBvc1Byb2Nlc29cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIEluZm8gZGUgdW4gcHJvY2VzbyBhIHBhcnRpciBkZSB1biBpZFByb2Nlc28geSB1biBJZE0zXHJcbiAgICBwdWJsaWMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfSW5mb1BlcnNvbmFfUHJvY2Vzby8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBJbmZvIGRlIHVuIHByb2Nlc28gYSBwYXJ0aXIgZGUgdW4gaWRQcm9jZXNvIHkgdW4gSWRNMyBkZSBtYW5lcmEgc2luY3LDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGpEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc29fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIganNvbjtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9JbmZvUGVyc29uYV9Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgdW4gcHJvZHVjdG8gYWdydXBhZG8sIHRlbmllbmRvIHVuYSBsaXN0YSBkZSBwcm9kdWN0byBhZ3J1cGFkb3MgeSB1biBza3VcclxuICAgIHB1YmxpYyBHZXRNM1ByZEdycEZyb21MaXN0KExpc3RQcmQ6IEFycmF5PFR5cGVNM1ByZEdycD4sIHNrdSk6IFR5cGVNM1ByZEdycCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9UeXBlTTNQcmRHcnBSZXN1bHQ6IFR5cGVNM1ByZEdycDtcclxuICAgICAgICAgICAgb1R5cGVNM1ByZEdycFJlc3VsdCA9IExpc3RQcmQuZmluZChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwcmQuTG9NM1ByZEdlbmVyYWwuZm9yRWFjaChwcmQgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkLlNLVSA9PT0gc2t1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9UeXBlTTNQcmRHcnBSZXN1bHQuTG9NM1ByZEdlbmVyYWwgPSBvVHlwZU0zUHJkR3JwUmVzdWx0LkxvTTNQcmRHZW5lcmFsLmZpbHRlcihnZW4gPT4gZ2VuLlNLVSA9PSBza3UpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1R5cGVNM1ByZEdycFJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBkZSB1bmEgbGlzdGEgZGUgdWJpY2FjaW9uZXMsIHVuYSB1YmljYWNpb24gZW4gcGFydGljdWxhciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uRnJvbUxpc3QoTGlzdFViaWM6IEFycmF5PE0zVWJpY2FjaW9uPiwgc0lkVWJpYykge1xyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgICAgIG9NM1ViaWNhY2lvbiA9IExpc3RVYmljLmZpbmQodWJpYyA9PiB1YmljLklEVWJpY2FjaW9uID09IHNJZFViaWMpO1xyXG4gICAgICAgIHJldHVybiBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBYbWwgZGUgY29uZmlndXJhY2lvbiBkZSBsYSBlbXByZXNhIGEgcGFydGlyIGRlbCBpZHViaWNhY2lvblxyXG4gICAgcHVibGljIGdldF9YbWxDb25maWdfeF9JZFViaWNhY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9YbWxDb25maWdfeF9JZFViaWNhY2lvbi8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsb3MgYXRyaWJ1dG9zIGVuIG0zY2xhc2lmaWNhIGEgcGFydGlyIGRlIHVuIGlka2F0aW9zXHJcbiAgICBnZXRfY2xhc2lmaWNhdGlvbl9hdHRyaWJ1dGVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9jbGFzaWZpY2F0aW9uX2F0dHJpYnV0ZXMvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5BVFRSSUJVVEVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhcyBjYXRlZ29yaWFzIGVuIG0zY2xhc2lmaWNhIGEgcGFydGlyIGRlIHVuIGlka2F0aW9zIHkgdW4gYXRyaWJ1dG9cclxuICAgIGdldF9jbGFzaWZpY2F0aW9uX2NhdGVnb3JpZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9jbGFzaWZpY2F0aW9uX2NhdGVnb3JpZXMvJyArIGlkX2thdGlvcyArIFwiL1wiICsgYXR0cmlidXRlKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkNBVEVHT1JJRVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3BjaW9uZXNBZGljaW9uYWxlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRPcGNpb25lc0FkaWNpb25hbGVzLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQVRUUklCVVRFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEF0cmlidXRvc0FkaWNpb25hbGVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRBdHJpYnV0b3NBZGljaW9uYWxlcy8nICsgaWRfa2F0aW9zICsgXCIvXCIgKyBhdHRyaWJ1dGUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQ0FURUdPUklFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIGluZm9ybWFjaW9uIGRlIHRpcG9zIGRlIGVudmlvLlxyXG4gICAgTTNHZXRGb3JtYXNFbnZpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9NM0dldEZvcm1hc0VudmlvLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIGpzUmVzcDtcclxuICAgICAgICAgICAganNSZXNwID0gSlNPTi5wYXJzZShyZXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc1Jlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpbmllIHRvZGFzIGxhcyBNM1ViaWNhY2lvbmVzIGFzb2NpYWRhcyBhIHVuIGlkX2thdGlvc1xyXG4gICAgcHVibGljIGdldF91YmljYWNpb25lc19jb21wbGV0ZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfdWJpY2FjaW9uZXNfY29tcGxldGUvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpbmllIHRvZGFzIGxhcyBNM1ViaWNhY2lvbmVzIGFzb2NpYWRhcyBhIHVuIGlkX2thdGlvc1xyXG4gICAgcHVibGljIGdldF91YmljYWNpb25lc19zaW1wbGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X3ViaWNhY2lvbmVzX3NpbXBsZS8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpbmllIHRvZGFzIGxhcyBNM1ViaWNhY2lvbmVzIGFzb2NpYWRhcyBhIHVuIGlkX2thdGlvc1xyXG4gICAgcHVibGljIGFzeW5jIE0zR0VUX0xJU1RBUFJFQ0lPU19BU3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNHRVRfTElTVEFQUkVDSU9TLycgKyBpZF9rYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBvUmVjTGlzdGFQcmVjWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRFbmNhYmV6YWRvTGlzdGFzUHJlY2lvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9HZXRDb25maWdMUC8nICsgc0lES2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RyYXJDb2xvbmlhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcsIHNDb2xvbmlhOiBzdHJpbmcsIHNDb2RQb3N0YWwsIHNUZWxlZm9ubzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsIHNMaW5lYTE6IHN0cmluZywgc0NvZGVzdGFkbzogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwic0NvbG9uaWFcIjogc0NvbG9uaWEsIFwic0NvZFBvc3RhbFwiOiBzQ29kUG9zdGFsLCBcInNUZWxlZm9ub1wiOiBzVGVsZWZvbm8sIFwibmRvY1wiOiBuZG9jLCBcInNMaW5lYTFcIjogc0xpbmVhMSwgXCJzQ29kZXN0YWRvXCI6IHNDb2Rlc3RhZG8gfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNNYWVzdHJvL3JlZ2lzdHJhckNvbG9uaWEvJyArIElkS2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShwb3N0cyA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRlbmVyIHByb21vY2lvbmVzIFxyXG4gICAgcHVibGljIGFzeW5jIE0zX0dldFByb21vY2lvbmVzTWFlc3Ryb0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9NM19HZXRQcm9tb2Npb25lc01hZXN0cm8vJyArIGlkX2thdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9SZWNMaXN0YVByZWM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGVuZXIgRGluYW1pY2FzIHBvciBhY3RpdmlkYWQgXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHZXREaW5CeUFjdGl2aWRhZChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldERpbkJ5QWN0aXZpZGFkLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIGpzUmVzcDphbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAvL2pzUmVzcCA9IEpTT04ucGFyc2UoanNSZXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAvLyB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICAvLyBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXREaW5CeUFjdGl2aWRhZC8nICsgaWRfa2F0aW9zLCBvRGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgLy8gcmV0dXJuIG9SZWNMaXN0YVByZWM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIGluZm8gYmFzaWNhIGRlIGxhcyB1YmljYWNpb25lcyBjb24gSHViIHRpcG8gV0VCIGFjdGl2b3MgZW4gZWwgbW9tZW50b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgZ2V0VWJpY2FjaW9uZXNXZWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRVYmljYWNpb25lc1dlYi8nICsgaWRLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3ApKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgUmV0b3JuYSBsYSBpbmZvIGJhc2ljYSBkZSBsYXMgdWJpY2FjaW9uZXMgY29uIEh1YiB0aXBvIFdFQiBhY3Rpdm9zIGVuIGVsIG1vbWVudG8gcXVlIGFiYXJxdWVuIHVuIGNvZHBvc3RhbCBlbiBjb25jcmV0b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBnZXRVYmljYWNpb25lc0J5Q29kUG9zdGFsKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vZGF0YSA9IHsgXCJjb2RQb3N0YWxcIjogc3RyaW5nIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0VWJpY2FjaW9uZXNCeUNvZFBvc3RhbC8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgcGF0aCBkZSBsYSBmYWN0dXJhIGVsZWN0csODwrNuaWNhIGEgcGFydGlyIGRlIHVuIElkRGlhcmlvIGFzb2NpYWRvIGFsIHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXRoRkVGcm9tRGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIHRpcG9HZW5lcmFjaW9uOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRQYXRoRkVGcm9tRGlhcmlvLycgKyBpZEthdGlvcyArICcvJyArIHRpcG9HZW5lcmFjaW9uLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGE6IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwdWVzdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGlhcmlvQWRpY2lvbmFsZXN4RGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keUdlbmVyYWxlcygnRGlhcmlvL2dldERpYXJpb0FkaWNpb25hbGVzeERpYXJpby8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIElVX0h1YihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0h1YjogYW55LCB1VEFjdGl2bzogc3RyaW5nLCB1TkFjdGl2bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCksICdvSHViJzogb0h1YiwgJ3VUQWN0aXZvJzogdVRBY3Rpdm8sICd1TkFjdGl2byc6IHVOQWN0aXZvIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vSVVfSHViJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGVsIGN0aXZvIGRlc2RlIHNlcnZpZG9yXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIHViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIEdldEN0aXZvQllQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZHByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZHByb2Nlc28nOiBpZHByb2Nlc28sICd1YmljYWNpb24nOiB1YmljYWNpb24sICdodWInOiBodWIgfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDdGl2b0JZUHJvY2Vzby8nICsgaWRfa2F0aW9zLnRyaW0oKSwgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgVmFsaWRhckN0aXZvc1ZTTG9jYWwoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgaW5mUHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNMy9WYWxpZGFyQ3Rpdm9zVlNMb2NhbC8nICsgaWRfa2F0aW9zICsgJy8nICsgdWJpY2FjaW9uICsgJy8nICsgaHViLCBpbmZQcm9jZXNvKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXNwKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoeyBcImVycm9yXCI6IGVycm9yIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBHZW5lcmFyQXV0b3JpemFjaW9uQ3VlbnRhcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBkYXRhKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcblxyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvR2VuZXJhckF1dG9yaXphY2lvbkN1ZW50YXMnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgZWwgY29kaWdvIGluZ3Jlc2FkbyBjb3JyZXNwb25kZSBhbCBkb2N1bWVudG8geSBzaSBlbCBjb2RpZ28gZXN0YSBlbiBlc3RhZG8gYWN0aXZvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICovXHJcbiAgICBhc3luYyB2YWxpZGFjaW9uQXV0b3JpemFjaW9uTTNDdWVudGFzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGRhdGEpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuXHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNMy92YWxpZGFjaW9uQXV0b3JpemFjaW9uTTNDdWVudGFzJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBWZXJpZmljYXJQYWdvVGFyamV0YUJCVkEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZEtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGpEYXRhID0geyBcIklka2F0aW9zXCI6IHNJREthdGlvcywgXCJpZEtleVwiOiBzSWRLZXkgfVxyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL1ZlcmlmaWNhclBhZ29UYXJqZXRhQkJWQScsIGpEYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRlMgMjAxOTA4MTM6IFJldG9ybmEgbG9zIGNvZGlnb3MgZGUgbG9zIFNLUChza3BUb0ZpbmQpIHkgc3UgcmVzcGVjdGl2byBzaWduaWZpY2FkbyBwYXJhIHVuIHByb2R1Y3RvIGRhZG9cclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERlc2NyaXBjaW9uU0tQcyhpZEthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLFxyXG4gICAgICAgIGRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2xldCBkYXRhID0ge1wiU0tQMVwiOlwiU0tQMVwiLCBTS1BUb0ZpbmQ6IDIgfX07XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zQ29uc3VsdGFzL2dldERlc2NyaXBjaW9uU0tQcy9cIiArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhkYXRhLlNLUDEsIEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBnZXRUb3RhbGVzQ2llcnJlQ2FqYShwb3N0U2VydmljZTogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIHN1YmljYWNpb246IHN0cmluZywgc2h1Yjogc3RyaW5nLCBzdXN1YXJpbzogc3RyaW5nLCBzRmVjaGFJOiBzdHJpbmcsIHNGZWNoYUY6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzZWNvcGNpb25lczogYW55O1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBzSWRLYXRpb3MsICd1YmljYWNpb24nOiBzdWJpY2FjaW9uLCAnaHViJzogc2h1YiwgJ3VzdWFyaW8nOiBzdXN1YXJpbywgJ0ZlY2hhSSc6IHNGZWNoYUksICdGZWNoYUYnOiBzRmVjaGFGIH1cclxuICAgICAgICBzZWNvcGNpb25lcyA9IGF3YWl0IHBvc3RTZXJ2aWNlLmdldFdpdGhCb2R5TTMoJ00zL2dldFRvdGFsZXNDaWVycmVDYWphJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICBzZWNvcGNpb25lcyA9IEpTT04ucGFyc2Uoc2Vjb3BjaW9uZXMpXHJcbiAgICAgICAgcmV0dXJuIHNlY29wY2lvbmVzXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Q2llcnJlc3hVYmljYWNpb24ocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzdWJpY2FjaW9uOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc0ZlY2hhOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAndWJpY2FjaW9uJzogc3ViaWNhY2lvbiwgJ2lkUHJvY2Vzbyc6IHNJZFByb2Nlc28sICdGZWNoYSc6IHNGZWNoYSB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRDaWVycmVzeFViaWNhY2lvbicsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENpZXJyZXN4RW1wcmVzYShwb3N0U2VydmljZTogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc0ZlY2hhOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAnaWRQcm9jZXNvJzogc0lkUHJvY2VzbywgJ0ZlY2hhJzogc0ZlY2hhIH1cclxuICAgICAgICBzZWNvcGNpb25lcyA9IGF3YWl0IHBvc3RTZXJ2aWNlLmdldFdpdGhCb2R5TTMoJ00zL2dldENpZXJyZXN4RW1wcmVzYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhZSBlbCBtM3Byb2Nlc29zIHNlZ3B1biBlbCBpZHByZXN0YW1vXHJcbiAgICBwdWJsaWMgc2ltdWxhcnBhZ29FbmxpbmVhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWRNMzogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL1ZhbGlkYWNpb25QYWdvSW50ZWdyYWNpb25UZXN0LycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRNMyArICcvJyArIHNJZFByb2Nlc28pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyUHJkc01pc21vUHJvdmVlZG9yKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBub21icmVBZGljaW9uYWxQcm92ZWVkb3I6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyUHJkc01pc21vUHJvdmVlZG9yL1wiICsgaWRfa2F0aW9zICsgXCIvXCIgKyBub21icmVBZGljaW9uYWxQcm92ZWVkb3IsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvclwiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKGVyclsnX2JvZHknXSkuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhclJlc3RyaWNjaW9uSW52TmVnYXRpdm8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vdmFsaWRhclJlc3RyaWNjaW9uSW52TmVnYXRpdm8vXCIgKyBpZF9rYXRpb3MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdmFsaWRhclJlc3RyaWNjaW9uSW52TmVnYXRpdm9cIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEluZm9QcmRHYXN0b3NFbnZpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuXHJcbiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby9nZXRJbmZvUHJkR2FzdG9zRW52aW8vXCIgKyBpZF9rYXRpb3MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpLlJFU1BVRVNUQVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIHVuYSBzYWxkb3hjdWVudGEgYWxlYXRvcmlvIHBvciBlbCB2YWxvciBkYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhID0ge1wicHJvY2Vzb1wiLHByb2Nlc28sXCJ2YWxvclwiOnZhbG9yLFwibm9tYnJlRG9jXCI6IG5vbWJyZURvY31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG0zX2dlbmVyYXJfTTNTWENfYWxlYXRvcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9NM1NYQ19hbGVhdG9yaW8vXCIgKyBpZGthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkuUkVTUFVFU1RBO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgdW4gY29uY2VwdG8gZGVsIE0zX3NhbGRvc0l0ZW1VYlxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTTNfYWN0dWFsaXphckNvbmNlcHRvU0lVKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9NM19hY3R1YWxpemFyQ29uY2VwdG9TSVUvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNJdGVtcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUN1cG9uIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0RhdGEgfSBmcm9tIFwiLi4vRGF0YS9tMy1kYXRhXCI7XHJcbmltcG9ydCB7IERFRkFVTFRfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3NvclwiO1xyXG5pbXBvcnQgeyB4bWxUb0pzb25URiB9IGZyb20gXCIuLi8uLi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcC1pbXB1ZXN0b3NcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM0VOQ1BST01PIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgcHJvbW9jaW9uZXNTZXJ2aWNlIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uUHJvY2VzYWRhLCBQcm9tb2Npb25lc0Fzb2NpYWRhcywgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjNcIjtcclxuaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbFwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM090Q2xhc2lmaWNhY2lvbmVzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE1hdGhURiB9IGZyb20gXCIuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBFQ0FOQ0VMRUQgfSBmcm9tIFwiY29uc3RhbnRzXCI7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG52YXIgYmlnRGVjaW1hbCA9IHJlcXVpcmUoJ2pzLWJpZy1kZWNpbWFsJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm87XHJcbiAgICBwdWJsaWMgb0xpc3RhT2JzZXF1aW9zOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NFeGM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb09Qcm9tbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zQ2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbElkQWN0aXZhUHJvbW8gPSBbXTtcclxuICAgIHByaXZhdGUgR29Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zO1xyXG4gICAgcHJpdmF0ZSBnc0lka2F0aW9zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBJc1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZGthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8gPSBpb00zQ291Y2hNYWVzdHJvO1xyXG4gICAgICAgIHRoaXMuR29Qb3N0U2VydmljZU0zID0gSXNQb3N0U2VydmljZU0zO1xyXG4gICAgICAgIHRoaXMuZ3NJZGthdGlvcyA9IHNJZGthdGlvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBWYWxpZGFyIG51bWVybyBkZSBpdGVtcyBhZ3JlZ2Fkb3MuIHNpIGVzIG1heW9yIGEgMS4wMDAgcHJlbmRlIHBhcmFtZXRybyBcclxuICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTnVtZXJvSXRlbXMob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5BcGxEZXNkZVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTnVtZXJvSXRlbXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJT0NJRVJSRVxyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvSnNvbi5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBBcnJheTxNM1Byb2Nlc29zPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL1JldG9tYXIgaW5mb3JtYWNpb24gcGFyYSBlbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIFJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXI6IGFueSwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhVXNlciAhPSBudWxsICYmIG9NM1Byb2Nlc29zLklkTTMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFwbFJldG9tYXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IHVuZGVmaW5lZCB8fCBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIGRhdG9zIGVuIGJhc2UgZGUgZGF0b3MgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZVBvdWNoREIob00zRGF0YTogTTNEYXRhLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIC8vQ2FyZ2FyIGRldGFsbGUgZGUgaXRlbXNcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyArb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBNM0VuYyA9IHRoaXMuZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVLCBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9EYXRhQ2Fycml0b0NvbXByYXMpO1xyXG4gICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZ3JlZ2FyIGEgY2Fycml0byBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBhZGR0b2NhcnQob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MDcyMiBzZSBhZ3JlZ2EgcGFyYSBjdWFuZG8gZXMgZWwgcHJpbWVyIHByb2R1Y3RvIHF1ZSBzZSBhZ3JlZ2Fyw4PCoVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WYWxpZGEgcXVlIGV4aXN0YSBwcm9kdWN0byBlbiBsb3MgZW5jYWJlemFkb3MuIFRydWU6IFNpIGV4aXN0ZSwgRmFsc2UgZGUgb3RybyBtb2RvXHJcbiAgICAvLyBTZSBjYW1iaWEgZnVuY2lvbmFsaWRhZCBkZSByZXR1cm4uXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1ByZEdybDogTTNQcmRHZW5lcmFsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgb0VuYzogTTNQRW5jSXRlbXMgPSBudWxsO1xyXG4gICAgICAgIHZhciBjYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IC0xO1xyXG4gICAgICAgIGlmIChvTTNMaXN0YUVuYyAhPT0gdW5kZWZpbmVkICYmIG9NM1ByZEdybCAhPT0gdW5kZWZpbmVkICYmIG9NM0xpc3RhRW5jLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIG9FbmMgPSBvTTNMaXN0YUVuYy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvTTNQcmRHcmwuU0tVICYmICFlbmMuSWRFbmNQYWRyZSAmJiB0aGlzLmdldENhbnRpZGFkUG9zaXRpdmEoZW5jKSk7XHJcbiAgICAgICAgICAgIGlmIChvRW5jICE9PSB1bmRlZmluZWQgJiYgb0VuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MTcgVmFsaWRhciBhaG9yYSBlbCBwcmVjaW8uXHJcbiAgICAgICAgICAgICAgICB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR3JsLCArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jLCBvTTNQcmRHcmwuTG9NM1ByZExpc3RhKSAmJiAhdGhpcy5WYWxpZGFyRXN0YVBhcXVldGUob0VuYywgb00zTGlzdGFFbmMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSBvRW5jLklEO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkID0gK29FbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbnRpZGFkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhbnRpZGFkUG9zaXRpdmEob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW50aWRhZCA9IDA7XHJcbiAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIilcclxuXHJcbiAgICAgICAgaWYgKGRldENhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkID0gK2RldENhbnRpZGFkLlZhbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHF1ZSBlbCBlbmNhYmV6YWRvIGNvbiBlbCBwcm9kdWN0byBhZ3JlZ2Fkbywgc2VhIHVuIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gb00zTGlzdGFFbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyRXN0YVBhcXVldGUob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNMaXN0YUVuYy5maW5kKHggPT4geC5JZEVuY1BhZHJlID09IG9NM1BFbmNJdGVtcy5JRCkpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgKiBAcGFyYW0gb0VuYyBcclxuICAgICAqIEBwYXJhbSBvTTNQcmRMaXN0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jOiBNM1BFbmNJdGVtcywgb00zUHJkTGlzdGE6IE0zUHJkTGlzdGEpIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0VuYzogbnVtYmVyID0gK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9MaXN0OiBudW1iZXIgPSBvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgICAgICBpZiAoZFByZWNpb0xpc3QgPT0gZFByZWNpb0VuYykge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIFZhbGlkYXJQcmVjaW9zUHJkc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBVcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvblxyXG4gICAgICAgICwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiA9IG51bGwpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICBpZiAobTNVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgdmFyIGxvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHRoaXMuZ3NJZGthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICB0aGlzLlByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIGxvTTNQSXRlbXNXRUIsIG0zVWJpY2FjaW9uLCB0cnVlKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhvRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbnRybzFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiRW50cm8yXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkbyBlbiBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2tcIik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5vRW5jYWJlemFkb00zQ29tcG9uZW50LlJlY2FyZ2FyQ2Fycml0bygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLkxvYWRDYXJ0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyB1cGRhdGVBUG91Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZWxldGVNM1Byb2Nlc28ob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgYXdhaXQgb00zRGF0YS5EZWxldGUoc0tleUNhcnJpdG8pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9FbGltaW5hciBkb2N1bWVudG8gZGUgY291Y2gvcG91Y2gsIGluaWNpbyB5IGFjdHVhbFxyXG4gICAgcHVibGljIERlbERvY3NTdGFydEFuZEN1cnJlbnQob00zRGF0YTogTTNEYXRhLCBzSURLYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBVYmljYWNpb25DdXJyZW50LCBIdWJDdXJyZW50KSB7XHJcbiAgICAgICAgLy9FbGltaW5hciBJbmljaWFsXHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPT0gdW5kZWZpbmVkICYmIG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIFwiSURIVUJcIjogb2xNM1Byb2Nlc29zLklESHViIH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIHN0YXJ0XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgLy9FbGltaW5hciBhY3R1YWxcclxuICAgICAgICAgICAgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IFViaWNhY2lvbkN1cnJlbnQudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBIdWJDdXJyZW50IH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIGN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhc2xhZGFyIGluZm9ybWFjacODwrNuIGRlIGNhcnJpdG8sIGRvcyB1c3Vhcmlvc1xyXG4gICAgcHVibGljIGFzeW5jIE1vdmVDYXJ0SW50b1VzZXIoc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyT3JpZ2VuOiBhbnksIG9EYXRhVXNlckRlc3Rpbm86IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b09yaWdlbjtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9EZXN0aW5vO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b09yaWdlbiA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvRGVzdGlubyA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBsZXQgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG9PcmlnZW4pO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzby5URG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLk5Eb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvW1wiX3JldlwiXTtcclxuICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0b0Rlc3Rpbm8sIG9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpb3MgdG90YWxlcyB5IGRlIGJhc2VcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxCYXNlO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3I6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvck5ldG86IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbCA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciAvLygrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSAqICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbEJhc2UgPSB0aGlzLkNhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKGVuYywgZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMQkFTRVwiKS5WYWxvciA9IFN0cmluZyhNYXRoLnJvdW5kKGRQcmVjaW9Ub3RhbEJhc2UgKiAxMDApIC8gMTAwKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yID0gKCtkVmFsb3IpICsgKCtkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yTmV0byA9ICgrZFZhbG9yTmV0bykgKyAoK2RQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuUmVjYWxjdWxvSW1wdWVzdG9zKGVuYywgZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gLy9vTTNQcm9jZXNvcy5WYWxvciA9IGRWYWxvcjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1JlY2FsY3VsYXIgcHJlY2lvcy4gcmVjb3JyaWVuZG8gbG9zIGVuY2FiZXphZG9zLlxyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIHZhbG9yID0gMDtcclxuICAgICAgICB2YXIgVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAxMCBzZSBjYW1iaWEgZWwgdmFsb3IgZGVsIHByZWNpbyB1bml0YXJpbyBiYXNlLCB5YSBxdWUgYWwgbW9tZW50byBkZSBsbGFtYXIgbGEgZnVuY2nDg8KzbiBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc29cclxuICAgICAgICAgICAgLy8gc2UgcmVjYWxjdWxvIGVsIHByZWNpbyB0b3RhbCwgZGVwZW5kaWVuZG8gZGUgZXN0ZSB2YWxvci5cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2UoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpLlZhbG9yLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vTWF0aFRGLnJvdW5kKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciwgMikpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZEVuYyA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGlmICgrZENhbnRpZGFkRW5jICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9ICgrcFRvdGFsQmFzZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKGVuYywgK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBiYXNlIGRlIHVuIHByZWNpbywgdGVuaWVuZG8gZWwgdmFsb3IgdG90YWwgbyBuZXRvLlxyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9OZXRvOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JJbXB1ZXN0byA9ICgrZFZhbG9ySW1wdWVzdG8pICsgKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgoK2RQcmVjaW9OZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlY2FsY3VsbyBkZSB2YWxvciBkZSBpbXB1ZXN0b3MsIGN1YW5kbyBjYW1iaWEgZWwgdmFsb3IuIFNlYSBwb3IgY2FudGlkYWQsIGVsaW1pbmFjacODwrNuLi4uXHJcbiAgICAvLyBwdWJsaWMgUmVjYWxjdWxvSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9CYXNlOiBudW1iZXIpIHtcclxuICAgIC8vICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGltcC5WYWxvciA9ICgrZFByZWNpb0Jhc2UpICogKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBudWV2byBjb25jZXB0b1xyXG4gICAgLy8gICAgICAgICBpbXAuQmFzZSA9IGRQcmVjaW9CYXNlO1xyXG4gICAgLy8gICAgICAgICBkVG90YWxJbXB1ZXN0byA9ICgrZFRvdGFsSW1wdWVzdG8pICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgICAgICAvL1N1bWEgZGUgcHJlY2lvIGJhc2UgXHJcbiAgICAvLyAgICAgICAgIGRQcmVjaW9CYXNlID0gKCtkUHJlY2lvQmFzZSkgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgZFRvdGFsSW1wdWVzdG8gPSBNYXRoLnJvdW5kKGRUb3RhbEltcHVlc3RvICogMTAwKSAvIDEwMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgPSBkVG90YWxJbXB1ZXN0by50b1N0cmluZygpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFjaW9uIG51ZXZvIE0zIHByb2Nlc29zLCBlc3RlIHZhIHZhY2lvIHNpbiBuaXNpcXVpZXJhIE0zUEVuY0l0ZW1zLiBcclxuICAgICAqIFNlIHV0aWxpemEgcHJpbmNpcGFsbWVudGUgcGFyYSBsYXMgY3JlYWNpb24gZGVzZGUgMCB1biBNMyBQcm9jZXNvLiBRdWUgcGFzYSBkZSBlc3RhZG9zICcnIGFsIHByaW1lciBlc3RhZG9cclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvX2Rlc3Rpbm8gXHJcbiAgICAgKiBAcGFyYW0gdGRvYyBcclxuICAgICAqIEBwYXJhbSBuZG9jIFxyXG4gICAgICogQHBhcmFtIGVzdGFkb3NfZnV0dXJvcyBcclxuICAgICAqIEBwYXJhbSBpZEh1YiBcclxuICAgICAqIEBwYXJhbSBpZFViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZU0zTmV3UHJvY2Vzb0VtcHR5KGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRwcm9jZXNvX2Rlc3Rpbm86IHN0cmluZywgdGRvYzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsXHJcbiAgICAgICAgZXN0YWRvc19mdXR1cm9zOiBBcnJheTxhbnk+LCBpZEh1Yjogc3RyaW5nLCBpZFViaWNhY2lvbjogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IGlkcHJvY2Vzb19kZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uU0VfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLklESHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMSA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVERvYyA9IHRkb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk5Eb2MgPSBuZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvL0N1YW5kbyBzZSBhZ3JlZ2EgcG9yIHByaW1lcmEgdmV6IGFsIGNhcnJpdG8gZGUgY29tcHJhLlxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb0RhdGFVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvL3NJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVERvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk5Eb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMSA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICAvLy9BR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLklESHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5JREh1YjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLlViaWMxO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuXHJcbiAgICAgICAgLy8vRklOIEFHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX28gIT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuRXN0YWRvX28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX287XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5Fc3RhZG9fbztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gXCJNM0VDQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAvL3RoaXMuUHJvY2VzYW1pZW50b1NlcnZpY2UoUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3MsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9DYXJnYXIgbnVldm9zIGFkaWNpb25hbGVzIGFkaWNpb25hbGVzXHJcbiAgICBwdWJsaWMgTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCk6IE0zUEl0ZW1zV0VCIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVBST0RTRVJWXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIlVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgcHJvY2Vzb3MsIHJldG9tYW5kbyBkZXNkZSBkYXRhXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1Byb2Nlc29zLlZhbG9yO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9PSBcIlwiICYmIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIHZhbG9yRGVzY3VlbnRvLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8gPSAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy9WYWxpZGFjaW9uIGRlIEludmVudGFyaW8uXHJcbiAgICAgICAgbGV0IGFkaVZlbnRhTmVnID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBcIlZFTlRBTkVHXCIpXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJNM0VDQ1wiICYmIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCAmJiBvTTNVYmljYWNpb24uTTNIVUJTWzBdLlRpcG8gPT0gXCJXRUJcIiAmJiAhKGFkaVZlbnRhTmVnICYmIGFkaVZlbnRhTmVnLlZBTE9SKSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSA9ICdObyBoYXkgaW52ZW50YXJpbyBwYXJhIGFncmVnYXIgJyArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgKyAnIEl0ZW1zJztcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFO1xyXG4gICAgICAgIH0gLy9lbHNlIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1BFbmNJdGVtcyA9IHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvUGFkcmVNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8pO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgLy9UaWVuZSB1biBlbmNhYmV6YWRvIHBhZHJlLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9QYWRyZU0zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgdmFyIG9sTTNQcmRQYWNrRGV0OiBBcnJheTxNM1ByZFBhY2tEZXQ+O1xyXG4gICAgICAgICAgICBvbE0zUHJkUGFja0RldCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0tcclxuICAgICAgICAgICAgaWYgKG9sTTNQcmRQYWNrRGV0ICYmIG9sTTNQcmRQYWNrRGV0Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCB2YWxvckRlc2N1ZW50b1BhY2sgPSB0aGlzLmNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbE0zUHJkUGFja0RldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQgPSBvbE0zUHJkUGFja0RldFtpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFja00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gT2JqZWN0LmFzc2lnbih7fSwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9NM1ByZFBhY2tEZXQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUHJkUGFja0RldC5nc1BhdGhJbWFnZW47XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgKiBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5DYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyBpICsgMjsgLy9Fc3RvIGZ1bmNpb25hIHNpIHRpZW5lIHNvbG8gMiBuaXZlbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlc3RvIHNlIGN1bXBsZSBlc3RlIHByb2R1Y3RvIGVzIHVuIHBhY2sgeSB0aWVuZSBwcm9kdWN0b3MgYXNvY2lhZG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBvTTNQcmRQYWNrRGV0Lk0zR1JQLCBvTTNQcm9jZXNvcy5NM0VOQywgcGFja00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcywgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjIzLCBlc3RvIGVzIGN1YW5kbyBzZSBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSBwcm9kY3V0b3MgZXhpc3RlbnRlcy5cclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOSBlbnZpbyBkZSBwYWRyZSBkZXNkZSBpbnN0cnVjY2lvbiBtYXMgYXJyaWJhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5UaXBvQWdydXBhY2lvbiA9IG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob00zUERpbmFtaWNhc0J5QWN0aXZpZGFkICYmIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQuZm9yRWFjaChkaW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BEaW5hbUJ5QWN0aXZpZGFkLnB1c2goey4uLiBkaW59KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0gPSBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1Byb2Nlc2FkbyA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCB2YWxvckRlc2N1ZW50b1BhY2sgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckl0ZW1zQ29tYm9TdW1hID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JGaW5hbENvbWJvID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0suZm9yRWFjaChwcmRQYWNrID0+IHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkID0gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA/IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgOiAxO1xyXG4gICAgICAgICAgICBsZXQgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJkUGFjay5NM0dSUCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLklETElTVEEpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPKVxyXG4gICAgICAgICAgICB2YWxvckl0ZW1zQ29tYm9TdW1hICs9IChwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh2YWxvckl0ZW1zQ29tYm9TdW1hID4gdmFsb3JGaW5hbENvbWJvKSB7XHJcbiAgICAgICAgICAgIHZhbG9yRGVzY3VlbnRvUGFjayA9IDEwMCAtICh2YWxvckZpbmFsQ29tYm8gKiAxMDAgLyB2YWxvckl0ZW1zQ29tYm9TdW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh2YWxvckRlc2N1ZW50b1BhY2spXHJcbiAgICAgICAgcmV0dXJuIHZhbG9yRGVzY3VlbnRvUGFjaztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcyBkZSBoaWpvcyBkZWwgcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1ByZFBhY2tEZXQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCkge1xyXG4gICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb2RpZ286IHN0cmluZywgdmFsb3IsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSWRQcm9kdWN0byA9IGNvZGlnbztcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLkxvdGUgPSBcIjFcIjtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk5vbWJyZSA9IFwiQ29tYm9cIjtcclxuXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT0NPTUJPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiRU5DUFJPTU9cIiwgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJVTklURklERUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJGSURFTElaQUNJT05cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMUFJPTU9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG9Db21ibyk7XHJcbiAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5mb3JFYWNoKHByb2R1Y3RvID0+IHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgcHJvZHVjdG8uSWRFbmNQYWRyZSA9IHByb2R1Y3RvQ29tYm8uSUQ7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG8pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0NvbWJvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zQXBsU3VtYVZhbG9yID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKG9NM0VOQyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGV0RXNQcmRDb21ibyA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkVTUFJPRFBST01PQ09NQk9cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwICYmICEoZGV0RXNQcmRDb21ibyAmJiBkZXRFc1ByZENvbWJvLlZhbG9yID09IFwidHJ1ZVwiKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gMDtcclxuXHJcbiAgICAgICAgLy9mb3IgKGNvbnN0IG9NM0VOQyBvZiB0aGlzLm9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIWVuYy5JZEVuY1BhZHJlIHx8IGVuYy5JZEVuY1BhZHJlIDw9IDApKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvTTNFTkMgb2YgcHJvZHVjdG9zQXBsU3VtYVZhbG9yKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgTTNQcm9jZXNvIGVuY2FiZXphZG8gaXRlbXMsIGRlc2RlIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyA9IHVuZGVmaW5lZCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQRW5jSXRlbXMge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICB2YXIgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICB2YXIgaW5mTml2ZWxlc1ByY2lvO1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgdmFyIGRUb3RhbEltcHVlc3Rvc1RvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Nb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvUHJvbW86IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIC8vVmVyaWZpY2FyIGVsIHByZWNpbyBhIHVzYXIsIHVzYW5kbyBsYSBsb2dpY2EgZGUgbml2ZWxlcyBkZSBwcmVjaW9zLlxyXG4gICAgICAgIGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcbiAgICAgICAgaWYgKHZhbG9yRGVzY3VlbnRvID4gMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiB2YWxvckRlc2N1ZW50byAvIDEwMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gZXN0w4PCoSByZXN0aW5naWRvXHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZWwgdG90YWwgZGUgcHVudG9zIHkgZWwgdmFsb3IgdG90YWwgZGUgbGEgcHJvbW9jacODwrNuIHBvciBsYSBjcWFudGlkYWQgZGUgcHJvZHVjdG9zIGRlIGxhIG1pc21hIHJlZmVyZW5jaWFcclxuICAgICAgICAgICAgZFVuaXRhcmlvTW9uZWRlcm8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybzsgLy9Vbml0YXJpbyBNb25lZGVyb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG5cclxuICAgICAgICAgICAgZFVuaXRhcmlvUHJvbW8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uOyAvL1Byb21vY2lvbiB1bml0YXJpb1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zRGV0Q3Vwb25lcyA9IHRoaXMuZ2V0X2xpc3RfY3Vwb25lc19mcm9tX3Byb21vKG9Qcm9tb2Npb25Qcm9jZXNhZGEsICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FsY3VsbyBkZSBwcmVjaW8gdG90YWwsIGRlc3B1ZXMgZGUgcHJvbW9jaW9uZXNcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYXJnYXIgcHJvZHVjdG8gXHJcbiAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0byA9IG9NM1ByZEdlbmVyYWwuU0tVO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTG90ZSA9IG9NM1ByZEdlbmVyYWwuTE9URTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob2VuY2FiZXphZG9JdGVtcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Ob21icmUgPSBvTTNQcmRHZW5lcmFsLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFID0gb00zUHJkR2VuZXJhbC5ESVNQT05JQkxFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuUGF0aEltYWdlID0gb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW47XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Db2RpZ29CYXJyYXMgPSBvTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzO1xyXG4gICAgICAgICAgICBsZXQgcFRvdGFsQmFzZSA9IHRoaXMuQ2FsY3VsYXRlUHJlY2lvQmFzZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCB0aGlzLm9NYXRoVEYucm91bmQoYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKSwgMikpO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLmRDYW50aWRhZCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSBwVG90YWxCYXNlIC8gb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRUb3RhbEltcHVlc3Rvc1RvdGFsID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBvTTNQRW5jSXRlbXMsIHBUb3RhbEJhc2UsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpO1xyXG5cclxuICAgICAgICAgICAgLyoqIElOSUNJTyBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcycpLCBcIkZFQ0hBSU5cIikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc09ic2VxdWlvLnRvU3RyaW5nKCksIFwiRVNPQlNFUVVJT1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5TS1AxLCBcIlBSRF9FU1RJTE9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIFwiQ1RCTERJTVBQUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5vYnNlcnZhY2lvbi50b1N0cmluZygpLCBcIk9CU0VSVkFDSU9OXCIpKTsgICAgICAgICAgICAgICAgICAvLy0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuLCBcIlBBVEhJTUFHRU5cIikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkJpc1Byb2R1Y3RvUHJvbW8udG9TdHJpbmcoKSwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuVElQTywgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLlVuaWRhZCwgXCJVTklEQURcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViwgXCJDTEFWRVBST0RTRVJWXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQsIFwiQ0xBVkVVTklEQURcIikpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEl0ZW1zSW50ZXJmYXoob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICB0aGlzLmNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQilcclxuICAgICAgICAgICAgdGhpcy5Mb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vIExpc3RhIGRlIFByb21vY2lvbmVzIFxyXG4gICAgICAgICAgICAvKipGSU4gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG5cclxuICAgICAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkUFJFQ0lPVW5pdEJhc2UudG9TdHJpbmcoKSwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVG90YWxJbXB1ZXN0b3NUb3RhbC50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgodGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJUT1RBTElNUFVFU1RPU1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPIC0gK2RUb3RhbEltcHVlc3Rvc1VuaXRhcmlvKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCtkUFJFQ0lPVW5pdEJhc2UgKyBkVW5pdGFyaW9Qcm9tbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYSAvL0ZTIDIwMTkwNzI1IENvcnJlY2Npb24gZW4gbGEgZm9tcmEgZGUgY2FsY3VsYXJsb1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTy50b1N0cmluZygpLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLnRvU3RyaW5nKCksIFwiUFVOSVRORVRPXCIpKTsvL0NvbiBkZXNjdWVudG8gaW5jbHVpZG8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvTW9uZWRlcm8udG9TdHJpbmcoKSwgXCJVTklURklERUxcIikpOy8vVW5pdGFyaW8gZmlkZWxpemFjaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Qcm9tby50b1N0cmluZygpLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuXHJcbiAgICAgICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgICAgICAvLyAqKiogSW5mb3JtYWNpb24gZGUgYWNjaW9uZXMgZW4gZWwgY2xpZW50ZSAqKipcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5lbmNvbnRyYWRvTG9jYWwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJMT0NBTFwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJTRVJWSURPUlwiLCBcIkNPTlNVTFRPRU5cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL2lmICghb1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlNVQlRPVEFMXCIpLlZhbG9yKSAvLyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAoK29NM1Byb2Nlc29zLlZhbG9yTmV0bykgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcik7XHJcbiAgICAgICAgICAgIC8vfVxyXG5cclxuICAgICAgICAgICAgLy9WZXJpZmljYXIgb2JzZXF1aW9zIGRlbCBwcm9kdWN0byBxdWUgc2UgaW5ncmVzbyBhbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJPYnNlcXVpb3Mob1Byb21vY2lvblByb2Nlc2FkYSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy50dXJuT25Qcm9tb3Mob1Byb21vY2lvblByb2Nlc2FkYSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSA9IFwiUHJvZHVjdG8gUmVzdHJpbmdpZG9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRW5jSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHRydWUgc2kgZXN0ZSBwcm9kdWN0byBzZSBlbmN1ZW50cmEgcmVzdHJpbmdpZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9tb1Jlc3RyaW5naWRvID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9SZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBtw4PCoXhpbW8gdmFsb3IgZGUgdW4gYXRyaWJ1dG8gZGVudHJvIGRlIGxhIGxpc3RhIGN1YWxxdWllcmEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShsaXN0YSwgYXRyaWJ1dG8pIHtcclxuICAgICAgICBpZiAobGlzdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgbGlzdElEID0gbGlzdGEubWFwKHggPT4geFthdHJpYnV0b10pO1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgbGlzdElEKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsb3JlcyBDYWxjdWxhZG9zIHBvciBwcm9jZXNvLlxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkQ2FudGlkYWQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZENhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICAvKiogSU5JQ0lPIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICAgICAgLy8gdmFyIGRUb3RhbEltcHVlc3RvcyA9ICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIilcclxuICAgICAgICAvLyB2YXIgZFN1YlRvdGFsID0gTWF0aC5yb3VuZCgoK2RQcmVjaW9Ub3RhbFNpbkR0byAtICtkVG90YWxJbXB1ZXN0b3MpICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICAgICAgbGV0IHN1YlRvdGFsID0gMDtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxTaW5EdG8gPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbEltcHVlc3Rvc1xyXG4gICAgICAgIC8vQWdyZWdhciBJbXB1ZXN0b3NcclxuICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBBcnJlZ2xvIGVuIGVsIGNhbGN1bG8gZGUgdG90YWxlcyBlbiBjYXNvIGRlIGhhYmVyIGltcHVlc3Rvc1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy9TdWJ0b3RhbCBTdW1hcyBkZSBsYXMgYmFzZXNcclxuICAgICAgICAgICAgc3ViVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoKCh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkgKyAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlZVTklUUFJPTU9cIikpKSwgMik7XHJcbiAgICAgICAgICAgIHRvdGFsSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXMsIFwiVmFsb3JcIik7XHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gc3ViVG90YWwgKyB0b3RhbEltcHVlc3RvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vU2UgYXN1bWUgcXVlIG5vIGhheSBpbXB1ZXN0b3MgZW50b25jZXMgZWwgc3ViVG90YWwgZXMgaWd1YWwgYWwgcHJlY2lvVG90YWxTaW5EdG9cclxuICAgICAgICAgICAgcHJlY2lvVG90YWxTaW5EdG8gPSB0aGlzLm9NYXRoVEYucm91bmQodGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRcIiksIDIpO1xyXG4gICAgICAgICAgICBzdWJUb3RhbCA9IHByZWNpb1RvdGFsU2luRHRvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCh0b3RhbEltcHVlc3RvcywgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRVbml0YXJpb0J5VG90YWwoZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKTtcclxuXHJcbiAgICAgICAgLy9MYSBmaWRlbGl6YWNpb24gZXMgdW4gcG9yY2FudGFqZSBwb3IgZW5kZSBubyBkZWJlIG11bHRpcGxpY2Fyc2UgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVU5JVEZJREVMXCIpLnRvU3RyaW5nKCksIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJVTklURklERUxcIikuVmFsb3IsIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMUkVBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBwcmVjaW9Ub3RhbFNpbkR0by50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHN1YlRvdGFsLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBcIkZVVFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIik7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3MgICAgICAgIFxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoKHN1YlRvdGFsICsgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciAtICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG5cclxuICAgICAgICAvKiogRklOIFZBTE9SRVMgRElOQU1JQ09TICovXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIHN1bWF0b3JpYSBkZSBsb3MgdmFsb3JlcyBkZSB1biBhdHJpYnV0byBkYWRvIGRlbCBhcnJlZ2xvIGRlIGltcHVlc3Rvc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBhdHJpYnV0byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFZhbG9yVG90YWxGcm9tSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGF0cmlidXRvOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzdW1hdG9yaWEgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICBjb25zdCBpbXB1ZXN0byA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3NbX2ldO1xyXG4gICAgICAgICAgICBzdW1hdG9yaWEgPSBzdW1hdG9yaWEgKyAoK2ltcHVlc3RvW2F0cmlidXRvXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdW1hdG9yaWE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZ3JlZ2FySW1wdWVzdG8ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBkZXRfY3RibGRfaW1wX3ByZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKTtcclxuICAgICAgICBsZXQgZGV0X3ByZWNpb191bml0X2Jhc2UgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIik7XHJcbiAgICAgICAgbGV0IHZhbG9yVG90YWxJbXB1ZXN0b3M6IG51bWJlciA9IDA7XHJcbiAgICAgICAgaWYgKGRldF9jdGJsZF9pbXBfcHJkICYmIGRldF9wcmVjaW9fdW5pdF9iYXNlKSB7XHJcbiAgICAgICAgICAgIHZhbG9yVG90YWxJbXB1ZXN0b3MgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKGRldF9jdGJsZF9pbXBfcHJkLlZhbG9yLCBvTTNQRW5jSXRlbXMsICtiaWdEZWNpbWFsLm11bHRpcGx5KGRldF9wcmVjaW9fdW5pdF9iYXNlLlZhbG9yLCBjYW50aWRhZCksIGNhbnRpZGFkLCArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvclRvdGFsSW1wdWVzdG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGV0OiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgb0RldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gc0NvbmNlcHRvKTtcclxuICAgICAgICBpZiAob0RldCkge1xyXG4gICAgICAgICAgICAvLyBFeGlzdGUgQWN0dWFsaXphXHJcbiAgICAgICAgICAgIG9EZXQuVmFsb3IgPSB2YWxvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL05vIGV4aXN0ZSBhZ3JlZ2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvci50b1N0cmluZygpLCBzQ29uY2VwdG8pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHRvdGFsXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgTnVldmEgQ2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NVbml0YXJpbyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRUb3RhbEJ5VW5pdGFyaW8oY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1VuaXRhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdW5pdGFyaW8gPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NVbml0YXJpbykuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArYmlnRGVjaW1hbC5tdWx0aXBseSh1bml0YXJpbywgY2FudGlkYWQpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHVuaXRhcmlvXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NUb3RhbCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRVbml0YXJpb0J5VG90YWwoY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1RvdGFsOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoK2NhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1RvdGFsKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICt0b3RhbCAvICtjYW50aWRhZDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIHJlbGFjaW9uYWRvcyBjb24gbGEgaW5mb3JtYWNpb24gZGUgc3cgZXh0ZXJuby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDg8KhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsODwqEgbGEgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbGVzRmlsdGVyOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPjtcclxuICAgICAgICAgICAgb0FkaWNpb25hbGVzRmlsdGVyID0gb0FkaWNpb25hbGVzLmZpbHRlcihhID0+IGEuQVRSSUJVVE8uc3RhcnRzV2l0aChcIkNTSUFfXCIpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXNGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzRmlsdGVyW2ldLlZBTE9SLCBvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw4PCoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDg8KhIGxhIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQURDX1wiICsgb0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQ0FNQURDX1wiICsgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBOb21icmUsIElELiBhIGRldGFsbGUgZGVsIGVuY2FiZXphZG8gZGUgcHJvZHVjdG8gYWdyZWdhZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIEluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIHByb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQ6IG51bWJlciwgYXBsaWNhZGFzID0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciBzTm9tYnJlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc0lkczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc1ZhbG9yZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsaWNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+ICF4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhID0geyBcIk5PTUJSRVNcIjogc05vbWJyZXMsIFwiSURcIjogc0lkcywgXCJWQUxPUkVTXCI6IHNWYWxvcmVzIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBzTm9tYnJlcyBcclxuICAgICAqIEBwYXJhbSBzSWRzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ1wiKSk7XHJcblxyXG4gICAgICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgICAgIGxldCBsaXN0Tm9tYnJlID0gZGF0YS5OT01CUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdElkID0gZGF0YS5JRC5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RWYWxvciA9IGRhdGEuVkFMT1JFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0SWQubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3ROb21icmVbX2ldLCBcIk5PTUJfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdElkW19pXSwgXCJJRF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0VmFsb3JbX2ldLCBcIlZBTF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQsIGZhbHNlKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXJnYXIgYSBkZXRhbGxlIGluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gaW5mTml2ZWxlc1ByY2lvIEluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBjYXJnYXLDg8KhIGxhIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKGluZk5pdmVsZXNQcmNpbyAmJiBpbmZOaXZlbGVzUHJjaW8uTklWRUwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGluZk5pdmVsZXNQcmNpby5OSVZFTCwgXCJOSVZFTFBSRUNJT1wiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGNvbiBxdWUgbml2ZWwgZGUgcHJlY2lvIHZhIGEgdHJhYmFqYXJcclxuICAgICAqIEBwYXJhbSBwcm9kR1JQU2VsZWN0ZWQgRWwgcHJvZHVjdG8gaW5ncmVzYWRvXHJcbiAgICAgKiBAcGFyYW0gaUNhbnRpZGFkIExhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgdmEgYSBpbmdyZXNhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmXHJcbiAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWwsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgZGUgbGEgbGlzdGEgZGUgcHJvbW9wcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIpOiBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+IHtcclxuICAgICAgICB2YXIgbGlzdF9jdXBvbmVzID0gQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG5cclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vX2Fzb2NpYWRhID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXNbX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb19hc29jaWFkYS5JZEN1cG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cG9uID0gbmV3IE0zUERldGFsbGVDdXBvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLklkQ3Vwb24gPSBwcm9tb19hc29jaWFkYS5JZEN1cG9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdF9jdXBvbmVzLnB1c2goY3Vwb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jdXBvbmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQXNpZ25hciBhIHByb21vY2lvbmVzIGNvbWJpYW5hcyBkZXNkZSBsbyBxdWUgc2UgZW5jb250csODwrMgYWwgZW5jYWJlemFkbyBpdGVtLCBkZWwgcHJvZHVjdG8gc2VsZWNjaW9uYWRvXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW9Bc28gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBhZ3JlZ2EgcHJvbW9jaW9uIGNvbWJpbmFkYSBhIGVuY2FiZXphZG8gZGUgaXRlbXMuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcy5wdXNoKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vQWdyZWdhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyksIFwiUFJPTU9DT01CSVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3MsIHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzaWduYXIgcHJvbW9jaW9uZXMgY29tYmlhbmRhcyBhIE0zIFByb2Nlc28sIGVzdGUsIHZhbGlkYSBxdWUgbm8gZXhpc3RhIHVuIHByb21vY2lvbiBhbnRlcmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpKSB7XHJcbiAgICAgICAgICAgIC8vLy8vLy8gZXhpc3RlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vLy8vIE5vIEV4aXN0ZVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLnB1c2gob1Byb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGRpbmFtaWNhcyBwcm9jZXNvIGRlIGNvbWJpbmFkYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhc0ZpbmRlZDogTTNQRGluYW1pY2FzO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBpZiAob00zUERpbmFtaWNhc0ZpbmRlZCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4gPSBKU09OLnBhcnNlKG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyclByb21vLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb21vQ29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gYXJyUHJvbW9baV0uSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9Db21iaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMucHVzaChhcnJQcm9tb1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IFwiQ09NQklOQURBXCI7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsbyBkZSBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgIHZhciBsVGlwb3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiRElSRUNUQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1PTkVERVJPXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTUFOVUFMXCIpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAob00zRU5DUFJPTU8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tbyA9IG9wcm9tb2Npb25lc1NlcnZpY2UuVmVyaWZpY2FyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zKTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9jaW9uKGFyclByb21vLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM0VOQ1BST01PKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaGF5IGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyB5IGFncmVnYXJsb3MuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLkxpc3RPYnNTS1UgIT0gbnVsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwgJiYgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW8gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID09IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvbW8uTGlzdE9ic1NLVS5sZW5ndGgpIHByb21vLkxpc3RPYnNTS1UgPSBbcHJvbW8uTGlzdE9ic1NLVV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGFTaVRpZW5lT3RyYVByb21vKHByb21vLCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXF1aW9PUHJvbW8gPSBwcm9tby5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFybWFyTGlzdGFPYnNlcXVpb3NTS1UocHJvbW8sIG9NM1BFbmNJdGVtcywgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhczogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+O1xyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIocHJvbW8gPT4gcHJvbW8ubElkQWN0aXZhUHJvbW8gJiYgcHJvbW8ubElkQWN0aXZhUHJvbW8ubGVuZ3RoID4gMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyclByb21vY2lvbmVzQXNvY2lhZGFzICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sSWRBY3RpdmFQcm9tbyA9IHRoaXMubElkQWN0aXZhUHJvbW8uY29uY2F0KHByb21vLmxJZEFjdGl2YVByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUR1cGxpY2F0ZXModGhpcy5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUR1cGxpY2F0ZXMoYXJyOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdmFyIHVuaXF1ZSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh1bmlxdWUuaW5kZXhPZihhcnJbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdW5pcXVlLnB1c2goYXJyW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBjYW50aWRhZFJlYWwgPSBNYXRoLmZsb29yKGNhbnRpZGFkIC8gcHJvbW8uQ2FudGlkYWRPYnNlcSk7XHJcbiAgICAgICAgaWYgKHByb21vLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkUmVhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpbyhwcm9tbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkUmVhbCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBwcm9tby5MaXN0T2JzU0tVO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW86IFByb21vY2lvbmVzQXNvY2lhZGFzLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKHByb21vLkxpc3RPYnNTS1UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tby5MaXN0T2JzU0tVLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoY29tYmkuQWNjaW9uLlJlZ2xhT2JzZXEgPT0gXCJFWENcIikge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0NhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8oY29tYmkuQWNjaW9uLk9CU0VRVUlPUywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgY29tYmkuQWNjaW9uLk9CU0VRVUlPUy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5DYW50aWRhZCA9IGNhbnRpZGFkICogK2VsZW1lbnQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9MaXN0YU9ic2VxdWlvcyA9IGNvbWJpLkFjY2lvbi5PQlNFUVVJT1M7XHJcbiAgICB9XHJcblxyXG4gICAgYXNpZ25hcklkRW5jUGFkcmVPYnNlcXVpb0NvbWJpbmFkbyhvYnNlcXVpb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICBpZiAob2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JzZXF1aW9zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmlkRW5jUGFkcmUgPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1JldG9ybmEgdHJ1ZSBzaSBoYXkgb3RyYSBwcm9tbyBhcGxpY2FkYSBkb25kZSBuaSBsYSBwcm9tbyBkZSBvYnNlcXVpbyBvIGxhIGFwbGljYWRhIHNvbiBmaWphcyB5IHVuYSBkZSBsYXMgZG9zIGVzIEVYQ1xyXG4gICAgdmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tb09ic2VxdWlvOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChwcm9tb09ic2VxdWlvLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgbGV0IG9Qcm9tb3NOb09ic2VxdWlvcyA9IGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+IHguSURQcm9tb2Npb24gIT0gcHJvbW9PYnNlcXVpby5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW8gb2Ygb1Byb21vc05vT2JzZXF1aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW8uUmVnbGEgIT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5BcGxpY2FkYSAmJiAocHJvbW8uUmVnbGEgPT0gXCJFWENcIiB8fCBwcm9tb09ic2VxdWlvLlJlZ2xhID09IFwiRVhDXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3Byb2Nlc2FtaWVudG8gZGUgb2JzZXF1aW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gLTE7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvcyAhPSBudWxsICYmIHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vTGlzdGFPYnNlcXVpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uU0tVKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDgxMCB2YWxpZGEsIGN1YW50b3MgcHJvZHVjdG9zIHNlIGFncmVnYSBlbiBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMTEyIHNlIGFncmVnIGZ1bmNpb25hbGlkYWQgZGUgb2JzZXF1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1BhZHJlID0gdGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0uaWRFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlRpcG9BZ3J1cGFjaW9uID0gXCJPQlNRXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuR3VhcmRhclByb21vY2lvbih0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXSwgb0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0d1YXJkYXIgcHJvbW9jaW9uIHNlZ3VuIHVuIHNrdVxyXG4gICAgLy8xLiBCdXNjYXIgZWwgcHJvZHVjdG8gc2VndW4gZWwgc2t1XHJcbiAgICAvLzIuIEFncmVnYXIgZWwgcHJvZHVjdG8gYSBtM3Byb2Nlc29zXHJcbiAgICAvLzMuIEFncmVnYXIgYWwgY2Fycml0byBkZSBjb21wcmFzLlxyXG4gICAgcHVibGljIGFzeW5jIEd1YXJkYXJQcm9tb2Npb24ocHJvbW8sIG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gMjAxODExMjEgIHZhciBzS2V5Q2Fycml0bztcclxuICAgICAgICAvLyAyMDE4MTEyMSB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHByb2Nlc29Qcm9tbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIC8vIDIwMTgxMTIxIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcblxyXG4gICAgICAgIC8vIDIwMTgxMTIxIG9NM1Byb2Nlc29zID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcbiAgICAgICAgcHJvY2Vzb1Byb21vID0gYXdhaXQgdGhpcy5BZGljaW9uYXJQcm9tb2Npb25BUHJvY2Vzbyhwcm9tbywgb00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBFbkxpbmVhLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBwb3VjaCBEQlxyXG4gICAgICAgIC8vIDIwMTgxMTIxICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBwcm9jZXNvUHJvbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsb3MgcHJvZHVjdG8gc2VndW4gc3UgU0tVLCBzYWNhbmRvIGxhIGluZm9ybWFjaW9uIGRlc2RlIHBvdWNoREIuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKHByb21vLlNLVSwgRW5MaW5lYSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlcik7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChvUHJvZHVjdG8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvL1lhIG5vIHNlIGRlamEgcHJlY2lvIGNlcm8gc2lubyBxdWUgY29tbyBlcyBvYnNlcXVpbyBzaW11bGEgdW4gZGVzY3VlbnRvIGRlbCAxMDAlIFxyXG4gICAgICAgICAgICAvL1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgYSBtM3Byb2Nlc29zIGVsIG9ic2VxdWlvLlxyXG4gICAgICAgICAgICAvL29NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIG9Qcm9kdWN0bywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG51bGwsIG51bGwpO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCB0aGlzLmdzSWRrYXRpb3MsIG9NM1ViaWNhY2lvbiwgbnVsbCwgb00zUHJvY2Vzb3MsIG51bGwsIDEwMCk7Ly8qU2UgbWFuZGEgdmFsb3IgZGUgZGVzY3Vlbm50byAxMDAgJVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHNlZ3VuIGVsIFNLVVxyXG4gICAgcHVibGljIGFzeW5jIEdldFByb2R1Y3RvQnlTS1Uoc1NLVSwgRW5MaW5lYTogYm9vbGVhbiwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9EYXRhVXNlcjogYW55LCBkaXNwb25pYmxlTTNFbmMgPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgcHJvZHVjdG9zO1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lka2F0aW9zKTtcclxuXHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLkdlbmVyYXRlRGF0YVZhbGlkYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbyk7XHJcbiAgICAgICAgaWYgKCFFbkxpbmVhICYmICFvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIHtcclxuICAgICAgICAgICAgdmFyIHNJRFByb2R1Y3RvcyA9IHRoaXMuZ3NJZGthdGlvcyArIFwiP1BSRFwiO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3MgPSBhd2FpdCB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEUHJvZHVjdG9zKTtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gb1NlcnZpY2VNM01hZXN0cm8uR2V0TTNQcmRHcnBGcm9tTGlzdChwcm9kdWN0b3MuTTNMaXN0UHJvZHVjdG9zLk0zR1JQLCBzU0tVKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyh0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zLCBzU0tVLCBvRGF0YVVzZXIsIG9NM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPD0gMCAmJiBkaXNwb25pYmxlTTNFbmMpIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPSBkaXNwb25pYmxlTTNFbmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIHRoaXMuR29Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICAvL29TZXJ2aWNlTGlzdGFQcmVjaW8uVmFsaWRhckxpc3RhUHJlY2lvcyhvUHJvZHVjdG8sIHRoaXMuR29Qb3N0U2VydmljZU0zLCB0aGlzLmdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHJldHVybiBvUHJvZHVjdG87XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYWxjdWxhciBwcmVjaW8gc2luIGltcHVlc3Rvcy4gTGEgZm9ybWEgZXMgY2FsY3VsYXIgdG9kbyBlbCB2YWxvciBkZWwgaW1wdWVzdG8uIEVKOiAxMjAuMDkgLyAxLjE2LiBTaSBlbCB2YWxvciBkZWwgaW1wdWVzdG8gZXM6IDE2JVxyXG4gICAgcHVibGljIENhbGN1bGF0ZVByZWNpb0Jhc2UoQ1RCTERJTVBQUkQ6IHN0cmluZywgZFZhbG9yTmV0bzogbnVtYmVyKSB7XHJcbiAgICAgICAgLy92YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdmFyIGRWYWxvckJhc2U6IG51bWJlciA9IGRWYWxvck5ldG87XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgakltcHVlc3RvcztcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNICAyMDE5MDYyNiBDYW1iaW8gZGUgY2FsY3VsbyBkZSBiYXNlIGRlIGxvcyBpbXB1ZXN0b3MuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC8gKDEgKyAraW1wLiQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZFZhbG9yQmFzZSA9ICgrZFZhbG9yQmFzZSkgLSAoK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9NM1BFbmNJdGVtcy5NM0ltcHVlc3Rvcyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2F0Y2hcIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcmV0dXJuICgoK2RWYWxvck5ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgICAgIHJldHVybiBkVmFsb3JCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIGluZm9ybWFjacODwrNuIGRlIGltcHVlc3RvcywgZGVzZGUgZWwgcHJvZHVjdG8gZ2VuZXJhbFxyXG4gICAgcHVibGljIExvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKENUQkxESU1QUFJEOiBzdHJpbmcsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsXHJcbiAgICAgICAgZFZhbG9yTmV0bzogbnVtYmVyLCBjYW50aWRhZDogbnVtYmVyLCB2YWxvclRvdGFsUHJvZHVjdG9Vbml0OiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb3htbFRvSnNvblRGID0gbmV3IHhtbFRvSnNvblRGKCk7XHJcbiAgICAgICAgICAgIHZhciBvTTNQSW1wdWVzdG9zOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGxldCB2YWxvckJhc2VUb3RhbCA9IHRoaXMub01hdGhURi5yb3VuZChkVmFsb3JOZXRvLCAyKTtcclxuICAgICAgICAgICAgbGV0IHZhbG9yTmV0b1RvdGFsID0gdmFsb3JCYXNlVG90YWw7XHJcbiAgICAgICAgICAgIGxldCB2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yVG90YWxQcm9kdWN0b1VuaXQsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIHZhciBkVG90YWxJbXB1ZXN0bzogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgaWYgKENUQkxESU1QUFJEICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGpJbXB1ZXN0b3MgPSBveG1sVG9Kc29uVEYuY29udmVydFhtbFRvSnNvbihDVEJMRElNUFBSRCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjI2IENhbWJpbyBlbiBvcmRlbiBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUmVhbEltcCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcCA9IGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MgPSBuZXcgTTNQSW1wdWVzdG9zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byA9IGltcC4kLkNvZEltcDtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlBvcmNlbnRhamUgPSBpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wLiQuTWV0b2RvbG9naWEgPT0gXCJQT1JDRU5UQUpFXCIpIHsvL1BPUkNFTlRBSkVcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JSZWFsSW1wID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkoaW1wLiQuVmFsb3IsIHZhbG9yTmV0b1RvdGFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsvL0ZJSk9cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JSZWFsSW1wID0gK2ltcC4kLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLlZhbG9yID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yUmVhbEltcCwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChvTTNQSW1wdWVzdG9zLlZhbG9yIDwgdmFsb3JSZWFsSW1wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5jZWlsKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBvTTNQSW1wdWVzdG9zLkxpbWl0ZU9wdWVzdG8gPSArTWF0aC5mbG9vcigrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIE51ZXZvIGNvbmNlcHRvIGRlIGJhc2VcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zLkJhc2UgPSB2YWxvck5ldG9Ub3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9ICgrZFRvdGFsSW1wdWVzdG8pICsgKCtvTTNQSW1wdWVzdG9zLlZhbG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIFN1bWEgZGUgVmFsb3IgTmV0b1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yTmV0b1RvdGFsID0gKCt2YWxvck5ldG9Ub3RhbCkgKyAoK29NM1BJbXB1ZXN0b3MuVmFsb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLy9Tb2xvIGFkaWNpb25lIGEgaW1wdWVzdG9zLCBjdWFuZG8gZXMgdG90YWwgaW1wdWVzdG9zXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcEV4aXN0ZTogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcEV4aXN0ZSA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmluZChpbXAgPT4gaW1wLkNvZEltcHVlc3RvID09IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBFeGlzdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Cb3JyYSBlbiBpdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbHRlcihpbXAgPT4gaW1wLkNvZEltcHVlc3RvICE9IG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLnB1c2gob00zUEltcHVlc3Rvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5mb3JFYWNoKGltcCA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcyNiBzZSBhZ3JlZ2EgdmFsaWRhY2lvbiwgeWEgcXVlIGVzdGFiYSBxdWVkYW5kbyBsYSByZXN0YSwgY29uIHZhbG9yZXMgY29tbzogMC4wMDAwMDAwMDAwMSA9IDEuMTU2NDU2NDU2NGU4NDUgRUpcclxuICAgICAgICAgICAgaWYgKGRUb3RhbEltcHVlc3RvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vRGlmZXJlbmNpYSByZWRvbmRlYWRhIGEgZG9zIGRlY2ltYWxlc1xyXG4gICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSB0aGlzLm9NYXRoVEYucm91bmQoZFRvdGFsSW1wdWVzdG8sIDIpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQoKHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gdmFsb3JCYXNlVG90YWwgLSBkVG90YWxJbXB1ZXN0byksIDIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcIlRPVEFMSU1QVUVTVE9TXCJcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoKHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gdmFsb3JCYXNlVG90YWwpLCAyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwNzI1XHJcbiAgICAgKiBDb3JyaWdlIGVsIHZhbG9yIHF1ZSB0b21vIGVsIGltcHVlc3RvIGRlc3B1ZXMgZGUgaGFiZXJzZSByZWRvbmRlYWRvXHJcbiAgICAgKiBTaSBhbCByZWNvcnJlciB0b2RvcyBsb3MgaW1wdWVzdG9zIGxhIGRpZmVyZW5jaWEgbm8gc2UgemFuamEsIE5JIE1PRE9TIGVsIGVycm9yIGVzdMODwqEgZW4gb3RyYSBwYXJ0ZVxyXG4gICAgICogU2UgY3JlYSBlc3RhIGZ1bmNpw4PCs24gcGFyYSByZXNvbHZlciBsb3MgZXJyb3JlcyBkZSB0aW1icmFkbyBkZSBmYWN0dXJhIGVsZWN0csODwrNuaWNhXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgRGlmZXJlbmNpYSBxdWUgc2UgZGViZSBzYWxkYXIgcGFyYSBjb25zZWd1aXIgZWwgdmFsb3IgdG90YWwgZGUgaW1wdWVzdG9zIHJlcXVlcmlkb1xyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JEZUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhOiBudW1iZXIpIHtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBwb3NpdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtZW5vciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYXJyaWJhXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYXJyaWJhXCIgeSByZXN0YSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yIDwgaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcj5WYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgeSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgbmVnYXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWF5b3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhYmFqb1xyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFiYWpvXCIgeSBzdW1hIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPiBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPFZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgeWEgc2Ugc2FsZG8gbGEgZGlmZXJlbmNpYSByb21wZSBlbCBjaWNsbyBkYW5kbyBwb3IgY29uY2x1aWRvIGVsIGFqdXN0ZVxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0xvYWQgcG9yIHVuaWRhZCBkZXRhbGxlIGRlbCBtM3Byb2Nlc28gaXRlbXMuXHJcbiAgICBwdWJsaWMgTG9hZE0zUERldGFsbGUoc1ZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKTogTTNQRGV0YWxsZUl0ZW1zIHtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gc0NvbmNlcHRvO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBzVmFsb3I7XHJcbiAgICAgICAgcmV0dXJuIG9NM1BEZXRhbGxlSXRlbXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vR2VuZXJhciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICBwdWJsaWMgYXN5bmMgR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyB8fCAob00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyAmJiAhb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJQVUVOVEVfRElBUklPXCIpKSkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NvbXBhcmUgTTNQcm9jZXNvcy4gKEZpcnN0OiBAUGFyYW06IGlsTTNQcm9jZXNvc1NRTCBWUyBTZWNvbmQ6IEdldCBGcm9tIENvdWNoREIvUG91Y2hEQilcclxuICAgIHB1YmxpYyBhc3luYyBDb21wYXJlTTNQcm9jZXNvKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBpbE0zUHJvY2Vzb3NTUUw6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb1Jlc3A7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgdmFyIFByb3BlcnR5Q29tcGFyZSA9IFtcIlZhbG9yTmV0b1wiLCBcIlZhbG9yXCJdO1xyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIG9NM1Byb2Nlc29zQ09VQ0g6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0ggPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuXHJcbiAgICAgICAgICAgIC8vU3RhcnQgQ29tcGFyZVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb3BlcnR5Q29tcGFyZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlsTTNQcm9jZXNvc1NRTFtQcm9wZXJ0eUNvbXBhcmVbaV1dICE9IG9NM1Byb2Nlc29zQ09VQ0hbUHJvcGVydHlDb21wYXJlW2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9Db21wYXJlOiBJRCwgSWRQcm9kdWN0byB5IENBTlRJREFEXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlsTTNQcm9jZXNvc1NRTC5NM0VOQy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklEICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JRCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklkUHJvZHVjdG8gIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklkUHJvZHVjdG8gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogYlJlc3AsIFwiTTNQcm9jZXNvc1wiOiBvTTNQcm9jZXNvc0NPVUNIIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIENvbXBhcmVNM1Byb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogdHJ1ZSwgXCJNM1Byb2Nlc29zXCI6IG51bGwgfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGNvbWVyY2lhbCBhbCBwcm9jZXNvLCBsbyBhZGljaW9uYSBhbCBhcnJlZ2xvIGRlIGRpbmFtaWNvcyBhc29jaWFkbyBhbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIEFkZENvbWVyY2lhbFRvTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBUZG9jQ29tZXJjaWFsOiBzdHJpbmcsIE5kb2NDb21lcmNpYWw6IHN0cmluZykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJUQ09NRVJDSUFMXCIsIFRkb2NDb21lcmNpYWwpKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTkNPTUVSQ0lBTFwiLCBOZG9jQ29tZXJjaWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DcmVhY2lvbiB5IHJldG9ybm8gZGUgdHVwbGEgZGUgZGluYW1pY29zLCBhdGFkb3MgYSBwcm9jZXNvIG0zLlxyXG4gICAgcHVibGljIENyZWF0ZVR1cGxhRGluYW1pY2Eobm9tYnJlLCB2YWxvcikge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gbm9tYnJlO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSB2YWxvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BEaW5hbWljYXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0FjdHVhbGl6YSBsYSBjYW50aWRhZCBkZSBcclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZEFMTFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaUNhbnRpZGFkKSB7XHJcblxyXG4gICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vU2UgY2FudGlkYWQgZGUgdW4gcHJvZHVjdG8gZXNwZWNpZmljb1xyXG4gICAgcHVibGljIHNldENhbnRpZGFkWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLFxyXG4gICAgICAgIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgdGlwb1ViaWNhY2lvbiwgSURFbmMsXHJcbiAgICAgICAgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGZvcnphckJvcnJhZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmICgoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCAmJiB0aXBvVWJpY2FjaW9uID09IFwiV0VCXCIpIHx8IGZvcnphckJvcnJhZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBwcm9kLklEID09IElERW5jKSAmJiAhKHByb2QuSWRFbmNQYWRyZSA9PSBJREVuYykpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSkFHTSAyMDE5MTAyMSwgbm8gaGFjZXIgbMODwrNnaWNhIGRlIHByb21vY2lvbmVzIHkgdmFyaW9zLCBjdcODwqFuZG8gc2UgYm9ycmEgZWwgaXRlbS5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgdGlwb1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG0zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTykudGhlbihyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbiwgcmVzcC5NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbWJpYXIgY2FudGlkYWQgZGUgbTNwcm9jZXNvXHJcbiAgICAvL0pBR00gMjAxOTEwMTggU2UgYWdyZWdhIG51ZXZhIGZ1bmNpb25hbGlkYWQgYSBsYSBjYW50aWRhZDogXHJcbiAgICAvLzEuU2UgYm9ycmEgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGVsIHByb2Nlc29cclxuICAgIC8vMi4gU2UgYWdyZWdhIGRlIG51ZXZvIGVsIHByb2R1Y3RvIGNvbiBsYSBudWV2YSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBhc3luYyBzZXRDYW50aWRhZFYyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIElERW5jLCBvRGF0YVVzZXI6IGFueVxyXG4gICAgICAgICwgc0lES2F0aW9zOiBzdHJpbmcsIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgdmFyIG9Qcm9kdWN0bzogVHlwZU0zUHJkR3JwID0gbnVsbDtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IGlDYW50aWRhZDtcclxuICAgICAgICAvL0pBR00gMjAxOTExMTQsIEFncmVnYXIgaW1hZ2VuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQRW5jSXRlbXMuUGF0aEltYWdlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAhKGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiAoZW5jLklEID09IElERW5jIHx8IGVuYy5JZEVuY1BhZHJlID09IElERW5jKSkpO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCB0aGlzLkdldFByb2R1Y3RvQnlTS1UoaWRQcm9kdWN0bywgdHJ1ZSwgb00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvKTtcclxuICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuYWRkdG9jYXJ0KG9NM1BJdGVtc1dFQiwgb1Byb2R1Y3RvLCBudWxsLCBudWxsLCBvRGF0YVVzZXIsIHNJREthdGlvcywgbTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIHsgXCJNM1Byb2Nlc29cIjogb00zUHJvY2Vzb3MsIFwiTTNQSXRlbXNXRUJcIjogb00zUEl0ZW1zV0VCIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSlcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgY2FudGlkYWQgZGUgdW4gZW5jYWJlemFkbywgcHJvZHVjdG8gZXNwZWNpZmljby5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb2R1Y3RvOiBNM1ByZEdlbmVyYWwpIHtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gb1Byb2R1Y3RvLlNLVSAmJiBlbmMuTG90ZSA9PSBvUHJvZHVjdG8uTE9URSkuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWwob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vUkVHSU9OIERFIFJFQ0VQQ0lPTlxyXG4gICAgLy9TZSBhZ3JlZ2EgYXRyaWJ1dG8gZGUgQ3VycmVudCBjYW50aWRhZCBkZSByZWNlcGNpb25cclxuICAgIHB1YmxpYyBNZXJnZVJlY2VwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRSZWNlcGNpb246IG51bWJlcikge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQUmVjZXBjaW9uLmZpbHRlcihyZWNlcCA9PiByZWNlcC5JZFJlY2VwY2lvbiA9PSBpZFJlY2VwY2lvbikuZm9yRWFjaChyZWMgPT4ge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklEID09IHJlYy5JZEVuYykuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHJlYy5DYW50aWRhZC50b1N0cmluZygpLCBcIkNVUkNSRUNcIikpOy8vQ1VSUkVOVCBDQU5USURBRCBSRUNFUENJT05cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDg8KtIG1pc21vIGFncmVnYSBtw4PCoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ1JlYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNSRUNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vLy8vRklOIFJFR0lPTiBERSBSRUNFUENJT05cclxuXHJcbiAgICAvLy8vLy8vUkVHSU9OIEVOVFJFR0FcclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgZW52aW9cclxuICAgIHB1YmxpYyBNZXJnZUVudHBZRW5jKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy9vTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuQ1RCTERQUkQsIFwiQ1RCTERQUkRcIikpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM1BFbnZpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM1BFbnZpb3MuZm9yRWFjaChlbnYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgICAgIGxFbmMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+IGVuYy5JZEVudmlvID09IGVudi5JZEVudmlvKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobEVuYyAhPT0gdW5kZWZpbmVkICYmIGxFbmMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxFbmMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciwgXCJDVVJDRU5UXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRGVqYXIgbG9zIGRlIHRhbGxlcyBkZSBsYSB2YXJpYWJsZTogQ1VSQ1JFQyBlbj0wLCBFc3RvIHBhcmEgZmx1am9zLCBkb25kZSBhZ3JlZ2EgaW5mbyBwcm9jZXNhIHkgYWjDg8KtIG1pc21vIGFncmVnYSBtw4PCoXMuXHJcbiAgICBwdWJsaWMgUmVtb3ZlQ3VyQ0VudChvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPSBudWxsKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RldGFsbGU6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgIG9EZXRhbGxlID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNVUkNFTlRcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RldGFsbGUgIT09IHVuZGVmaW5lZCAmJiBvRGV0YWxsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0RldGFsbGUuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICB9XHJcbiAgICAvLy8vLy8vRklOIFJFR0lPTiBFTlRSRUdBXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uZXMgcXVlIHNlIHByb2Nlc2FuIGRlc3B1ZXMgZGUgYWdyZWdhciBhbCBjYXJyaXRvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGFVc2VyIFxyXG4gICAgICogQHBhcmFtIG9NM1BJdGVtc1dFQiBcclxuICAgICAqIEBwYXJhbSBvTTNVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gRW5MaW5lYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIFByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuUHJvY2VzYXJPYnNlcXVpb3Mob0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYXIgcHJvbW9jaW9uZXMgZGVzcHVlcyBkZSBmaW5hbGl6YXIgZWwgcmVnaXN0cm9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2NQcm9tb0FmdGVyRmluYWxpemFyKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55KSB7XHJcblxyXG4gICAgICAgIHRoaXMuR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIHRoaXMuUHJvbW9BZnRlclByb2Nlc28ob00zUHJvY2Vzb3MsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIHZhciBsVGlwb3NQcm9tbyA9IG5ldyBBcnJheTxTdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIGxUaXBvc1Byb21vLnB1c2goXCJBRlRFUlwiKTtcclxuICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBudWxsLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBsVGlwb3NQcm9tbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyUHJvbW9BZnRlcihhcnJQcm9tbywgb00zUHJvY2Vzb3MsIG9NM0VOQ1BST01PKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZEluZm9Qcm9tb2Npb25lc0FEaW5hbWljYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgYSBpbmZvcm1hY2lvbiBkaW5hbWljYSBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgMCk7XHJcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIlZBTF9QUk9NT0NcIiwgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbi50b1N0cmluZygpKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcblxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTk9NQl9QUk9NT0NcIiwgZGF0YS5OT01CUkVTKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcblxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzID0gdGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiSURfUFJPTU9DXCIsIGRhdGEuSUQpXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHByb2Nlc28gYXNvc2lhZG8gYSB1biBpZHByZXN0YW1vc1xyXG4gICAgYXN5bmMgZ2V0X20zX3Byb2Nlc29fYnlfaWRfcHJlc3RhbW9fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGlkX3ByZXN0YW1vOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL2dldE0zUHJvY2Vzb0J5SWRQcmVzdGFtby8nICsgaWRfa2F0aW9zICsgJy8nICsgaWRfcHJlc3RhbW8pLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRDb25jZXB0b00zU2FsZG9zSXRlbVViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqRGF0YTogYW55KSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL0dldENvbmNlcHRvTTNTYWxkb3NJdGVtVWIvJyArIHNJREthdGlvcywgakRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgbyBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSB1biBvYmpldG8gTTNPdENsYXNpZmljYWNpb25lcyBkZW50cm8gZGVsYSBsaXN0YSBkZSB1biBQcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqIEBwYXJhbSBjYW50aWRhZCBcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkUHJvZHVjdG9Ub090cmFzQ2xhcyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIGNhbnRpZGFkOiBudW1iZXIsIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgb00zT3RDbGFzaWZpY2FjaW9uZXM6IE0zT3RDbGFzaWZpY2FjaW9uZXM7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgbGV0IHByb2R1Y3RvRXhpc3RlID0gdGhpcy52YWxpZGFyRXhpc3RhT3RyYUNsYXNpZihvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBwcm9kdWN0KTtcclxuICAgICAgICBpZiAocHJvZHVjdG9FeGlzdGUpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgPSBwcm9kdWN0b0V4aXN0ZS5DYW50aWRhZCArIGNhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5WYWxvciA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KHByb2R1Y3RVbml0U2VsZWN0ZWQuTG9NM1ByZExpc3RhLlBSRUNJTywgcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0V4aXN0ZS5PcmRlbiA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMgPSBuZXcgTTNPdENsYXNpZmljYWNpb25lcygpO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5JZFByb2R1Y3RvID0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1U7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLk5vbWJyZSA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuTk9NQlJFMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSUQgPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiSURcIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5PcmRlbiA9IHRoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgXCJPcmRlblwiKSArIDE7XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnB1c2gob00zT3RDbGFzaWZpY2FjaW9uZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpb00zUHJvY2Vzb3MgPSB0aGlzLnJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKGlvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsaW1pbmEgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgcG9uaWVuZG8gc3UgdmFsb3IgeSBjYW50aWRhZCBlbiBjZXJvXHJcbiAgICAgKiBAcGFyYW0gb00zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBkZWxldGVQcm9kdWN0b0Zyb21PdHJhc0NsYXMob00zT3RDbGFzaWZpY2FjaW9uZXM6IE0zT3RDbGFzaWZpY2FjaW9uZXMsIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvQWN0dWFsKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLkNhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuVmFsb3IgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpb00zUHJvY2Vzb3MgPSB0aGlzLnJlY2FsY3VsYXJWYWxPdHJhQ2xhc2lNM1Byb2Nlc29zKGlvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgcmV0dXJuIGlvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY2FsY3VsYSBlbCB2YWxvciBkZSBNM1Byb2Nlc29zLlZhbE90cmFDbGFzaSBhIHBhcnRpciBkZSBsYSBzdW1hdG9yaWEgZGUgbG9zIG9iamV0b3MgZGVudHJvIGRlbCBhcnJlZ2xvIE0zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICByZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbE90cmFDbGFzaSA9IG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMucmVkdWNlKGZ1bmN0aW9uIChzdW1hLCBvTTNPdENsYXNpZmljYWNpb25lcykge1xyXG4gICAgICAgICAgICByZXR1cm4gc3VtYSArIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yO1xyXG4gICAgICAgIH0sIDApXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxhIGV4aXN0ZW5jaWEgZGUgdW4gcHJvZHVjdG8gZGVudHJvIGRlIHVuIGxhIGxpc3RhIGRlIE0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBsaXN0TTNPdENsYXNpZmljYWNpb25lcyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IFxyXG4gICAgICovXHJcbiAgICB2YWxpZGFyRXhpc3RhT3RyYUNsYXNpZihsaXN0TTNPdENsYXNpZmljYWNpb25lczogQXJyYXk8TTNPdENsYXNpZmljYWNpb25lcz4sIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IGxpc3RNM090Q2xhc2lmaWNhY2lvbmVzLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXS5TS1UpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0V4aXN0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBMaW1waWEgbG9zIGRldGFsbGVzIHkgbG9zIGltcHVlc3RvcyBkZSB1biBwcm9kdWN0byBkYWRvIGVuIHVuIHByb2Nlc28gZGUgZGV2b2x1Y2lvblxyXG4gICAqIEBwYXJhbSBwcm9kdWN0b0JvcnJhZG8gXHJcbiAgICogQHBhcmFtIHByb2Nlc29EZXZvbHVjaW9uIFxyXG4gICAqL1xyXG4gICAgZGVsZXRlUHJkRGV2b2x1Y2lvbihwcm9kdWN0b0JvcnJhZG8sIHByb2Nlc29EZXZvbHVjaW9uOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvID0gcHJvY2Vzb0Rldm9sdWNpb24uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBwcm9kdWN0b0JvcnJhZG8uSWRQcm9kdWN0byk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLk0zREVULmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4oK2RldC5WYWxvcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBwcm9kdWN0by5NM1BJbXB1ZXN0b3MuZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWp1c3RhIGxvcyBWYWxvcmVzIGVuIGNhc28gZGUgZW5jb250cmFyIGRpZmVyZW5jaWFzIHBhcmEgcG9kZXIgZ2VuZXJhciBGRVxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JWYWxvcmVzQ0ZESUZyb250KG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG4gICAgICAgIGxldCB0b3RhbERlc2N1ZW50b3MgPSB0aGlzLmdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICBsZXQgdG90YWxJbXBvcnRlSW1wdWVzdG9zID0gdGhpcy5nZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvcyk7XHJcblxyXG4gICAgICAgIGRpZmVyZW5jaWEgPSB0aGlzLm9NYXRoVEYucm91bmQob00zUHJvY2Vzb3MuVmFsb3JOZXRvIC0gKG9NM1Byb2Nlc29zLlZhbG9yICsgdG90YWxJbXBvcnRlSW1wdWVzdG9zIC0gdG90YWxEZXNjdWVudG9zKSwgMyk7XHJcbiAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICBpZiAodG90YWxJbXBvcnRlSW1wdWVzdG9zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYSwgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHZhbG9yIHRvdGFsIGRlIHByb21vY2lvbmVzIGFwbGljYWRhcyBlbiBlbCBwcm9jZXNvIGVuIGN1ZXN0acODwrNuXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGdldFZhbG9yVG90YWxEZXNjdWVudG9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRhbGxlUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVByb21vKSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbERlc2N1ZW50b3MgKz0gK2RldGFsbGVQcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG90YWxEZXNjdWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBpbXB1ZXN0b3MgY29icmFkb3MgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDg8KzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsSW1wb3J0ZUltcHVlc3RvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBlbmMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyArPSAraW1wLlZhbG9yO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsSW1wb3J0ZUltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGltcHVlc3RvIGVuIDAuMDEgeSBzdSBjb3JyZXNwb25kaWVudGUgYmFzZSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckltcHVlc3Rvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBhanVzdG8gPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW1wIG9mIGVuYy5NM1BJbXB1ZXN0b3MpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IGltcC5WYWxvciArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaW1wLkJhc2UgPSBpbXAuVmFsb3IgLyBpbXAuUG9yY2VudGFqZTtcclxuICAgICAgICAgICAgICAgIGFqdXN0byA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYWp1c3RvKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE11ZXZlIGVsIHZhbG9yIGRlIHVuIGRlc2N1ZW50byBlbiAwLjAxIHBhcmEgcXVlIGN1YWRyZSBsb3MgdmFsb3JlcyBhbCB0aW1icmFyIGxhIEZFXHJcbiAgICAgKiBAcGFyYW0gZGlmZXJlbmNpYSBcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVzY3VlbnRvc0NGREkoZGlmZXJlbmNpYTogbnVtYmVyLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBkZXRhbGxlVG90YWxQcm9tbzogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIGZvciAobGV0IGVuYyBvZiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tbyA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIik7XHJcbiAgICAgICAgICAgIGlmIChkZXRhbGxlVG90YWxQcm9tbyAmJiArZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhbGxlVG90YWxQcm9tby5WYWxvciA9ICgrZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgLSAwLjAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yICsgMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmRzR2VuZXJhbEZyb21NM1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvLycgKyBzSWRLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNUcngge1xyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZWwgZGlhcmlvIGRlIHRyYW5zYWNjaW9uZXMgZGVzZGUgc2VydmljaW8gcmVzdCBNM1RyeC4gTWljcm9zZXJ2aWNpbyBNMy5cclxuICAgIHB1YmxpYyBNM19HZXREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L00zX0dldERpYXJpby8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhRGlhcmlvO1xyXG4gICAgICAgICAgICBvRGF0YURpYXJpbyA9IHJlc3A7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YURpYXJpby5SRVNQVUVTVEEuZGF0YS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEgPSBuZXcgQXJyYXkob0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgZGlhcmlvIGRlIHRyYW5zYWNjaW9uZXMgZGV0YWxsYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldERpYXJpb1RyeChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L20zX2dldERpYXJpb1RyeC8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YURpYXJpbztcclxuICAgICAgICAgICAgb0RhdGFEaWFyaW8gPSByZXNwO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpby5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpbyA9IG5ldyBBcnJheShvRGF0YURpYXJpby5SRVNQVUVTVEEuRGlhcmlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIHRyYW5zYWNjaW9uLlxyXG4gICAgcHVibGljIE0zX0dldEluZm9UUlgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHsgJ1RvcCc6IHRvcCB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNUcngvTTNfR2V0SW5mb1RSWC8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9EYXRhVFJYO1xyXG4gICAgICAgICAgICBvRGF0YVRSWCA9IHJlc3A7XHJcblxyXG4gICAgICAgICAgICBpZiAob0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YVRSWC5SRVNQVUVTVEEuVElQT1MgPSBuZXcgQXJyYXkob0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TLmZvckVhY2godGlwbyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGlwby5UUlgubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aXBvLlRSWCA9IG5ldyBBcnJheSh0aXBvLlRSWCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGFUUlgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG5cclxuXHJcbiAgICAvL0NhbWJpbyBkZSBlc3RhZG8gZGUgdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgQ2FtYmlvRXN0YWRvVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9Fc3RhZG9VYmljYWNpb24vJyArIHNJREthdGlvcywgb00zVWJpY2FjaW9uKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL0NhbWJpbyBkZSBlc3RhZG8gZGUgSFVCXHJcbiAgICBwdWJsaWMgQ2FtYmlvRXN0YWRvSHViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvTTNVYmljYWNpb246IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM1RyeC9DYW1iaW9Fc3RhZG9IdWIvJyArIHNJREthdGlvcywgb00zVWJpY2FjaW9uKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5fYm9keSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxufSIsImltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1ByZWNMaXN0UHJlY2lvcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXByZWMtbGlzdC1wcmVjaW9zLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTGlzdGFQcmVjaW8ge1xyXG5cclxuICAgIHByaXZhdGUgZ29EYXRhOiBhbnk7XHJcbiAgICBwcml2YXRlIGdzSWRLYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbFByZWNpb3NTZWxlY3RlZDogc3RyaW5nID0gXCItMVwiO1xyXG5cclxuICAgIC8vR2VuZXJhciBKU09OIGdlbsODwqlyaWNvLCBwYXJhIHZhbGlkYXIgbGEgbGlzdGEgZGUgcHJlY2lvXHJcbiAgICBjb25zdHJ1Y3Rvcihsb2dlZF91c2VyOiBhbnksIHNJZFByb2Nlc286IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIG9EYXRhID0geyBcIlVTRVJcIjogbG9nZWRfdXNlciwgXCJQcm9jZXNvXCI6IHNJZFByb2Nlc28gfVxyXG4gICAgICAgIHRoaXMuZ29EYXRhID0gb0RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxpc3RhIGRlIHByZWNpb3NcclxuICAgIHB1YmxpYyBhc3luYyBHZXRMaXN0YVByZWNpb3MoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgSWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3NJZEthdGlvcyA9IElkS2F0aW9zO1xyXG4gICAgICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgICAgICB2YXIgb0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zO1xyXG4gICAgICAgICAgICBvTGlzdFByZWNMUCA9IHRoaXMuR2V0TFByZWNpb3NJblN0b3JhZ2UoSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZighb0xpc3RQcmVjTFApe1xyXG4gICAgICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dFVF9MSVNUQVBSRUNJT1NfQVN5bmMoUG9zdFNlcnZpY2VNMywgSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlTFByZWNpb3NJblN0b3JhZ2Uob0xpc3RQcmVjTFAsSWRLYXRpb3MpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuVmFsaWRhckFQTFJlZ2xhKG9MaXN0UHJlY0xQKTtcclxuICAgICAgICAgICAgLy90aGlzLkZpbmRMUHJlY2lvKG9MaXN0UHJlY0xQKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubFByZWNpb3NTZWxlY3RlZDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBsYSBsaXN0YSBkZSBwcmVjaW9zIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNhdmVMUHJlY2lvc0luU3RvcmFnZShsUHJlY2lvOmFueSwgZ3NJZGthdGlvczogc3RyaW5nKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlJlZ1ByZWNpb1wiICsgZ3NJZGthdGlvcywgSlNPTi5zdHJpbmdpZnkobFByZWNpbykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBsYSBsaXN0YSBkZSBwcmVjaW9zIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNhdmVDb25maWdMUHJlY2lvc0luU3RvcmFnZShsUHJlY2lvOmFueSwgZ3NJZGthdGlvczogc3RyaW5nKXtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKGxQcmVjaW8pO1xyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXCJDb25maWdMUFwiICsgZ3NJZGthdGlvcywgbFByZWNpbyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKlxyXG4gICAgICogT2J0ZW5lciBsaXN0YSBkZSBwcmVjaW9zIGRlc2RlIHN0b3JhZ2UgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGxsYXZlOiBSZWdQcmVjaW8gKyBpZGthdGlvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TFByZWNpb3NJblN0b3JhZ2UoZ3NJZGthdGlvczogc3RyaW5nKXtcclxuICAgICAgICB2YXIgc1ByZWNpb3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJlZ1ByZWNpb1wiICsgZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgdmFyIG9QcmVjaW9zOmFueTtcclxuICAgICAgICBpZihzUHJlY2lvcyl7XHJcbiAgICAgICAgICAgIG9QcmVjaW9zID0gSlNPTi5wYXJzZShzUHJlY2lvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJlY2lvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldENvbmZpZ0xQcmVjaW9zSW5TdG9yYWdlKGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIHNQcmVjaW9zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0xQXCIgKyBnc0lka2F0aW9zKTtcclxuICAgICAgICB2YXIgb1ByZWNpb3M6YW55O1xyXG4gICAgICAgIGlmKHNQcmVjaW9zKXtcclxuICAgICAgICAgICAgb1ByZWNpb3MgPSBKU09OLnBhcnNlKHNQcmVjaW9zKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9QcmVjaW9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvL0J1c3VjYXIgbGEgbGlzdGEgZGUgcHJlY2lvLCBpbmdyZXNhIGVsIG9iamV0byBkZSBwcmVjZW5kZW5jaWEgZGUgcmVnbGFzIGRlIGxpc3RhIGRlIHByZWNpb3NcclxuICAgIHB1YmxpYyBGaW5kTFByZWNpbyhvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3MpIHtcclxuICAgICAgICBcclxuICAgICAgICBpZiAob0xpc3RQcmVjTFAgIT09IHVuZGVmaW5lZCAmJiBvTGlzdFByZWNMUCAhPSBudWxsICYmIG9MaXN0UHJlY0xQLklEICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAuSUQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEgIT0gbnVsbCAmJiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQS5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcmVjIG9mIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQVBMUmVnbGEocHJlYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLkZpbmRMUHJlY2lvKHByZWMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgcmVnbGFzLCBpbmdyZXNhIGVsIG9iamV0byBkZSBwcmVjZW5kZW5jaWEgZGUgcmVnbGFzIGRlIGxpc3RhIGRlIHByZWNpb3NcclxuICAgIHB1YmxpYyBWYWxpZGFyQVBMUmVnbGEob0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zKTogYm9vbGVhbntcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAob0xpc3RQcmVjTFAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9MaXN0UHJlY0xQLlByb3BpZWRhZCk7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9MaXN0UHJlY0xQLlByb3BpZWRhZC50b1VwcGVyQ2FzZSgpLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJFTVBSRVNBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5Db21wYXJlKG9MaXN0UHJlY0xQLlZhbG9yLnRvU3RyaW5nKCksIHRoaXMuZ3NJZEthdGlvcy50b1N0cmluZygpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVUJJQ0FDSU9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5Db21wYXJlKG9MaXN0UHJlY0xQLlZhbG9yLnRvU3RyaW5nKCksIHRoaXMuZ29EYXRhLlVTRVIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ0VTT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5Qcm9jZXNvLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiSFVCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5Db21wYXJlKG9MaXN0UHJlY0xQLlZhbG9yLnRvU3RyaW5nKCksIHRoaXMuZ29EYXRhLlVTRVIuVXN1YXJpb1Npc3RlbWEuSURIVUIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5Db21wYXJlKG9MaXN0UHJlY0xQLlZhbG9yLnRvU3RyaW5nKCksIHRoaXMuZ29EYXRhLlVTRVIuVXN1YXJpb1Npc3RlbWFbb0xpc3RQcmVjTFAuUHJvcGllZGFkLnRvVXBwZXJDYXNlKCkudHJpbSgpXS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1jYXRjaCAoZXgpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yOiBcIiArIGV4KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGJSZXNwKXtcclxuICAgICAgICAgICAgdGhpcy5sUHJlY2lvc1NlbGVjdGVkID0gb0xpc3RQcmVjTFAuTGlzdGFQcmVjaW9zO1xyXG4gICAgICAgICAgICB0aGlzLkZpbmRMUHJlY2lvKG9MaXN0UHJlY0xQKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgQ29tcGFyZSh2YWx1ZTEsIHZhbHVlMikge1xyXG4gICAgICAgIGlmICh2YWx1ZTEgPT0gdmFsdWUyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGNvbmZpZ3VyYWNpb24vZW5jYWJlemFkbyBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q29uZmlnTGlzdGFQcmVjaW9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBJZEthdGlvcztcclxuICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgdmFyIG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcztcclxuICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSB0aGlzLkdldENvbmZpZ0xQcmVjaW9zSW5TdG9yYWdlKElkS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYoIW9MaXN0UHJlY0xQKXtcclxuICAgICAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0RW5jYWJlemFkb0xpc3Rhc1ByZWNpbyhQb3N0U2VydmljZU0zLCBJZEthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNhdmVDb25maWdMUHJlY2lvc0luU3RvcmFnZShvTGlzdFByZWNMUCxJZEthdGlvcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0UHJlY0xQO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zRGluUHJvY2Vzb3N7XHJcbiAgICBwdWJsaWMgaWRfcHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgaWRfc3ViX3Byb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIGlkX2RpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyB0aXBvX2RpbmFtOnN0cmluZztcclxuICAgIHB1YmxpYyB0aXR1bG86c3RyaW5nO1xyXG4gICAgcHVibGljIGVzdHJ1Y3R1cmFfZGVzdGlubzogc3RyaW5nO1xyXG4gICAgcHVibGljIFZEZWZhdWx0OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVxdWVyaWRvOmJvb2xlYW47XHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zUEl0ZW1zV0VCIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcmRQYWNrRGV0IHtcclxuICAgIHB1YmxpYyBMT1RFOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTE9URUhJSk86IHN0cmluZztcclxuICAgIHB1YmxpYyBTS1VISUpPOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvUGFjazogc3RyaW5nO1xyXG4gICAgcHVibGljIGdzUGF0aEltYWdlbjogc3RyaW5nO1xyXG4gICAgcHVibGljIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcbiAgICBwdWJsaWMgTTNHUlAgPSBuZXcgVHlwZU0zUHJkR3JwKCk7XHJcbiAgICBwdWJsaWMgT3JkZW46IG51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxvckFkaWNpb25hbDogbnVtYmVyO1xyXG4gICAgcHVibGljIElkR3JwOiBzdHJpbmc7XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zVWJpQWRpY2lvbmFsZXN7XHJcbiAgICBwdWJsaWMgQXRyaWJ1dG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxufSIsImltcG9ydCB7IE0zVWJpQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi9NM1ViaUFkaWNpb25hbGVzLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNIdWJzIH0gZnJvbSBcIi4vbTMtaHVicy50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNVYmljYWNpb257XHJcbiAgICBwdWJsaWMgSURVYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwb1ViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVERvY0FkbWluOnN0cmluZztcclxuICAgIHB1YmxpYyBORG9jQWRtaW46c3RyaW5nO1xyXG4gICAgcHVibGljIEpDb25maWd1cmFjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBTZXJpZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvOm51bWJlcjtcclxuICAgIHB1YmxpYyBEb2N1bWVudG9JRDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNVYmlBZGljaW9uYWxlczpBcnJheTxNM1ViaUFkaWNpb25hbGVzPjtcclxuICAgIHB1YmxpYyBNM0hVQlMgPSBuZXcgQXJyYXk8TTNIdWJzPigpO1xyXG4gICAgcHVibGljIEZlY2hhVHJhYmFqbzpEYXRlO1xyXG4gICAgcHVibGljIEFQTFViaWNFeHRlcm5hczpCb29sZWFuO1xyXG4gICAgXHJcbn0iLCJpbXBvcnQgeyBNM0NPTkRJUFJPTU8gfSBmcm9tIFwiLi9NM0NPTkRJUFJPTU8uY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NPTkRJQUdSVVBBQ0lPTntcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRBZ3J1cGFjaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZENvbmRpY2lvbmVzOnN0cmluZztcclxuICAgIHB1YmxpYyBPcGVyYWRvcjpzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIE0zQ09ORElQUk9NTzpBcnJheTxNM0NPTkRJUFJPTU8+O1xyXG59IiwiaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSBcIi4vTTNERVRDT05ESVBST01PLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNDT05ESVBST01Pe1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZENvbmRpY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uY2VwdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBNM0RFVENPTkRJUFJPTU86IEFycmF5PE0zREVUQ09ORElQUk9NTz47XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zREVUQ09ORElQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmNlcHRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxufSIsImltcG9ydCB7IE0zQ09ORElBR1JVUEFDSU9OIH0gZnJvbSBcIi4vTTNDT05ESUFHUlVQQUNJT04uY2xhc3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0VOQ1BST01Pe1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG86c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG8yOnN0cmluZztcclxuICAgIHB1YmxpYyBWaWdlbmNpYTpEYXRlO1xyXG4gICAgcHVibGljIEluaWNpbzpEYXRlO1xyXG4gICAgcHVibGljIEVzdGFkbzpib29sZWFuO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIEVzdGFkb01hbnVhbGVzOmJvb2xlYW4gPWZhbHNlO1xyXG4gICAgcHVibGljIEVzTWFudWFsOmJvb2xlYW49IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBFc3RhZG9BcGxDdXBvbjpib29sZWFuID1mYWxzZTtcclxuICAgIHB1YmxpYyBFc0FwbEN1cG9uOmJvb2xlYW49IGZhbHNlO1xyXG4gICAgcHVibGljIFRvcGU6bnVtYmVyO1xyXG5cclxuICAgIHB1YmxpYyBNM0NPTkRJQUdSVVBBQ0lPTjpBcnJheTxNM0NPTkRJQUdSVVBBQ0lPTj47XHJcbn0iLCJpbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpQWRpY2lvbmFsZXMgfSBmcm9tIFwicHJvamVjdHMvcmVnbGFuZWdvY2lvbTMxL3NyYy9wdWJsaWNfYXBpXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNVYmljYWNpb25TZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGdvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgY29uc3RydWN0b3Iob00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbikge1xyXG4gICAgICAgIHRoaXMuZ29NM1ViaWNhY2lvbiA9IG9NM1ViaWNhY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RGlyZWNjaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEFkaWNpb25hckJ5QXRyaWJ1dGUoXCJESVJFQ0NJT05cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFRlbGVmb25vKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEFkaWNpb25hckJ5QXRyaWJ1dGUoXCJURUxFRk9OT1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0TG9uZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiTE9OR1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0TGF0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkdldEFkaWNpb25hckJ5QXRyaWJ1dGUoXCJMQVRcIik7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShBdHJpYnV0bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9BZGljaW9uYWw6IE0zVWJpQWRpY2lvbmFsZXMgPSB0aGlzLmdvTTNVYmljYWNpb24uTTNVYmlBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQXRyaWJ1dG8gPT0gQXRyaWJ1dG8pO1xyXG4gICAgICAgICAgICBpZiAob0FkaWNpb25hbCAhPT0gdW5kZWZpbmVkICYmIG9BZGljaW9uYWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9BZGljaW9uYWwuVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfWNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gXCJOL0FcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgTTNQSXRlbXNXRUIsIE0zUERldGFsbGVJdGVtcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgTTNQZXJYUHJvY2VzbyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ01hc2l2byB7XHJcblxyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRlcjogRmlsZVJlYWRlcjtcclxuICAgIHByaXZhdGUgc2VwYXJhZG9yOiBzdHJpbmcgPSBcIixcIjtcclxuICAgIHByaXZhdGUgb00zUHJvY2VzbyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICBwcml2YXRlIHByb2dyZXNzOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIENvbmZNYXNpdmE6IGFueTtcclxuICAgIHB1YmxpYyByb3VuZGVkX3Byb2dyZXNzOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZ2JCYXJDb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3Rvcihpc0lkS2F0aW9zOiBzdHJpbmcsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBpQ29uZk1hc2l2YTogYW55LCBpYkJhcmNvZGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLm9NM1Byb2Nlc28gPSBpb00zUHJvY2VzbztcclxuICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBpc0lkS2F0aW9zO1xyXG4gICAgICAgIHRoaXMuQ29uZk1hc2l2YSA9IGlDb25mTWFzaXZhO1xyXG4gICAgICAgIHRoaXMuZ2JCYXJDb2RlID0gaWJCYXJjb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRfcm91bmRlZF9wcm9ncmVzcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3VuZGVkX3Byb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL0FkaWNpb25hciBwcm9kdWN0b3MgZW4gbWFzaXZvXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRpY2lvbmFyTWFzaXZvKG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9EYXRVc2VyOiBhbnksIG9EYXRhUHJvYzogYW55KSB7XHJcbiAgICAgICAgdGhpcy5HZXRSZWFkZXIob0RhdGFQcm9jKTtcclxuICAgICAgICBsZXQgY3N2OiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlYWRlcikge1xyXG4gICAgICAgICAgICBjc3YgPSBvRGF0YVByb2MuVGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNzdiA9IHRoaXMucmVhZGVyLnJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYXJyQ1NWOiBBcnJheTxzdHJpbmc+ID0gY3N2LnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgICB2YXIgcHJvY2VzbyA9IGF3YWl0IHRoaXMuYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgb0RhdFVzZXIsIGFyckNTVik7XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjb3JyZSB5IGFkaWNpb25hIGxvcyBwcm9kdWN0b3MgZW4gdW4gYXJyYXkgYSB1biBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb00zQ291Y2hNYWVzdHJvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gb0RhdFVzZXIgXHJcbiAgICAgKiBAcGFyYW0gYXJyQ1NWIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9EYXRVc2VyOiBhbnksIGFyckNTVjogQXJyYXk8c3RyaW5nPiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwsIGFwbEV4Yzogc3RyaW5nID0gXCIwXCIpIHtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsID0gYXJyQ1NWLmxlbmd0aDtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIHZhciBwcm9kdWN0OiBUeXBlTTNQcmRHcnBcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShvTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcyk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGxpbmU6IHN0cmluZyA9IGFyckNTVltpXTtcclxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTVjtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5TZXRFc3RydWN0Q1NWKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2JCYXJDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7IFwiaWRfdWJpY2FjaW9uXCI6IG9EYXRVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgXCJDb2RpZ29cIjogb2VzdHJ1Y3RDU1Yuc2t1IH07XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldF9NM1Byb2R1Y3RvRXNwZWNCeUNvZGVBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIGRhdGEsIG9EYXRVc2VyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zVWJpY2FjaW9uICYmIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uSURVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLk0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcywgb2VzdHJ1Y3RDU1Yuc2t1LCBvRGF0VXNlciwgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uLCBhcGxFeGMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLk0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcywgb2VzdHJ1Y3RDU1Yuc2t1LCBvRGF0VXNlciwgXCItMVwiLCBhcGxFeGMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFByZWNpb1NpQVBsaWNhKHByb2R1Y3QsIG9lc3RydWN0Q1NWKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkUHJkVG9NM1Byb2Nlc28ocHJvZHVjdCwgb2VzdHJ1Y3RDU1YsIG9NM1JlZ1NlcnZpY2UsIG9EYXRVc2VyLCBvTTNVYmljYWNpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBjb3VudCAqIDEwMCAvIHRvdGFsO1xyXG4gICAgICAgICAgICB0aGlzLnJvdW5kZWRfcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHRoaXMucHJvZ3Jlc3MgKiAxMDApIC8gMTAwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYW1iaWFyIHByZWNpbyBkZSBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBzZXRQcmVjaW9TaUFQbGljYShwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgaWYgKG9lc3RydWN0Q1NWLnByZWNpbyAhPT0gTmFOICYmIG9lc3RydWN0Q1NWLnByZWNpbyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9lc3RydWN0Q1NWLnByZWNpbztcclxuICAgICAgICAgICAgcHJvZHVjdC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKG9NM1ByZXNlbnRhY2lvbmVzID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SID0gb2VzdHJ1Y3RDU1YucHJlY2lvO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgYSBtM3Byb2Nlc28sIHByb2R1Y3RvIGVzcGVjaWZpY28sIHNlIGVudmlhIGNhbnRpZGFkLlxyXG4gICAgcHVibGljIEFkZFByZFRvTTNQcm9jZXNvKHByb2R1Y3Q6IFR5cGVNM1ByZEdycCwgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YsIG9NM1JlZ1NlcnZpY2U6IE0zUmVnU2VydmljZSwgb0RhdFVzZXI6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwpIHtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9lc3RydWN0Q1NWLmNhbnRpZGFkO1xyXG4gICAgICAgIGlmIChvZXN0cnVjdENTVi5QYXRoSW1hZ2VuKSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb2VzdHJ1Y3RDU1YuUGF0aEltYWdlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gb00zUmVnU2VydmljZS5Mb2FkQWRpY2lvbmFsZXMob00zUEl0ZW1zV0VCLCBwcm9kdWN0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMub00zUHJvY2Vzby5NM0VOQy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAvLy9QcmltZXJhIHZleiBcclxuICAgICAgICAgICAgLy8vTk8gU0UgRVNUQSBFTlZJQU5ETyBJTkZPUk1BQ0lPTiBERSBQUk9NT0NJT05FU1xyXG4gICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28gPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kdWN0LCBvTTNQSXRlbXNXRUIsIG9EYXRVc2VyLCBvTTNVYmljYWNpb24sIG51bGwsIHRoaXMub00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIC8vQWdyZWdhciBkaW5hbWljYXNcclxuICAgICAgICAgICAgdGhpcy5BZGljaW9uYXJEaW5hbWljYShvZXN0cnVjdENTVik7XHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFyUGVyc29uYXNBUHJvY2VzbyhvZXN0cnVjdENTVik7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKHRoaXMub00zUHJvY2VzbywgcHJvZHVjdCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG51bGwsIG9EYXRVc2VyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5BZGljaW9uYXJEZXRhbGxlKG9lc3RydWN0Q1NWKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBjYXB0dXJhcyBkaW5hbWljYXNcclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBkZSBsaW5lYSBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hckRpbmFtaWNhKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRpbmFtaWNhcyA9IG9lc3RydWN0Q1NWLkRpbmFtaWNhc1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbmFtaWNhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMgPSBuZXcgQXJyYXk8TTNQRGluYW1pY2FzPigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBkaW5hbWljYXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gZGluYW1pY2FzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIGRpbmFtaWNhXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBwZXJzb25hcyBhIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hclBlcnNvbmFzQVByb2Nlc28ob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcGVyc29uYXMgPSBvZXN0cnVjdENTVi5QZXJzb25hcztcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwZXJzb25hcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BlclhQcm9jZXNvID0gbmV3IE0zUGVyWFByb2Nlc28oKTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNQZXJYUHJvY2VzbyA9IG5ldyBBcnJheTxNM1BlclhQcm9jZXNvPigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uVGRvYyA9IHBlcnNvbmFzW2ldLlRkb2M7XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5OZG9jID0gcGVyc29uYXNbaV0uTmRvYztcclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLlRpcG9QZXJzb25hID0gcGVyc29uYXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNQZXJYUHJvY2Vzby5wdXNoKG9NM1BlclhQcm9jZXNvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIHBlcnNvbmFzXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlIGFsIHVsdGltbyBlbmNhYmV6YWRvIGFncmVnYWRvLlxyXG4gICAgICogQHBhcmFtIG9lc3RydWN0Q1NWIEVzdHJ1Y3R1cmEgY29uIGluZm9ybWFjaW9uIGRlIGxpbmVhIGEgYWdyZWdhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFyRGV0YWxsZShvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkZXRhbGxlcyA9IG9lc3RydWN0Q1NWLk0zRGV0XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGV0YWxsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBkZXRhbGxlc1tpXS5BdHJpYnV0bztcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBkZXRhbGxlc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5NM0VOQ1t0aGlzLm9NM1Byb2Nlc28uTTNFTkMubGVuZ3RoIC0gMV0uTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zKTtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5vTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gb2VzdHJ1Y3RDU1YuKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBhZGljaW9uYXIgZGV0YWxsZVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGVuZXIgeSBzZXRlYXIgbGEgaW5mb3JtYWNpb24gZGUgYXJjaGl2byBDU1YgeSBzZXBhcmFkb3IuXHJcbiAgICBwdWJsaWMgR2V0UmVhZGVyKG9EYXRhUHJvYzogYW55KSB7XHJcbiAgICAgICAgdGhpcy5yZWFkZXIgPSBvRGF0YVByb2MuQ1NWO1xyXG4gICAgICAgIHRoaXMuc2VwYXJhZG9yID0gb0RhdGFQcm9jLlNlcGFyYWRvcjtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL1NldGVhciBlc3RydWN1dGFyIGRlIENTVlxyXG4gICAgcHVibGljIFNldEVzdHJ1Y3RDU1YobGluZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG4gICAgICAgICAgICB2YXIgb0FyckNTVjogQXJyYXk8c3RyaW5nPiA9IGxpbmUuc3BsaXQodGhpcy5zZXBhcmFkb3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuQ29uZk1hc2l2YSAmJiB0aGlzLkNvbmZNYXNpdmEuQ29sdW1uYXMpIHtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5Fc3RydWN0RHluYW1pYyhvQXJyQ1NWKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5Fc3RydWN0RGVmYXVsdChvQXJyQ1NWKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG9lc3RydWN0Q1NWO1xyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgY3JlYW5kbyBlc3RydWN0dXJhLiBSZXZpc2FyIGxpbmVhc1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3RydWN0dXJhIGRpbmFtaWNhIGRlIGNhcmd1ZSBtYXNpdmFcclxuICAgICAqIEBwYXJhbSBvQXJyQ1NWIGFycmVnbG8gY29uIGluZm9ybWFjaW9uLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRXN0cnVjdER5bmFtaWMob0FyckNTVjogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgICAgIHZhciBjb2x1bW5hczogQXJyYXk8YW55PiA9IHRoaXMuQ29uZk1hc2l2YS5Db2x1bW5hcztcclxuICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YgPSB7IFwiY2FudGlkYWRcIjogbnVsbCwgXCJwcmVjaW9cIjogbnVsbCwgXCJza3VcIjogbnVsbCwgXCJQYXRoSW1hZ2VuXCI6IG51bGwsIFwiRGluYW1pY2FzXCI6IFtdLCBcIlBlcnNvbmFzXCI6IFtdLCBcIk0zRGV0XCI6IFtdIH07XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1uYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgc3dpdGNoIChjb2x1bW5hc1tpXS5Fc3RydWN0dXJhKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ2FudGlkYWRcIjpcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5jYW50aWRhZCA9ICtvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQcmVjaW9cIjpcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5wcmVjaW8gPSArb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0tVXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1Yuc2t1ID0gb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRElOQU1JQ0FcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGluID0geyBcIkF0cmlidXRvXCI6IGNvbHVtbmFzW2ldLkF0cmlidXRvLCBcIlZhbG9yXCI6IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dIH07XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuRGluYW1pY2FzLnB1c2goZGluKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtM0RldCA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJWYWxvclwiOiBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLk0zRGV0LnB1c2gobTNEZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlRJUE9QRVJTT05BXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbG9yID0gb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRkb2M6IHN0cmluZyA9IFwiNVwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZG9jOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxvci5zcGxpdChcIi1cIikubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGRvYyA9IHZhbG9yLnNwbGl0KFwiLVwiKVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmRvYyA9IHZhbG9yLnNwbGl0KFwiLVwiKVswXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZG9jID0gdmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGVyc29uYSA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJUZG9jXCI6IHRkb2MsIFwiTmRvY1wiOiBuZG9jIH07XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuUGVyc29uYXMucHVzaChwZXJzb25hKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9lc3RydWN0Q1NWO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXN0cnVjdHVyYSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIG9BcnJDU1YgQXJyZWdsbyBjb24gaW5mb3JtYWNpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIEVzdHJ1Y3REZWZhdWx0KG9BcnJDU1Y6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YgPSB7IFwiY2FudGlkYWRcIjogbnVsbCwgXCJwcmVjaW9cIjogbnVsbCwgXCJza3VcIjogbnVsbCwgXCJQYXRoSW1hZ2VuXCI6IG51bGwsIFwiRGluYW1pY2FzXCI6IFtdLCBcIlBlcnNvbmFzXCI6IFtdLCBcIk0zRGV0XCI6IFtdIH07XHJcbiAgICAgICAgLy92YXIgb0FyckNTVjogQXJyYXk8c3RyaW5nPiA9IGxpbmUuc3BsaXQodGhpcy5zZXBhcmFkb3IpO1xyXG5cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5za3UgPSBvQXJyQ1NWWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gMikge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5jYW50aWRhZCA9ICtvQXJyQ1NWWzFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDMpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1YucHJlY2lvID0gK29BcnJDU1ZbMl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSA0KSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLlBhdGhJbWFnZW4gPSBvQXJyQ1NWWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2VzdHJ1Y3RDU1Y7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgZXN0cnVjdENTViB7XHJcbiAgICBza3U6IHN0cmluZztcclxuICAgIGNhbnRpZGFkOiBudW1iZXI7XHJcbiAgICBwcmVjaW86IG51bWJlcjtcclxuICAgIFBhdGhJbWFnZW46IHN0cmluZztcclxuICAgIERpbmFtaWNhczogQXJyYXk8YW55PjtcclxuICAgIFBlcnNvbmFzOiBBcnJheTxhbnk+O1xyXG4gICAgTTNEZXQ6IEFycmF5PGFueT47XHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNSZWdTZXJ2aWNlIH0gZnJvbSBcIi4vbTMtcmVnLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgTTNQSXRlbXNXRUIgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYXN5bmMgfSBmcm9tIFwicVwiO1xyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdNYXNpdm9BS1pTZXJ2aWNlIHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgdW4gRW5jSXRlbSB5IHB1ZWRlIHF1ZSB1bmEgZGluYW1pY2EgY29uIGVsIGlkcHJlc3RhbW8gYSB1biBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRfcHJlc3RhbW8gXHJcbiAgICAgKiBAcGFyYW0gbTNQcmQgXHJcbiAgICAgKiBAcGFyYW0gdXNlciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGFkZF9kaW5hbWljYV9pZHByZXN0YW1vX3RvX3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGlkX3ByZXN0YW1vOiBzdHJpbmcsXHJcbiAgICAgICAgbTNQcmQsIHVzZXIsIG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBwZGluYW1pY2EgPSBuZXcgTTNQRGluYW1pY2FzXHJcbiAgICAgICAgcGRpbmFtaWNhLk5vbWJyZSA9IFwiSWRQcmVzdGFtb1wiO1xyXG4gICAgICAgIHBkaW5hbWljYS5WYWxvciA9IGlkX3ByZXN0YW1vO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZXNwb25zZV9wcm9jZXNvX20zOiBNM1Byb2Nlc29zXHJcbiAgICAgICAgICAgIHZhciBtM19yZWdfc2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRfa2F0aW9zKTtcclxuICAgICAgICAgICAgcmVzcG9uc2VfcHJvY2Vzb19tMyA9IGF3YWl0IG0zX3JlZ19zZXJ2aWNlLmdldF9tM19wcm9jZXNvX2J5X2lkX3ByZXN0YW1vX2FzeW5jKFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvcywgaWRfcHJlc3RhbW8pO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBkZWphbiBwZWdhZG9zIGxvcyBlc3RhZG9zIGRlIGRlc3Rpbm9cclxuICAgICAgICAgICAgcmVzcG9uc2VfcHJvY2Vzb19tMy5Fc3RhZG9EZXMgPSByZXNwb25zZV9wcm9jZXNvX20zLkVzdGFkb0FudDtcclxuICAgICAgICAgICAgcmVzcG9uc2VfcHJvY2Vzb19tMy5TdWJFc3RhZG9EZXMgPSByZXNwb25zZV9wcm9jZXNvX20zLlN1YkVzdGFkb0FudDtcclxuXHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCB0aGlzLmFkZF9wZGluYW1pY2FfdG9fZXhpc3RpbmdfcHJvY2VzbyhQb3N0U2VydmljZU0zLCByZXNwb25zZV9wcm9jZXNvX20zLCBpZF9rYXRpb3MsIG0zUHJkLCB1c2VyLCBwZGluYW1pY2EsIG90cm9zUGFyYW1ldHJvcyk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG5cclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IHRoaXMuYWRkX3BkaW5hbWljYV90b19uZXdfcHJvY2VzbyhQb3N0U2VydmljZU0zLCBpZF9rYXRpb3MsIG0zUHJkLCB1c2VyLCBwZGluYW1pY2EsIG90cm9zUGFyYW1ldHJvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIHVuIEVuY0l0ZW0geSBkaW5hbWljYSBjb24gZWwgaWRwcmVzdGFtbyBhIHVuIHByb2Nlc28gbnVldm9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBtM1ByZCBcclxuICAgICAqIEBwYXJhbSB1c2VyIFxyXG4gICAgICogQHBhcmFtIHBkaW5hbWljYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGFkZF9wZGluYW1pY2FfdG9fbmV3X3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgbTNQcmQ6IGFueSwgdXNlcjogYW55LCBwZGluYW1pY2E6IE0zUERpbmFtaWNhcywgb3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gdGhpcy5HZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZF9rYXRpb3MpO1xyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG9NM1JlZ1NlcnZpY2UuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKG0zUHJkLCBvTTNQSXRlbXNXRUIsIHVzZXIsIG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIHJlc3BvbnNlLmxNM1BEaW5hbWljYXMucHVzaChwZGluYW1pY2EpO1xyXG5cclxuICAgICAgICAvL1NlIGRlamFuIHBlZ2Fkb3MgbG9zIGVzdGFkb3MgZGUgZGVzdGlub1xyXG4gICAgICAgIHJlc3BvbnNlLkVzdGFkb0RlcyA9IFwiQWN0aXZvXCI7XHJcbiAgICAgICAgcmVzcG9uc2UuU3ViRXN0YWRvRGVzID0gXCJSZWdpc3Ryb1wiO1xyXG5cclxuICAgICAgICB2YXIgbTNfcHJvY2VzbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UucHJvY2VzYW1pZW50b19zZXJ2aWNlX2FzeW5jKGlkX2thdGlvcywgUG9zdFNlcnZpY2VNMywgcmVzcG9uc2UsIHVzZXIpO1xyXG4gICAgICAgIHJldHVybiBtM19wcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIHVuIEVuY0l0ZW0gYSB1biBwcm9jZXNvIGV4aXN0ZW50ZVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gbTNfcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gbTNQcmQgXHJcbiAgICAgKiBAcGFyYW0gdXNlciBcclxuICAgICAqIEBwYXJhbSBwZGluYW1pY2FcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGFkZF9wZGluYW1pY2FfdG9fZXhpc3RpbmdfcHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBtM19wcm9jZXNvOiBNM1Byb2Nlc29zLCBpZF9rYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBtM1ByZDogYW55LCB1c2VyOiBhbnksIHBkaW5hbWljYTogTTNQRGluYW1pY2FzLCBvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQjtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkdldE0zUEl0ZW1zV0VCKG90cm9zUGFyYW1ldHJvcyk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlkX2thdGlvcyk7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG9NM1JlZ1NlcnZpY2UuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG0zX3Byb2Nlc28sIG0zUHJkLCBvTTNQSXRlbXNXRUIsIG51bGwsIG51bGwsIHVzZXIpO1xyXG4gICAgICAgIHJlc3BvbnNlLmxNM1BEaW5hbWljYXMucHVzaChwZGluYW1pY2EpO1xyXG5cclxuICAgICAgICB2YXIgbTNfcHJvY2VzbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UucHJvY2VzYW1pZW50b19zZXJ2aWNlX2FzeW5jKGlkX2thdGlvcywgUG9zdFNlcnZpY2VNMywgcmVzcG9uc2UsIHVzZXIpO1xyXG4gICAgICAgIHJldHVybiBtM19wcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIEdldE0zUEl0ZW1zV0VCKG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvID0gXCJNM1ZFTlRBXCI7XHJcbiAgICAgICAgb3Ryb3NQYXJhbWV0cm9zLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQlt4Lk5vbWJyZV0gPSB4LlZhbG9yXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gb00zUEl0ZW1zV0VCO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmV2ZXJzb1NlcnZ7XHJcblxyXG5cclxuICAgIFxyXG4gICAgcHVibGljIFByb2Nlc2FyUmV2ZXJzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLHNJREthdGlvczogc3RyaW5nLCB0ZG9jQWN0aXZvOnN0cmluZywgbmRvY0FjdGl2bzpzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNSZXZlcnNvL1JldmVyc2FyL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBuZG9jQWN0aXZvICsgXCIvXCIgKyB0ZG9jQWN0aXZvLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSwgKTtcclxuICAgIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQRGluYW1CeUFjdGl2aWRhZHtcclxuICAgIHB1YmxpYyBJZERpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxufSIsImV4cG9ydCBjbGFzcyBNM0RpbkJ5QWN0aXZpZGFke1xyXG4gICAgcHVibGljIElEQWN0aXZpZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBBY3RpdmlkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIElERGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9EaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBSZXF1ZXJpZG86Ym9vbGVhbjtcclxuXHJcbiAgICAvL1NvbG8gUHJlc2VudGFjaW9uXHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1NhbGRvc1hDdWVudGF7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvOnN0cmluZztcclxuICAgIHB1YmxpYyBURG9jVGl0dWxhcjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTkRvY1RpdHVsYXI6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbUN1ZW50YTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsQ3VlbnRhOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnaXN0cm9Ucngge1xyXG5cclxuICAgIHB1YmxpYyBBY3RpdmlkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIElEOm51bWJlcjtcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcblxyXG4gICAgLy9BdHJpYnV0b3MgdW5pY28gZGVsIEZyb250XHJcbiAgICBwdWJsaWMgQWN0dWFsOnN0cmluZyA9IHVuZGVmaW5lZFxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgY3Vwb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSB0b2RvcyBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgcG9yIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9jdXBvbmVzX2dlbmVyYWRvc19ieV9wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9jdXBvbmVzX2dlbmVyYWRvc19ieV9wcm9jZXNvL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIHZhciBjdXBvbmVzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgdmFyIHJlc3BfY3Vwb25lczpBcnJheTxhbnk+O1xyXG4gICAgICAgICAgaWYoIWN1cG9uZXMuQ1VQT05FUy5DVVBPTi5sZW5ndGgpe1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMucHVzaChjdXBvbmVzLkNVUE9ORVMuQ1VQT04pO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJlc3BfY3Vwb25lcyA9IGN1cG9uZXMuQ1VQT05FUy5DVVBPTjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgZnVuY2lvbk9LKHJlc3BfY3Vwb25lcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcHVibGljIGdldEN1cG9uQnlJZERldChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZERldEN1cG9uXCI6IGlkRGV0Q3Vwb259O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL2dldEN1cG9uQnlJZERldC9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IGZha2VBc3luYyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlT2ZmTGluZSB7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaC5cclxuICAgIHB1YmxpYyBBZGREb2N1bWVudChpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWRkRG9jdW1lbnRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWRkRG9jdW1lbnQgZW5jb25ydHJvIGRvY3VtZW50XCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5zdGF0dXMpO1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBkb2N1bWVudFtcIl9yZXZcIl07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgRGVzdHJveSgpIHtcclxuICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgLy8gICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVcIik7XHJcbiAgICAvLyAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgLy8gICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveVRvdGFsKCl7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUsIGRlbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cm95KGZ1bmNpb25SZXA6RnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiT0tcIn0pO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXAoe1wiUmVzcFwiOlwiRXJyb3JcIiwgXCJEZXNjXCI6ZXJyfSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+ICFyb3cuaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCBwb3VjaGRic2l6ZSBmcm9tICdwb3VjaGRiLXNpemUnO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IE0zRGV2aWNlc1NlcnZpY2UgfSBmcm9tICdzZi1yZWdsYW5lZ29jaW8tZ3JsJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIGJkT2ZmTGluZUxvZyB7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgb00zRGV2aWNlc1NlcnZpY2U6TTNEZXZpY2VzU2VydmljZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZERvY3VtZW50KGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50LCB7IGZvcmNlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveShmdW5jaW9uUmVwOkZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIk9LXCJ9KTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIkVycm9yXCIsIFwiRGVzY1wiOmVycn0pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUluc3RhbmNlKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSW5zdGFuY2VBZ2FpbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIga2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUsIGRlbGV0ZWQ6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+ICFyb3cuaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkubWFwKGZ1bmN0aW9uIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWxpbWluYSBkZWwgTG9nIGxvcyBkb2NzIGNvbiBmZWNoYSBhbnRlcmlvciBvIGlndWFsIGEge3ttYXhEaWFzfX0gZGUgbGEgZmVjaGEgYWN0dWFsXHJcbiAgICAgKiBTZSBjb25jYXRlbmEgXCIgIDAwOjAwXCIgYSBsYSBmZWNoYSBwb3IgdW4gZXJyb3IgZW4gbGEgZnVuY2lvbmFsaWRhZCBkZSBcIm5ldyBEYXRlKClcIlxyXG4gICAgICogU2UgdXRpbGl6YSAoMTAwMCAqIDM2MDAgKiAyNCkgcGFyYSBjYWxjdWxhciBlbCBudW1lcm8gZGUgbWlsaXNlZ3VuZG9zIGVuIHVuIGTDg8KtYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRGVsZXRlT2xkRG9jcyhtYXhEaWFzOm51bWJlcikge1xyXG4gICAgICAgIC8vbGV0IG1heERpYXMgPSAzO1xyXG5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiRGVsZXRlT2xkRG9jc1wiKVxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGFsbERvY3MpXHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nU29ja2V0KGFsbERvY3MpO1xyXG4gICAgICAgICAgICBhbGxEb2NzLnJvd3MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoZWxlbWVudC5kb2MuRmVjaGEpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG5ldyBEYXRlKGVsZW1lbnQuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKERhdGUubm93KCkgLSBuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoKERhdGUubm93KCkgLSBuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpLmdldFRpbWUoKSkgLyAoMTAwMCAqIDM2MDAgKiAyNCkpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLmZpbHRlcihyb3cgPT4gTWF0aC5mbG9vcigoRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHJvdy5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKS5nZXRUaW1lKCkpIC8gKDEwMDAgKiAzNjAwICogMjQpKSA+PSBtYXhEaWFzKVxyXG4gICAgICAgICAgICAubWFwKCByb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9MbGFtYXIgc29ja2V0LiBcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEFkZExvZ1NvY2tldChvbE0zUHJvY2Vzb3M6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbXM6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IFt7IFwibm9tYnJlXCI6IFwiTTNQcm9jZXNvXCIsIFwidmFsb3JcIjogSlNPTi5zdHJpbmdpZnkob2xNM1Byb2Nlc29zKSB9XTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub00zRGV2aWNlc1NlcnZpY2UuRGV2aWNlX01Qb3ModGhpcy5BZGRMb2dTb2NrZXRPSywgcGFyYW1zLCBcIkxPR00zUHJvY2Vzb3NcIiwgbnVsbClcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXRPSyA9KCk9PntcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiXHJcbmltcG9ydCB7IHZhcmlhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyL3NyYy9vdXRwdXQvb3V0cHV0X2FzdFwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4uL1NlcnZpY2VzL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFueUFSZWNvcmQgfSBmcm9tIFwiZG5zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTWFlc3Ryb09mZmxpbmUge1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBmb3JtYXMgZGUgcGFnb1xyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIElkIGRlIGxhIEVtcHJlc2EgXHJcbiAgICAgKiBAcGFyYW0gcmVzcE9rX2dldF9mb3JtYXNfcGFnbyBGdW5jaW9uIGNvbiByZXNwdWVzdGEgT0tcclxuICAgICAqIEBwYXJhbSByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvIEZ1bmNpb24gY29uIHJlc3B1ZXN0YSBFUlJPUlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Rm9ybWFzUGFnbyhpZEthdGlvcywgaWRQcm9jZXNvOiBzdHJpbmcsIHJlc3BPa19nZXRfZm9ybWFzX3BhZ286IEZ1bmN0aW9uLCByZXNwRXJyb3JfZ2V0X2Zvcm1hc19wYWdvOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChcIkZvcm1hc1BhZ29cIikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcblxyXG4gICAgICAgICAgICByZXNwT2tfZ2V0X2Zvcm1hc19wYWdvKHRoaXMuRmlsdHJhckJ5UHJvY2VzbyhpZFByb2Nlc28sIHguRm9ybWFzUGFnbykpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgcmVzcEVycm9yX2dldF9mb3JtYXNfcGFnbyhlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbHRyYXIgbGFzIGZvcm1hcyBkZSBwYWdvLCBkZXBlbmRpZW5kbyBsYSBpbmZvcm1hY2lvbiBkZWwgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBpZFByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFzUGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZpbHRyYXJCeVByb2Nlc28oaWRQcm9jZXNvOiBzdHJpbmcsIGZvcm1hc1BhZ286IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXNQYWdvKTtcclxuICAgICAgICAgICAgaWYgKGlkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBmb3JtYXNQYWdvID0gZm9ybWFzUGFnby5maWx0ZXIoeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHguUFJPQ0VTT1MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4LlBST0NFU09TLmxlbmd0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguUFJPQ0VTT1MgPSBuZXcgQXJyYXk8YW55Pih4LlBST0NFU09TKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguUFJPQ0VTT1MuZmluZCh5ID0+IHkuSWRQcm9jZXNvID09IGlkUHJvY2VzbykgIT0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZvcm1hc1BhZ28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBGaWx0cmFyQnlQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXNQYWdvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hc1BhZ287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEVzdHJ1Y3R1cmEoZXN0OnN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZGluw4PCoW1pY2FzIHBvciBhY3RpdmlkYWRcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBJZCBkZSBsYSBlbXByZXNhXHJcbiAgICAgKiBAcGFyYW0gTG9hZERpbmFtaWNhc09LIEZ1bmNpb24gZGUgcmVzcHVlc3RhIE9LXHJcbiAgICAgKiBAcGFyYW0gTG9hZERpbmFtaWNhc0Vycm9yIEZ1bmNpb24gZGUgcmVzcHVlc3RhIEVSUk9SXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXREaW5hbWljYXNCeUFDdGl2aWRhZChpZEthdGlvcywgb0RhdGEsIExvYWREaW5hbWljYXNPSzogRnVuY3Rpb24sIExvYWREaW5hbWljYXNFcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgZGluYW1cclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoXCJESU5CWUFDVFwiKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSB4Lk0zRGluQnlBY3RpdmlkYWQ7XHJcbiAgICAgICAgICAgICAgICBkaW5hbSA9IGRpbmFtLmZpbHRlcih4ID0+IHguQWN0aXZpZGFkID09IG9EYXRhLkFjdGl2aWRhZCAmJiB4LklEQWN0aXZpZGFkID09IG9EYXRhLmlkQWN0aXZpZGFkICYmIHguSWRQcm9jZXNvID09IG9EYXRhLmlkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICBMb2FkRGluYW1pY2FzT0soZGluYW0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgTG9hZERpbmFtaWNhc09LKGRpbmFtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIExvYWREaW5hbWljYXNFcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgdWJpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBzSWRVYmljYWNpb25lcyBJZCBkZSBsYSB1YmljYWNpb24gYSBidXNjYXIgZW4gYmFzZSBkZSBkYXRvcyBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9TZXJ2aWNlTTNNYWVzdHJvIFNlcnZpY2lvIG1hZXN0cm8sIGVzdGEgdGllbmUgZnVuY2lvbmFsaWRhZCBwYXJhIGJ1c2NhciBlc3BlY2lmaWNhbWVudGUgdW4gdWJpY2FjaW9uXHJcbiAgICAgKiBAcGFyYW0gRnVuY2lvbk9LIEZ1bmNpb24gcXVlIHJldG9tYSBsYSBmdW5jaW9uYWxpZGFkIGN1YW5kbyBlcyBPSy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFViaWNhY2lvbmVzKGlka2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbmVzOiBzdHJpbmcsIG9TZXJ2aWNlTTNNYWVzdHJvOiBTZXJ2aWNlTTNNYWVzdHJvLCBGdW5jaW9uT0s6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9DYXJnYXIgaW5mb3JtYWNpb24gZGUgdWJpY2FjaW9uXHJcbiAgICAgICAgdmFyIG9NM1ViaWNhY2lvbjtcclxuICAgICAgICB2YXIgc0lkVWJpY2FjaW9uZXNDb3VjaCA9IGlka2F0aW9zLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgXCI/VUJJQ1wiOztcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lkVWJpY2FjaW9uZXNDb3VjaCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBvTTNVYmljYWNpb24gPSBvU2VydmljZU0zTWFlc3Ryby5HZXRVYmljYWNpb25Gcm9tTGlzdChyZXN1bHQuTGlzdFViaWNhY2lvbmVzLk0zVUJJQ0FDSU9OLCBzSWRVYmljYWNpb25lcyk7XHJcbiAgICAgICAgICAgIEZ1bmNpb25PSyhvTTNVYmljYWNpb24pO1xyXG5cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICBcclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIHByb21vY2lvbmVzXHJcbiAgICAvLyAgKiBAcGFyYW0gc0lEUHJvbW8gSWQgZGUgbGEgcHJvbW9jaW9uIGEgYnVzY2FyIGVuIGJhc2UgZGUgZGF0b3MgTm9TUUxcclxuICAgIC8vICAqIEBwYXJhbSBGdW5jaW9uT0sgRnVuY2lvbiBxdWUgcmV0b21hIGxhIGZ1bmNpb25hbGlkYWQgY3VhbmRvIGVzIE9LLlxyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgR2V0UHJvbW9jaW9uZXMoaWRrYXRpb3M6IHN0cmluZywgRnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgLy8gICAgIHZhciBMaXN0UHJvbW87XHJcbiAgICAvLyAgICAgdmFyIHNJRFByb21vID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9Qcm9tb2Npb25lc1wiO1xyXG4gICAgLy8gICAgIHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSURQcm9tbykudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgLy8gICAgICAgICBpZihyZXN1bHQuTTNFTkNQUk9NTyl7XHJcbiAgICAvLyAgICAgICAgICAgICBMaXN0UHJvbW8gPSByZXN1bHQuTTNFTkNQUk9NTztcclxuICAgIC8vICAgICAgICAgfWVsc2UgaWYocmVzdWx0Lk0zTGlzdEVOQ1BST01PLk0zRU5DUFJPTU8pe1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gcmVzdWx0Lk0zTGlzdEVOQ1BST01PLk0zRU5DUFJPTU87XHJcbiAgICAvLyAgICAgICAgIH1lbHNle1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBGdW5jaW9uT0soTGlzdFByb21vKTtcclxuICAgIC8vICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gc2luY3LDg8KzbmljYW1lbnRlIGRlIHRlbXBsYXRlLiBzZWd1biBlbCByZXBvcnRlIGVudHJhbnRlIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgQXN5bmNnZXRfdGVtcGxhdGVfcmVwb3J0ZShpZGthdGlvczogc3RyaW5nLCBpZHJlcCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZTtcclxuICAgICAgICAgICAgLy92YXIgc0lEID0gaWRrYXRpb3MudHJpbSgpLnRvVXBwZXJDYXNlKCkgKyBcIj9UZW1wbGF0ZXNcIjtcclxuICAgICAgICAgICAgdmFyIHNJRCA9IFwiVEVNUExBVEVTXCI7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRCk7XHJcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5SRVNQVUVTVEEuUlBUZW1wbGF0ZS5sZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBBcnJheTxhbnk+KHRlbXBsYXRlLlJFU1BVRVNUQS5SUFRlbXBsYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuUkVTUFVFU1RBLlJQVGVtcGxhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8vU2UgY3JlYW4gbG9zIG5vZG9zIHBhZHJlIFJFU1BVRVNUQSB5IFJQVGVtcGxhdGUsIHBhcmEgc2ltdWxhciBpZ3VhbCwgY29tbyBsbyByZXNwb25kZSBzZXJ2aWRvci5cclxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlVW5vID0geyBcIlJFU1BVRVNUQVwiOiB7IFwiUlBUZW1wbGF0ZVwiOiB0ZW1wbGF0ZS5maW5kKHQgPT4gdC5JZFJlcCA9PSBpZHJlcCkgfSB9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVVbm87XHJcbiAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG59ICAgIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VPZmZMaW5lIH0gZnJvbSBcIi4vU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi4vU2VydmljZXMvbTMtcmVnLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi4vU2VydmljZXMvTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYmRPZmZMaW5lTG9nIH0gZnJvbSBcIi4vU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvc09mZmxpbmUge1xyXG5cclxuICAgIC8vcHJpdmF0ZSBzS2V5Q3Rpdm9zOiBzdHJpbmcgPSBcIkNUSVZPU1wiO1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvU2VydmljZU9mZkxpbmU6IFNlcnZpY2VPZmZMaW5lLCBwcml2YXRlIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLFxyXG4gICAgICAgIHByaXZhdGUgb2JkT2ZmTGluZUxvZzogYmRPZmZMaW5lTG9nKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBNM1Byb2Nlc29zLCBzZWd1biBlbCBJRCBNM1xyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBNb3RvciAzXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zIFJlc3B1ZXN0YSBPSyBkZSBnZXQgZGUgTTMgcHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MgUmVzcHVlc3RhIEVycm9yIGRlIGdldCBkZSBNMyBwcm9jZXNvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0UHJvY2Vzb0J5SWQoaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0pBR00gMjAxOTExMDggY2FtYmlvIGRlIGRvbmRlIHRyYWVyIGVsIHByb2Nlc28gbG8gdHJhZSBkZXNkZSBvZmZsaW5lXHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICAvL3RoaXMub2JkT2ZmTGluZUxvZy5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhwcm9jZXNvKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIC8vUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKGVycm9yKTtcclxuICAgICAgICAgICAgdGhpcy5HZXRQcm9jZXNvQnlJZEZyb21Mb2coaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldFByb2Nlc29CeUlkRnJvbUxvZyhpZCwgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MTEwOCBjYW1iaW8gZGUgZG9uZGUgdHJhZXIgZWwgcHJvY2VzbyBsbyB0cmFlIGRlc2RlIG9mZmxpbmVcclxuICAgICAgICAvL3RoaXMub1NlcnZpY2VPZmZMaW5lLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MocHJvY2Vzbyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3MoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIE0zIFByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIE0zIFByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgT2JqZXRvIE0zIFByb2Nlc29zIGEgYWdyZWdhclxyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBGdW5jaW9uIE9LIHJlc3B1ZXN0YSBxdWUgYXRyYXBhcsODwqEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRQcm9jZXNvKGlka2F0aW9zOiBzdHJpbmcsIG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLklkTTMpIHtcclxuICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0SWRNM09mZmxpbmUoaWRrYXRpb3MsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKS50aGVuKGlkID0+IHtcclxuICAgICAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5JZE0zID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zOiBGdW5jdGlvbiwgaW50ZW50byA9IDApIHtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudChvbE0zUHJvY2Vzb3MuSWRNMy50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUlkTTMob2xNM1Byb2Nlc29zLklkTTMsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy8gdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2F2ZUlkTTMob2xNM1Byb2Nlc29zLklkTTMsIG9sTTNQcm9jZXNvcy5UTUlkUHJvY2Vzbywgb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcy5JREh1Yi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgLy8gICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgICAgIC8vIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyk7XHJcblxyXG4gICAgICAgICAgICAvL1Jlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIm9sTTNQcm9jZXNvc1wiOiBvbE0zUHJvY2Vzb3MsIFwiSW50ZW50b1wiOiBpbnRlbnRvLCBcImZ1bmN0aW9uXCI6IFwiQWRkVG9Eb2NPZmZsaW5lXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHsgXCJFcnJvclwiOiBcIkVycm9yIGVuIGd1YXJkYXIgZW4gYmFzZSBkZSBkYXRvcyBwY3BhbC5cIiB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgbG9nIG9mZmxpbmUgZGUgcHJvY2Vzb3MuXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG86IG51bWJlciA9IDApIHtcclxuICAgICAgICAvL0FncmVnYXIgYSBMb2cgU29ja2V0XHJcbiAgICAgICAgLy90aGlzLkFkZExvZ1NvY2tldChvbE0zUHJvY2Vzb3MpXHJcbiAgICAgICAgLy9yZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkFkZERvY3VtZW50KG9sTTNQcm9jZXNvcy5JZE0zLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcylcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuQWRkRG9jdW1lbnQob2xNM1Byb2Nlc29zLklkTTMudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKG9sTTNQcm9jZXNvcy5JZE0zKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJBZGRMb2dPZmZsaW5lXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyh7IFwiRXJyb3JcIjogXCJFcnJvciBlbiBndWFyZGFyIGVuIGJhc2UgZGUgZGF0b3MgbG9jYWwuXCIgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXRPSyA9ICgpID0+IHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb3NlSW5zdGFuY2VMb2dPZmYoKSB7XHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLmNsb3NlSW5zdGFuY2UoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldE9mZkxpbmVMb2coKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5HZXRBbGxEb2NzKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXQxRG9jT2ZmTGluZUxvZyhpZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldmVyc2FyIG0zIHByb2Nlc28sIGVuIGVsIGxvZyBsb2NhbC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFJldmVyc2FyRW5Mb2coaWQpIHtcclxuICAgICAgICB0aGlzLkdldDFEb2NPZmZMaW5lTG9nKGlkKS50aGVuKG9NM1AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Jlc3VsdDogTTNQcm9jZXNvcyA9IG9NM1A7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb1Jlc3VsdC5sTTNQRW5jRlAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9SZXN1bHQubE0zUEVuY0ZQW2ldLlZhbENhbWJpbyA9IDA7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxPdHJhQ2xhc2kgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9SZXN1bHQuSWRFc3RhZG8gPSBcIlJWXCI7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvUmVzdWx0LCBudWxsKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJ1aXJCRExvZyhmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLkRlc3Ryb3koZnVuY2lvblJlc3ApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZXN0cnVpckJET2ZmKGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZXN0cm95KGZ1bmNpb25SZXNwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU3VtYXJDdGl2byhpZG0zOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyB2YXIgc1BhcnQxO1xyXG4gICAgICAgIC8vIHZhciBzUGFydDI7XHJcblxyXG4gICAgICAgIC8vIHNQYXJ0MSA9IGlkbTMuc3Vic3RyaW5nKDAsIDgpO1xyXG4gICAgICAgIC8vIHNQYXJ0MiA9IGlkbTMuc3Vic3RyaW5nKDgsIGlkbTMubGVuZ3RoKTtcclxuICAgICAgICAvLyBzUGFydDIgPSArc1BhcnQyICsgMTtcclxuICAgICAgICAvLyBpZG0zID0gc1BhcnQxICsgc1BhcnQyO1xyXG4gICAgICAgIC8vIHJldHVybiBpZG0zO1xyXG4gICAgICAgIHZhciBzUGFydDE7XHJcbiAgICAgICAgdmFyIHNQYXJ0MjtcclxuICAgICAgICBzUGFydDEgPSBpZG0zLnN1YnN0cmluZygwLCA5KTtcclxuICAgICAgICBzUGFydDIgPSBpZG0zLnN1YnN0cmluZyg5KTtcclxuICAgICAgICBzUGFydDIgPSArc1BhcnQyICsgMTtcclxuICAgICAgICBpZG0zID0gc1BhcnQxICsgXCJcIiArIHNQYXJ0MjtcclxuICAgICAgICByZXR1cm4gaWRtMztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjdHVhbGl6YXIgZWwgTTMgUHJvY2Vzb3MsIHRlbmllbmRvIGVsIElkIGRlbCBkb2N1bWVudG8gZ3VhcmRhZG8gZW4gbGEgQkQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgZG9jdW1lbnRvIEJkIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIE0zIFByb2Nlc29zIGEgYWxtYWNlbmFyIC8gQWN0dWFsaXphclxyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBSZXNwdWVzdGEgZGUgT0suXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRQcm9jZXNvKGlkLCBvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG8gPSAwKSB7XHJcblxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KGlkLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgLy9SZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoaWQpO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwib2xNM1Byb2Nlc29zXCI6IG9sTTNQcm9jZXNvcywgXCJJbnRlbnRvXCI6IGludGVudG8sIFwiZnVuY3Rpb25cIjogXCJ1cGRQcm9jZXNvXCIgfSkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZW50byA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuSW5zdGFuY2VBZ2FpbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRQcm9jZXNvKGlkLCBvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoeyBcIkVycm9yXCI6IFwiRXJyb3IgZW4gZ3VhcmRhciBlbiBiYXNlIGRlIGRhdG9zIHBjcGFsLlwiIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemFyIGVsIE0zIFByb2Nlc29zLCB0ZW5pZW5kbyBlbCBJZCBkZWwgZG9jdW1lbnRvIGd1YXJkYWRvIGVuIGxhIEJEIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIGRvY3VtZW50byBCZCBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBhIGFsbWFjZW5hciAvIEFjdHVhbGl6YXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIHVwZFByb2Nlc29Bc3luYyhpZCwgb2xNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQoaWQudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKTtcclxuICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzT2ZmTGluZVNpbkRvY3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNhclRpY2tldE9mZmxpbmUoaWRrYXRpb3MsIHByb2Nlc28sIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRrYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5WYWxpZGFyVGlja2V0Q2VycmFkbyhwcm9jZXNvKSkge1xyXG4gICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHByb2Nlc28pO1xyXG5cclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShpZGthdGlvcywgdGhpcy5vUG9zdFNlcnZpY2VNMywgbE0zUHJvY2Vzb3MsIG9EYXRhVXNlcikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AodHJ1ZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHByb2Nlc29zIHF1ZSBzZSBwcm9jZXNhcm9uIG1pZW50cmFzIHNlIGVzdGFiYSBmdWVyYSBkZSBsaW5lYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclByb2Nlc29zQWdyZWdhZG9zT2ZmTGluZShpZGthdGlvcywgb0RhdGFVc2VyOiBhbnksIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJFbnRybyBWYWxpZGFyUHJvY2Vzb3NBZ3JlZ2Fkb3NPZmZMaW5lXCIpXHJcbiAgICAgICAgdmFyIGxNM1Byb2Nlc29zID0gbmV3IEFycmF5PE0zUHJvY2Vzb3M+KCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlka2F0aW9zKTtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzKCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAvLyBoYW5kbGUgcmVzdWx0XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0LnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LnJvd3NbaV0uaWQuc3RhcnRzV2l0aChcIkNUSVZPU1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtM1Byb2Nlc286IE0zUHJvY2Vzb3MgPSByZXN1bHQucm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhclRpY2tldENlcnJhZG8obTNQcm9jZXNvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHJlc3VsdC5yb3dzW2ldLmRvYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJBbnRlcyBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZVwiKVxyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lKGlka2F0aW9zLCB0aGlzLm9Qb3N0U2VydmljZU0zLCBsTTNQcm9jZXNvcywgb0RhdGFVc2VyKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJEaW8gUmVzcHVlc3RhIFJlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lXCIpXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KVxyXG4gICAgICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiaWYgMVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkRlbGV0ZUFsbERvY3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcCh0cnVlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiaWYgMlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIC8vUmVzcHVlc3RhIGNvbiBlcnJvcmVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGVBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoZmFsc2UsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2lvbiBkZSBxdWUgZWwgdGlja2V0IGVzdGEgY2VycmFkby5cclxuICAgICAqIEBwYXJhbSBtM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyVGlja2V0Q2VycmFkbyhtM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgYkNlcnJhZG86IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGlmIChtM1Byb2Nlc28gJiYgbTNQcm9jZXNvLlN1YkVzdGFkb0FudCAhPSBcIkRlY2xpbmFkb1wiICYmIG0zUHJvY2Vzby5NM0VOQy5sZW5ndGggPiAwICYmIG0zUHJvY2Vzby5sTTNQRW5jRlAubGVuZ3RoID09IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDYW50aWRhZFRvdGFsQnlNM1Byb2Nlc28obTNQcm9jZXNvKSA+IDApIHtcclxuICAgICAgICAgICAgYkNlcnJhZG8gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJDZXJyYWRvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbEJ5TTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICYmIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWQgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApO1xyXG4gICAgICAgICAgICBpZiAoZENhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRDYW50aWRhZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB0b2RvcyBsb3MgZG9jdW1lbnRvcyBPZmYgbGluZSBxdWUgc2UgaGFuIGd1YXJkYWRvIGNvbW8gb2ZmbGluZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldEFsbERvY3NPZmZsaW5lKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBsTTNQcm9jZXNvcyA9IG5ldyBBcnJheTxNM1Byb2Nlc29zPigpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJvd3NbaV0uaWQgIT0gXCJDVElWT1NcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocmVzdWx0LnJvd3NbaV0uZG9jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHRvZG9zIGxvcyBkb2N1bWVudG9zIE9mZiBsaW5lIHF1ZSBzZSBoYW4gZ3VhcmRhZG8gY29tbyBvZmZsaW5lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZmxpbmVEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzRGVsZXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVDdGl2b3ModWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGUodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxDdGl2b3ModWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxvcyBjb25zZWN1dGl2b3MgcXVlIGVzdGFuIGxvY2FsbWVudGUgdnMgbG9zIHF1ZSBlc3RhbiBlbiBlbCBzZXJ2aWRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYWNpb25DdGl2b3NWU1NlcnZlcihpa2F0aW9zOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBpZEh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmdldEFsbEN0aXZvcyh1YmljYWNpb24sIGlkSHViKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgICAgIG9TZXJ2aWNlTTNNYWVzdHJvLlZhbGlkYXJDdGl2b3NWU0xvY2FsKHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGlrYXRpb3MsIEpTT04uc3RyaW5naWZ5KHgpLCB1YmljYWNpb24sIGlkSHViLCBmdW5jaW9uUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjb25zZWN1dGl2byBlbiBlbCBxdWUgdmEsIGVsIHByb2Nlc28gb2ZmbGluZSBxdWUgcmVjaWJlIGNvbW8gcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gdWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqIEBwYXJhbSBzSWRQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q3Rpdm9PZmZMaW5lKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGN0aXZvOiBzdHJpbmcgPSBcIjBcIjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGEgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RhdGFGaW5kZWQ6IGFueSA9IG9EYXRhLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gc0lkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQuQ3Rpdm8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjdGl2byA9IG9EYXRhRmluZGVkLkN0aXZvLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgcmV0dXJuIGN0aXZvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBpZCBtMyBcclxuICAgICAqIEBwYXJhbSBzSWRNMyBcclxuICAgICAqIEBwYXJhbSBzSWRQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUlkTTMoc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGE6IEFycmF5PGFueT4gPSBkYXRhLkN0aXZvcztcclxuICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YS5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gc0lkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YUZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGN0aXZvQW50ID0gK29EYXRhRmluZGVkLkN0aXZvLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIHZhciBjdGl2b0FjdCA9ICtzSWRNMy5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3Rpdm9BY3QgPiBjdGl2b0FudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EYXRhRmluZGVkLkN0aXZvID0gc0lkTTM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YS5wdXNoKHsgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbywgXCJDdGl2b1wiOiBzSWRNMyB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICBpZiAoc0lkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIsIHNJZE0zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgb0RhdGEucHVzaCh7IFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28sIFwiQ3Rpdm9cIjogc0lkTTMgfSlcclxuICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIGlmIChzSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJUSUNLRVRWRU5UQVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIiwgc0lkTTMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGN0aXZvcywgSWRtMy5cclxuICAgICAqIEBwYXJhbSBvRGF0YSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBTYXZlQ3Rpdm9zKG9EYXRhOiBBcnJheTxhbnk+LCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIGludGVudG8gPSAwKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZCA9IHsgXCJDdGl2b3NcIjogb0RhdGEgfVxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSwgb0RhdGFTZW5kKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk9LXCIpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwiQ3Rpdm9zXCI6IG9EYXRhU2VuZCwgXCJmdW5jdGlvblwiOiBcIlNhdmVDdGl2b3NcIiB9KSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgaWYgKGludGVudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1YiwgMSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVPbGREb2NzKG1heERpYXM6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5EZWxldGVPbGREb2NzKG1heERpYXMpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBJZCBtMywgY3VhbmRvIGVzdGEgZnVlcmEgZGUgbGluZWFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBHZXRJZE0zT2ZmbGluZShpZGthdGlvczogc3RyaW5nLCBpZHByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhSWRNMztcclxuICAgICAgICB2YXIgaWRNMztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvRGF0YUlkTTMgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKTtcclxuICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YUlkTTMuQ3Rpdm9zLmZpbmQoeCA9PiB4LklkUHJvY2VzbyA9PSBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIGlkTTMgPSBvRGF0YUZpbmRlZC5DdGl2bztcclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLlN1bWFyQ3Rpdm8oaWRNMyk7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy52YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLkdldEN0aXZvKGlka2F0aW9zLCBpZHByb2Nlc28sIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAvLyB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIC8vIGlkTTMgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZGF0ZS5nZXRNb250aCgpICsgXCJcIiArIGRhdGUuZ2V0RGF5KCkgKyBcIlwiICsgZGF0ZS5nZXRIb3VycygpICsgXCJcIiArIGRhdGUuZ2V0TWludXRlcygpICsgXCJcIiArIGRhdGUuZ2V0U2Vjb25kcygpICsgXCJcIiArIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIGlkTTMgPSB0aGlzLkdldEN0aXZvKGlka2F0aW9zLCBpZHByb2Nlc28sIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlkTTM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHZhbGlkYXJBdW1lbnRvQ3Rpdm8oaWRNMywgaWRwcm9jZXNvKSB7XHJcbiAgICAgICAgaWYgKGlkcHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICBsZXQgdWx0aW1vSWRNMyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiKTtcclxuICAgICAgICAgICAgaWYgKHVsdGltb0lkTTMgPT0gaWRNMykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLlN1bWFyQ3Rpdm8oaWRNMyk7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nQ3Rpdm9zXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJpZE0zXCI6IGlkTTMsIFwiZnVuY3Rpb25cIjogXCJ2YWxpZGFyQXVtZW50b0N0aXZvXCIgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgR2V0Q3Rpdm8oaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHNDdGl2bztcclxuICAgICAgICBzQ3Rpdm8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5HZXRDdGl2b0JZUHJvY2Vzbyh0aGlzLm9Qb3N0U2VydmljZU0zLCBpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgcmV0dXJuIHNDdGl2bztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGxsYXZlIGRlIHBvdWNoREJcclxuICAgICAqIEBwYXJhbSB1YmljIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEtleSh1YmljLCBodWIpIHtcclxuICAgICAgICByZXR1cm4gXCJDVElWT1NfXCIgKyB1YmljICsgaHViO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zKSB7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3Qoc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL00zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3QvXCIgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG4gICAgY2F0Y2h7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIG5vdGlkaWNhY2lvbmVzIHBvciBodWJcclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdFdpdGhUaW1lT3V0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSwgdGltZU91dDogbnVtYmVyKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQsIHRpbWVPdXQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIG5vdGlkaWNhY2lvbmVzIHBvciBodWIgZGUgdW4gaWRSZXAgZGFkb1xyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICogQHBhcmFtIGRhdGEgXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIG0zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgIC8vdmFyIGRhdGEgPSB7XCJpZF9yZXBcIjpcIlwiLCBcImlkX3ViaWNhY2lvblwiOlwiXCIsIFwiaWRfaHViXCI6XCJcIn1cclxuICAgIHRyeSB7XHJcbiAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5vUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvbTNfZ2V0X25vdGlmaWNhY2lvbl94X2h1Yl9vYmplY3QvXCIgKyBzSURLYXRpb3MsIGRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcCkpO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGd1YXJkYXJDYW1iaW9zQ29uZmlndXJhY2lvbkltcHJlc2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM05vdGlmQ29udHJvbGxlci9ndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBvRnVuY2lvbkVycihlcnJvcltcIl9ib2R5XCJdKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNb2RlbE0zTm90aWZ7XHJcbiAgICBwdWJsaWMgSWRSZXA6c3RyaW5nO1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBJZEh1YjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ29ycmVyOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGF0YTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ29uZkltcDpzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQcmVzZW50YWNpb25lc3tcclxuICAgIHB1YmxpYyBOSVZFTFBSUzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVkFMT1I6bnVtYmVyO1xyXG4gICAgcHVibGljIFRPUEU6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyByZXNlcnZlU2xvdHMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ29uc3VsdGFzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgaW52ZW50YXJpbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxvcyBwYWNrIGFzb2NpYWRvcyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAgICogQHBhcmFtIGRhdGEgSnNvbiBjb24gaW5mb3JtYWNpb24gZGUgU0tQMSAoTW9kZWxvKSB5IFViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNfR0VUSU5WRU5UQVJJT0JZUEFDSyhzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLlBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zQ29uc3VsdGFzL00zX0dFVElOVkVOVEFSSU9CWVBBQ0svXCIgKyBzSURLYXRpb3MsIGRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJJbnZlbnRhcmlvTmVnYXRpdm9Qcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL3ZhbGlkYXJJbnZlbnRhcmlvTmVnYXRpdm9Qcm9kdWN0by9cIiArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIEJ1c2NhckNvbmNlcHRvRW5NM1NJVShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pe1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zQ29uc3VsdGFzL00zX0dFVENvbmNlcHRvRnJvbVNJVS9cIiArIGlkS2F0aW9zICsgXCIvXCIgKyBkYXRhLnNVYmljYWNpb24gKyBcIi9cIiArIGRhdGEuc0NvbmNlcHRvLCB7fSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVycm9yLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBURUNMQVNSQVBJREFTe1xyXG4gICAgcHVibGljIENvbXBvbmVudGU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRlY2xhOnN0cmluZztcclxuICAgIHB1YmxpYyBGdW5jaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBJZEVsZW1lbnRvOnN0cmluZztcclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFBSRFNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBhcGxQYXF1ZXRlcyA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZsYWdTeW5jQ291Y2goKSB7XHJcbiAgICAgICAgdmFyIHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgdmFyIG9TVWJpY2FjaW9uO1xyXG4gICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBsZXQgY29uZmlnO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLk0zSFVCUyAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0gJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2Uob1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuU3luY0NvdWNoQXV0byAhPSBudWxsICYmIGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSBjb25maWcuU3luY0NvdWNoQXV0bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICh0aGlzLmlka2F0aW9zKSB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJQUkRcIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhclBhcXVldGVzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFwbFBhcXVldGVzKSB7XHJcbiAgICAgICAgICAgIGxldCB1YmljYWNpb24gPSB0aGlzLmdldFViaWNhY2lvbigpO1xyXG4gICAgICAgICAgICBpZiAodWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc2FcIiArIHViaWNhY2lvbiArIFwiX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXJQYXF1ZXRlcygpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFViaWNhY2lvbigpIHtcclxuICAgICAgICBsZXQgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICBsZXQgb1NVYmljYWNpb247XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uSURVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU1ViaWNhY2lvbi5JRFViaWNhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIEthdGlvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTFBBUVNcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsICYmIGFwbC5WYWxvciA9PSBcIjFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBsUGFxdWV0ZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KGlka2F0aW9zKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hcGxTeW5jQ291Y2hBdXRvID0gdGhpcy5nZXRGbGFnU3luY0NvdWNoKCk7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0aGlzLmFwbFN5bmNDb3VjaEF1dG8sXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZVByZChpZCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVBbGxEb2NzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KS50aGVuKGFsbERvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsRG9jcy5yb3dzLm1hcChyb3cgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgX2lkOiByb3cuaWQsIF9yZXY6IHJvdy5kb2MuX3JldiwgX2RlbGV0ZWQ6IHRydWUgfTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkudGhlbihkZWxldGVEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvZHNQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvcztcclxuICAgIHByaXZhdGUgYXBsU3luY0NvdWNoQXV0byA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiY29kc3ByZF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vYXNzZXRzL0NvbmZpZy9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXBsU3luY0NvdWNoQXV0byA9IHRoaXMuZ2V0RmxhZ1N5bmNDb3VjaCgpO1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdGhpcy5hcGxTeW5jQ291Y2hBdXRvLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gQ09EUyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIENPRFMgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoUHJvbW9jaW9uZXNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgLy90aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoc0lka2F0aW9zKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcihzSWRrYXRpb3MpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMyArIFwicHJvbW9jaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luY1dpdGhEQihyZW1vdGVEYXRhYmFzZTogUG91Y2hEQikge1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc3luY0F3YWl0KHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgICAgIHRoaXMuc3luY1dpdGhEQihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5jb21wYWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIGNoYW5nZXMocmVtb3RlOiBzdHJpbmcpe1xyXG4gICAgLy8gICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcbiAgICAvLyAgICAgcmVtb3RlRGF0YWJhc2UuY2hhbmdlcyh7XHJcbiAgICAvLyAgICAgICAgIHNpbmNlOiAnbm93JyxcclxuICAgIC8vICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgaW5jbHVkZV9kb2NzOiB0cnVlXHJcbiAgICAvLyAgICAgICB9KS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGNoYW5nZSkge1xyXG4gICAgLy8gICAgICAgICAvLyBjaGFuZ2UuaWQgY29udGFpbnMgdGhlIGRvYyBpZCwgY2hhbmdlLmRvYyBjb250YWlucyB0aGUgZG9jXHJcbiAgICAvLyAgICAgICAgIGlmIChjaGFuZ2UuZGVsZXRlZCkge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBkZWxldGVkXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgLy8gZG9jdW1lbnQgd2FzIGFkZGVkL21vZGlmaWVkXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgIC8vICAgICAgICAgLy8gaGFuZGxlIGVycm9yc1xyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZShpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4oZG9jID0+e1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUoZG9jKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVsZW1lbnRSZW1vdmVkKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2hhbmdlcyh7IGxpdmU6IHRydWUsIHNpbmNlOiAnbm93JywgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXHJcbiAgICAgICAgLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRSZW0uZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vcmVuZGVyRG9jc1NvbWVob3coKTtcclxuICAgICAgICB9KS5vbignZXJyb3InLCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVtb3ZlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlbTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbiAgfSlcclxuZXhwb3J0IGNsYXNzIENvdWNoVWJpY2FjaW9uZXNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgc0lka2F0aW9zPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdmFyIHNJZGthdGlvczpzdHJpbmc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwidWJpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTpzdHJpbmd7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpe1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZihzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpe1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgIFxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2hhbmdlSXRlbSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgLy9pZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZpY2FjaW9uZXNBUFAge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJub3RpZmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vYXNzZXRzL0NvbmZpZy9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgYmFzZSBkZSBkYXRvcy5cclxuICAgIHB1YmxpYyBHZXREYXRhUG91Y2hCRChpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vYXJtYXIga2V5IGRlIGRvY3VtZW50byBxdWUgc2UgcXVpZXJlIGNvbnN1bHRhclxyXG4gICAgcHVibGljIEdldEtleURvY3VtZW50b0RCKGlzSURLYXRpb3M6IHN0cmluZywgaXNEb2N1bWVudG86IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBpc0lES2F0aW9zICsgXCI/XCIgKyBpc0RvY3VtZW50bztcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrQnlUaXBvIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcGFjay1ieS10aXBvXCI7XHJcbmltcG9ydCB7IE0zUGFja0J5UmVnbGFzIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcGFjay1ieS1yZWdsYXNcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE0zUEl0ZW1zV0VCIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VydmljZU0zUGFja0J5aXBvIHtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBvcGVyYXRvcnMgPSB7XHJcbiAgICAgICAgJzwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPCArYiB9LFxyXG4gICAgICAgICc+JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthID4gK2IgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPD0gK2IgfSxcclxuICAgICAgICAnPj0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPj0gK2IgfSxcclxuICAgICAgICAnSUdVQUwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PSBiIH0sXHJcbiAgICAgICAgJ0RJRkYnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAhPSBiIH0sXHJcbiAgICAgICAgJ0VOJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT09IGIgfSxcclxuICAgICAgICAnQU5EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJiYgYiB9LFxyXG4gICAgICAgICdPUic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIHx8IGIgfSxcclxuICAgICAgICAnKic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiB0cnVlIH0sXHJcbiAgICAgICAgJ01PRCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSAlICtiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBzaSBlbCBwcm9kdWN0byBxdWUgc2Vyw4PCoSBoaWpvLCBjdW1wbGUgY29uIGxhcyBjYXJhY3RlcmlzdGljYXNcclxuICAgICAqIEBwYXJhbSBtM1Byb2NQS0cgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyU2lFc1RpcG8obTNQcm9jUEtHOiBUeXBlTTNQcmRHcnAsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAobTNQcm9jUEtHLk0zUEFDS0JZVElQTy5maW5kKHggPT4geC5ERVNUSU5PID09IHByb2R1Y3RvLlRJUE8pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwbGljYWNpb24gZGUgcmVnbGFzIGRlIHBhcXVldGVzLCB0ZW5pZW5kbyBlbiBjdWVudGEgYWwgaW5mb3JtYWNpw4PCs24gZGVsIHByb2R1Y3RvIGluZ3Jlc2Fkby5cclxuICAgICAqIEBwYXJhbSBtM1Byb2NQS0cgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdG8gXHJcbiAgICAgKiBAcGFyYW0gb00zUEl0ZW1zV0VCIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhVmFsaWRhY2lvbmVzKG0zUHJvY1BLRzogVHlwZU0zUHJkR3JwLCBwcm9kdWN0bzogVHlwZU0zUHJkR3JwLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGJSZXNwOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgb00zUEFDS0JZVElQTzogTTNQcmRQYWNrQnlUaXBvID0gbTNQcm9jUEtHLk0zUEFDS0JZVElQTy5maW5kKHggPT4geC5ERVNUSU5PID09IHByb2R1Y3RvLlRJUE8pO1xyXG4gICAgICAgICAgICBpZiAob00zUEFDS0JZVElQTykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IG9NM1BBQ0tCWVRJUE8uTTNQQUNLUkVHTEFTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BhY2tCeVJlZ2xhczogTTNQYWNrQnlSZWdsYXMgPSBvTTNQQUNLQllUSVBPLk0zUEFDS1JFR0xBU1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGVzdGEgdmFsaWRhbmRvIGVsIHBhcGEgZGVsIHBhcXVldGUuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcGVyYXRvcnNbb00zUGFja0J5UmVnbGFzLk9wZXJhY2lvbl0odGhpcy5HZXRQYXJhbWV0cm9zKG9NM1BhY2tCeVJlZ2xhcy5QYXJhbTEsIG0zUHJvY1BLRykgLCB0aGlzLkdldFBhcmFtZXRyb3Mob00zUGFja0J5UmVnbGFzLlBhcmFtMiwgbTNQcm9jUEtHKSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYWNpb25BY2Npb24ob00zUGFja0J5UmVnbGFzLkFjY2lvbiwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDg8KzbiBkZSBhY2Npb24gZGUgcmVnbGFzIGRlIHBhcXVldGUuXHJcbiAgICAgKiBAcGFyYW0gc0FjY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBWYWxpZGFjaW9uQWNjaW9uKHNBY2Npb246c3RyaW5nLCBvTTNQSXRlbXNXRUI6TTNQSXRlbXNXRUIpe1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgaWYoc0FjY2lvbiAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0FjY2lvbjphbnkgPSBKU09OLnBhcnNlKHNBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgaWYob0FjY2lvbi5BY2Npb24pe1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvQWNjaW9uLkFjY2lvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYW50aWRhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2goZXgpe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjacODwrNuIGRlIHBhcmFtZXRyb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYXMgcmVnbGFzLlxyXG4gICAgICogQHBhcmFtIHBhcmFtZXRybyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRQYXJhbWV0cm9zKHBhcmFtZXRybzogc3RyaW5nLCBwcm9kdWN0bzogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgdmFyIHNQYXJhbTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcmVnbGE6IHN0cmluZyA9IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMF07XHJcbiAgICAgICAgICAgIHN3aXRjaCAocmVnbGEudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHByb2R1Y3RvLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBwYXJhbWV0cm8uc3BsaXQoXCJfXCIpWzFdKS5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT05TVFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlZ2xhLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlNLUFwiKSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzUGFyYW0gPSBwcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXVtyZWdsYV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzUGFyYW07XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbn0iLCJpbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbHRyb3NEaWFyaW9PZmZMaW5lIHtcclxuICAgIHB1YmxpYyBGaWx0cmFyQnlGZWNoYXNPZmYoRGF0YSwgQWRkVG9Eb2M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJvd3M6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIC8vdmFyIG5ld1Jvd3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICB2YXIgZmVjaGFJID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkZlY2hhSXRDT0ZGXCIpO1xyXG4gICAgICAgICAgICB2YXIgZmVjaGFGID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkZlY2hhRnRDT0ZGXCIpO1xyXG4gICAgICAgICAgICByb3dzID0gRGF0YS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZlY2hhRiAmJiBmZWNoYUkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpRkluaWNpbyA9IHRoaXMuR2V0RmVjaGFOdW1iZXIoZmVjaGFJKTtcclxuICAgICAgICAgICAgICAgIHZhciBpRkZpbmFsID0gdGhpcy5HZXRGZWNoYU51bWJlcihmZWNoYUYpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coaUZJbmljaW8pXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpRkZpbmFsKVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0zcDogYW55ID0gcm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0zcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmVjaGFQcm9jID0gdGhpcy5HZXRGZWNoYU51bWJlcihtM3AuRmVjaGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZlY2hhUHJvYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCtmZWNoYVByb2MgPj0gK2lGSW5pY2lvICYmICtmZWNoYVByb2MgPD0gK2lGRmluYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV3Um93cy5wdXNoKHJvd3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9Eb2MobTNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpbHRyYXJCeUZlY2hhc09mZlwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEZpbHRyYXJCeVRleHRvKERhdGEsIHNUZXh0bzogc3RyaW5nLCBBZGRUb0RvYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcm93czogQXJyYXk8YW55PjtcclxuXHJcbiAgICAgICAgICAgIHJvd3MgPSBEYXRhLnJvd3M7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG0zcDogYW55ID0gcm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICBpZiAobTNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0zcC5JZE0zLmluY2x1ZGVzKHNUZXh0bykgfHwgKG0zcC5uZG9jVUFjdGl2byAmJiBtM3AubmRvY1VBY3Rpdm8uaW5jbHVkZXMoc1RleHRvKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdSb3dzLnB1c2gocm93c1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZFRvRG9jKG0zcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlsdHJhckJ5RmVjaGFzT2ZmXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEZlY2hhTnVtYmVyKHNkYXRlOiBzdHJpbmcpIHtcclxuICAgICAgICAvL3ZhciBkYXRlID0gbmV3IERhdGUoc2RhdGUpO1xyXG4gICAgICAgIHZhciBkID0gbW9tZW50KHNkYXRlKS5mb3JtYXQoJ1lZWVlNTUREJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQZXJ4aXBvIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcInBlcnh0aXBvX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwZXJ4dGlwb19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG4vLyBASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3VjaERpbmFtQnlQcm9jZXNvcyB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuICAgICAgICBcclxuICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiZGluYW14cHJvY19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiZGluYW14cHJvY19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgIFxyXG59XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YT0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iXSwibmFtZXMiOlsiXyIsInRpbWVvdXQiLCJIZWFkZXJzIiwiUmVxdWVzdE9wdGlvbnMiLCJJbmplY3RhYmxlIiwiSHR0cCIsIkh0dHBDbGllbnQiLCJFdmVudEVtaXR0ZXIiLCJtb21lbnQiLCJ0c2xpYl8xLl9fdmFsdWVzIiwiXy5jbG9uZURlZXAiLCJQb3N0U2VydmljZU0zIiwidHNsaWJfMS5fX2RlY29yYXRlIiwidHNsaWJfMS5fX3BhcmFtIiwiT3B0aW9uYWwiLCJNM0RldmljZXNTZXJ2aWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztBQWNBLElBZU8sSUFBSSxRQUFRLEdBQUc7UUFDbEIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksa0JBQWtCLENBQUM7WUFDM0MsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2pELENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztvQkFBRSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEY7WUFDRCxPQUFPLENBQUMsQ0FBQztTQUNaLENBQUE7UUFDRCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQTtBQUVELHdCQVUyQixVQUFVLEVBQUUsTUFBTSxFQUFFLEdB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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSTt3QkFBRSxPQUFPLENBQUMsQ0FBQztvQkFDN0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDVCxLQUFLLENBQUMsQ0FBQzt3QkFBQyxLQUFLLENBQUM7NEJBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFBQyxNQUFNO3dCQUM5QixLQUFLLENBQUM7NEJBQUVBLElBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7d0JBQ3hELEtBQUssQ0FBQzs0QkFBRUEsSUFBQyxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQUMsU0FBUzt3QkFDakQsS0FBSyxDQUFDOzRCQUFFLEVBQUUsR0FBR0EsSUFBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFBQ0EsSUFBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFBQyxTQUFTO3dCQUNqRDs0QkFDSSxJQUFJLEVBQUUsQ0FBQyxHQUFHQSxJQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dDQUFFQSxJQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUFDLFNBQVM7NkJBQUU7NEJBQzVHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUFFQSxJQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FBQyxNQUFNOzZCQUFFOzRCQUN0RixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUlBLElBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUFFQSxJQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dDQUFDLE1BQU07NkJBQUU7NEJBQ3JFLElBQUksQ0FBQyxJQUFJQSxJQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FBRUEsSUFBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQUNBLElBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUFDLE1BQU07NkJBQUU7NEJBQ25FLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FBRUEsSUFBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFDdEJBLElBQUMsQ0FBQyxJ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QUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7d0JBQzdELE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFBO3dCQUN2RSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7d0JBQzlGLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7cUJBQ3hILENBQUMsQ0FBQztvQkFDSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUEsQ0FBQzt5QkFDM0os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
|
|
16909
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtcmVnbGFuZWdvY2lvbTMudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvRGF0YS9tMy1jb3VjaC1tYWVzdHJvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9EYXRhL20zLWRhdGEudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vZmlsdHJvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkR3JwLnR5cGUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXAtaW1wdWVzdG9zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGRpbmFtaWNhcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGVuYy1mcC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGVuYy1pdGVtcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcC1lbnZpb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLWYtdHJhYmFqby50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcHJvY2Vzb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXByZWNlcGNpb24udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlci14LXByb2Nlc28udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtZmUuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcHJvY2Vzby5pbnRlcmZhY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NaXNjZWxhbmVhL01hdGhURi5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUHJvbW9jaW9uZXMvcHJvbW9jaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1jb25maWdscC5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL00zTWFlc3Ryby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1yZWctc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtdHJ4LmludGVyZmFjZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtZGluLXByb2Nlc29zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkUGFja0RldC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9VYmljYWNpb24vTTNVYmlBZGljaW9uYWxlcy50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNDT05ESUFHUlVQQUNJT04uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM0NPTkRJUFJPTU8uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM0RFVENPTkRJUFJPTU8uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy11YmljYWNpb24uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLW1hc2l2by5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1yZWctbWFzaXZvLWFrei5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1yZXZlcnNvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBkaW5hbS1ieS1hY3RpdmlkYWQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtZGluLWJ5LWFjdGl2aWRhZC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtc2FsZG9zLXgtY3VlbnRhLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1yZWctdHJ4LnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9DdXBvbmVzL2N1cG9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9TZXJ2aWNlL2JkLW9mZmxpbmUuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9TZXJ2aWNlL2JkLW9mZmxpbmUtbG9nLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvc2VydmljZS1tMy1tYWVzdHJvLW9mZmxpbmUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvc2VydmljZS1tMy1wcm9jZXNvLW9mZmxpbmUudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLW5vdGlmaWNhY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTm90aWZpY2FjaW9uZXMvTTNOb2ZpdGljYWNpb25lcy5tb2RlbC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9tMy1wcmVzZW50YWNpb25lcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvQ29uc3VsdGFzTTMvbTMtY29uc3VsdGFzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vVWJpY2FjaW9uL20zLXRlY2xhcy1yYXBpZGFzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXByZHMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1jb2RzcHJkLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtcHJvbW9jaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC11YmljYWNpb25lcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Ob3RpZmljYWNpb25lcy9ub3RpZmljYWNpb25lcy1tMy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1wYWNrLWJ5LXRpcG8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9TZXJ2aWNlL2ZpbHRyb3MtZGlhcmlvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtcGVyeHRpcG8udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtZGluYW14cHJvY2Vzb3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIGlmIChlLmluZGV4T2YocFtpXSkgPCAwKVxyXG4gICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xyXG4gICAgcmVzdWx0LmRlZmF1bHQgPSBtb2Q7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG4iLCJpbXBvcnQgeyBIdHRwLCBSZXF1ZXN0T3B0aW9ucywgSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnXHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAvc3JjL3N0YXRpY19yZXNwb25zZSdcclxuaW1wb3J0IHsgdGltZW91dCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQb3N0U2VydmljZU0zIHtcclxuICAgIGlka2F0aW9zOiBzdHJpbmdcclxuICAgIHNlcnZpZG9yOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvclBlcnNvbmFzOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckdlbmVyYWxlczogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JNMzogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JGRU1YOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckRvY3VtZW50b3M6IHN0cmluZztcclxuICAgIHNlcnZpZG9yQ29udGFibGU6IHN0cmluZztcclxuICAgIHNlcnZpZG9yUHJlc3RhbW86IHN0cmluZztcclxuICAgIFdlYkJhc2U6IHN0cmluZztcclxuICAgIC8qXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHAsIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCkge1xyXG4gICAgICAgIC8vdGhpcy5zZXJ2aWRvcj0gXCJodHRwOi8veWFjdW5hLnRlY2ZpbmFuemFzLmNvbTo4MDg0L1dDRldFN1Jlc3QvXCI7XHJcbiAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly90aWN1bmEudGVjZmluYW56YXMuY29tOjgwODQvV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAvL3RoaXMuc2Vydmlkb3I9IFwiaHR0cDovL3RpY3VuYS50ZWNmaW5hbnphcy5jb20vV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAvL211aXNjYVxyXG4gICAgICAgIC8vdGhpcy5zZXJ2aWRvcj0gXCJodHRwOi8vbXVpc2NhLnRlY2ZpbmFuemFzLmNvbS9XQ0ZXRTdSZXN0L1wiO1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUGVyc29uYXMgPSBqc29uLlNlcnZpZG9yUGVyc29uYXM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvciA9IGpzb24uU2Vydmlkb3I7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcyA9IGpzb24uU2Vydmlkb3JHZW5lcmFsZXM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvck0zID0ganNvbi5TZXJ2aWRvck0zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zID0ganNvbi5TZXJ2aWRvckRvY3VtZW50b3M7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckNvbnRhYmxlID0ganNvbi5TZXJ2aWRvckNvbnRhYmxlO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQcmVzdGFtbyA9IGpzb24uU2Vydmlkb3JQcmVzdGFtbztcclxuICAgICAgICB0aGlzLldlYkJhc2UgPSBqc29uLldlYkJhc2U7XHJcbiAgICB9Ki9cclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwLCBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpIHtcclxuICAgICAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly95YWN1bmEudGVjZmluYW56YXMuY29tOjgwODQvV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly90aWN1bmEudGVjZmluYW56YXMuY29tOjgwODQvV0NGV0U3UmVzdC9cIjtcclxuICAgICAgICAgICAgLy90aGlzLnNlcnZpZG9yPSBcImh0dHA6Ly90aWN1bmEudGVjZmluYW56YXMuY29tL1dDRldFN1Jlc3QvXCI7XHJcbiAgICAgICAgICAgIC8vbXVpc2NhXHJcbiAgICAgICAgICAgIC8vdGhpcy5zZXJ2aWRvcj0gXCJodHRwOi8vbXVpc2NhLnRlY2ZpbmFuemFzLmNvbS9XQ0ZXRTdSZXN0L1wiO1xyXG4gICAgICAgICAgICB0aGlzLmNhcmdhSW5pY2lhbCgpIDtcclxuICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBwdWJsaWMgY2FyZ2FJbmljaWFsKCl7XHJcbiAgICBcclxuICAgICAgICAgICAgdmFyIGpzb24gPXJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJykgO1xyXG4gICAgICAgICAgICBsZXQgc0NvbmZpZ0pTT04gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKTtcclxuICAgICAgICAgICAgaWYgKHNDb25maWdKU09OKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgakNvbmZpZ0pTT04gPSBKU09OLnBhcnNlKHNDb25maWdKU09OKTtcclxuICAgICAgICAgICAgICAgIGlmKGpDb25maWdKU09OLlNlcnZpZG9yUGVyc29uYXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIGpzb24gPSBqQ29uZmlnSlNPTjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvclBlcnNvbmFzID0ganNvbi5TZXJ2aWRvclBlcnNvbmFzO1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcyA9IGpzb24uU2Vydmlkb3JHZW5lcmFsZXM7XHJcbiAgICAgICAgICAgIHRoaXMuc2Vydmlkb3JNMyA9IGpzb24uU2Vydmlkb3JNMztcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckRvY3VtZW50b3MgPSBqc29uLlNlcnZpZG9yRG9jdW1lbnRvcztcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWRvckNvbnRhYmxlID0ganNvbi5TZXJ2aWRvckNvbnRhYmxlO1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgICAgIHRoaXMuV2ViQmFzZSA9IGpzb24uV2ViQmFzZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvbmZpZ0pzb24oaWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCB0aGlzLmdldFdpdGhCb2R5R2VuZXJhbGVzKCdHZW5lcmFsZXMvZ2V0Q29uZmlnSnNvbi8nICsgaWRLYXRpb3MsIG51bGwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcE9rX2dldENvbmZpZ0pzb24ocmVzcHVlc3RhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzcE9rX2dldENvbmZpZ0pzb24oanNvbil7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvclBlcnNvbmFzID0ganNvbi5TZXJ2aWRvclBlcnNvbmFzO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3IgPSBqc29uLlNlcnZpZG9yO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMgPSBqc29uLlNlcnZpZG9yR2VuZXJhbGVzO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JNMyA9IGpzb24uU2Vydmlkb3JNMztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRkVNWCA9IGpzb24uU2Vydmlkb3JGRU1YO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zID0ganNvbi5TZXJ2aWRvckRvY3VtZW50b3M7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckNvbnRhYmxlID0ganNvbi5TZXJ2aWRvckNvbnRhYmxlO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQcmVzdGFtbyA9IGpzb24uU2Vydmlkb3JQcmVzdGFtbztcclxuICAgICAgICB0aGlzLldlYkJhc2UgPSBqc29uLldlYkJhc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VVJMU2VydmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpZG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVSTFNlcnZlckRvY3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL2h0dHBHZXRcclxuICAgIGh0dHBHZXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL2h0dHBHZXRcclxuICAgIGh0dHBHZXRXaXRoVGltZU91dCh1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHRpbWVvdXRUaW1lOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChpU2Vydmlkb3IgKyB1cmxHZXQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRpbWVvdXQodGltZW91dFRpbWUpXHJcbiAgICAgICAgKS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cEdldFdpdGhCb2R5KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBHZXRXaXRoQm9keVRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCBwYXJhbWV0cm9zOiBhbnksIHRpbWVvdXRUaW1lOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcblxyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGlTZXJ2aWRvciArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGltZW91dCh0aW1lb3V0VGltZSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBodHRwX2dldF9ibG9iKHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7ICAgICAgICBcclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdSZXNwb25zZSBUeW9lJywgJ2Jsb2InKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIH0pLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cF9nZXRfYXJyYXlidWZmZXIodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCBwYXJhbWV0cm9zOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsgICAgICAgIFxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ1Jlc3BvbnNlIFR5b2UnLCAnYmxvYicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIH0pLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBnZXRQcmVzdGFtbyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRXaXRoQm9keU0zVGltZU91dCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnksIHRpbWVvdXRUaW1lOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHlUaW1lT3V0KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCBwYXJhbXMsIHRpbWVvdXRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRXaXRoQm9keVByZXN0YW1vKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoQm9keSh1cmxHZXQsIHRoaXMuc2Vydmlkb3JQcmVzdGFtbywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2l0aEJvZHlNMyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yTTMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlQZXJzb25hcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yUGVyc29uYXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlHZW5lcmFsZXModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRXaXRoQm9keURvY3VtZW50byh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgncmVzcG9uc2VUeXBlJywgJ1Jlc3BvbnNlQ29udGVudFR5cGUuQmxvYicpO1xyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRfYmxvYl9Eb2N1bWVudG9zKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBfZ2V0X2Jsb2IodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRfYXJyYXlidWZmZXJfRG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwX2dldF9hcnJheWJ1ZmZlcih1cmxHZXQsIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc3RzKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBlcnNvbmFzKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JQZXJzb25hcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0R2VuZXJhbGVzKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE0zKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TTNXaXRoVGltZU91dCh1cmxHZXQ6IHN0cmluZywgdGltZU91dDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhUaW1lT3V0KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCB0aW1lT3V0KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICBnZXREb2N1bWVudG9zKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0Q29udGFibGUodXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0KHVybEdldCwgdGhpcy5zZXJ2aWRvckNvbnRhYmxlKTtcclxuICAgIH1cclxuICAgIC8vL0VuZCBodHRwR2V0XHJcblxyXG4gICAgZ2V0UG9zdHNXaXRoT3V0SnNvbih1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuc2Vydmlkb3IgKyB1cmxHZXQpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHAodXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChcclxuICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzVGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvLy9wb3N0U2VydmljZVJlc3BvbnNlSHR0cFxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHAodXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZVJlc3BvbnNlSHR0cENhbGxTZXJ2aWNlKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGlTZXJ2aWRvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChpU2Vydmlkb3IgKyB1cmxHZXQsIHBhcmFtcykubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBQcmVzdGFtb3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JQcmVzdGFtbyk7XHJcbiAgICB9XHJcbiAgICAvLy9FbmQgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBcclxuXHJcblxyXG4gICAgLy8vcG9zdFNlcnZpY2VIdHRwT3B0aW9uc1xyXG4gICAgcG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGhlYWRlcnMsIGlTZXJ2aWRvcikge1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zLCBvcHRpb25zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGhlYWRlcnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBPcHRpb25zQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIGhlYWRlcnMsIHRoaXMuc2Vydmlkb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNNMyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNEb2NzKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGhlYWRlcnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBPcHRpb25zQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIGhlYWRlcnMsIHRoaXMuc2Vydmlkb3JEb2N1bWVudG9zKTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9FbmQgcG9zdFNlcnZpY2VIdHRwT3B0aW9uc1xyXG5cclxuICAgIC8vL3Bvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxcclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChcclxuICAgICAgICAgICAgcmVzID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3IpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbFBlcnNvbmFzKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvclBlcnNvbmFzKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsTTModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlV2ViQXBpKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxGRU1YKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvckZFTVgpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxHZW5lcmFsZXModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvckdlbmVyYWxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbFByZXN0YW1vcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxcclxuICAgIHBvc3RTZXJ2aWNlV2ViQXBpKHVybEdldDogc3RyaW5nLCBwYXJhbXMsIGlTZXJ2aWRvcikge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoeyBoZWFkZXJzOiBoZWFkZXJzIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMsIG9wdGlvbnMpLm1hcChcclxuICAgICAgICAgICAgcmVzID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgeG1sVG9Kc29uVEZ7XHJcblxyXG4gICAgY29udmVydFhtbFRvSnNvbihpbnB1dFhtbCl7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgcGFyc2VTdHJpbmcgPSByZXF1aXJlKCd4bWwyanMnKS5wYXJzZVN0cmluZztcclxuICAgICAgICBjb25zdCB4bWwgPSBpbnB1dFhtbDtcclxuICAgICAgICBsZXQgcmVzdWx0YWRvO1xyXG4gICAgICAgIHBhcnNlU3RyaW5nKHhtbCwgKGVyciwgcmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdGFkbz0gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG87XHJcbiAgICB9XHJcblxyXG4gICAgcmVwbGFjZUNoYXJYbWwoaW5wdXRYbWwpe1xyXG4gICAgICAgIGxldCBndCA9IC8mZ3Q7L2dpOyAgICAgICAgXHJcbiAgICAgICAgbGV0IGx0ID0gLyZsdDsvZ2k7XHJcbiAgICAgICAgbGV0IHF1b3QgPSAvJnF1b3Q7L2dpO1xyXG4gICAgICAgIGxldCByZXN1bHRhZG8gPSBpbnB1dFhtbC5yZXBsYWNlKGd0LFwiPlwiKTtcclxuICAgICAgICByZXN1bHRhZG8gPSByZXN1bHRhZG8ucmVwbGFjZShsdCxcIjxcIik7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gcmVzdWx0YWRvLnJlcGxhY2UocXVvdCxcIidcIik7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG87XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXByb2Nlc29zJztcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNDb3VjaE1hZXN0cm8ge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIHNUaXBvSHViOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgc1RpcG9IdWIgPSB0aGlzLkdldFRpcG9IdWJGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICBpZiAoc0lka2F0aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc1RpcG9IdWIgJiYgc1RpcG9IdWIudG9VcHBlckNhc2UoKS50cmltKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tRWNjX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21FY2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0VFQ0MhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Z1bmNpb24gcXVlIHRyYWVyYSBlbCB0aXBvIGRlIGh1YlxyXG4gICAgcHVibGljIEdldFRpcG9IdWJGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uTTNIVUJTWzBdLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIGJhc2UgZGUgZGF0b3MuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIC8vICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAvLyAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAvLyAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgLy8gICAgIG9wdGlvbnMyXHJcbiAgICAgICAgLy8gfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJDb21wbGV0bzpcIiArIGNoYW5nZSlcclxuICAgICAgICAvLyB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgLy8gfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM0RhdGEge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIkNhcnJpdG9Db21wcmFzXCIsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvL3RoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQih0aGlzLkdldFNlcnZlcigpICsgXCJjYXJyaXRvXCIpO1xyXG4gICAgICAgICAgICAvL3RoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJjYXJyaXRvXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGVuIEJEIHBvdWNoLlxyXG4gICAgcHVibGljIEFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKGlkOiBzdHJpbmcsIGRvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICBkb2N1bWVudC5faWQgPSBpZDtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2gsIEFzeW5jLlxyXG4gICAgcHVibGljIGFzeW5jIEFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCB0aGlzLmdldChpZCk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgIC8vICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgLy8gICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgLy8gfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgYmFzZSBkZSBkYXRvcy5cclxuICAgIHB1YmxpYyBHZXREYXRhUG91Y2hCRChpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgYmFzZSBkZSBkYXRvcy5cclxuICAgIHB1YmxpYyBEZWxldGUoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uczIgPSB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy90aGlzLmF1dGVudGljYWNpb25TZXJ2ZXIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2Uuc3luYyhyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCBvcHRpb25zMik7XHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCBvcHRpb25zMik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLy9hcm1hciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgSURLYXRpb3MsIHRkb2MgeSBuZG9jLlxyXG4gICAgcHVibGljIEdldEtleUNhcnJpdG9Db21wcmFzKGlzSURLYXRpb3M6IHN0cmluZywgaXNUZG9jOiBzdHJpbmcsIGlzTmRvYzogc3RyaW5nLCBpc1ViaWNhY2lvbjogc3RyaW5nLCBpc0lkSHViOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gXCJDQz9cIiArIGlzSURLYXRpb3MgKyBcIj9cIiArIGlzVWJpY2FjaW9uICsgXCI/XCIgKyBpc0lkSHViICsgXCI/XCIgKyBpc1Rkb2MgKyBcIj9cIiArIGlzTmRvYztcclxuICAgIH1cclxuXHJcbiAgICAvL0Rlc3RydWlyIHkgcmVjb25zdHJ1aXIgbGEgYmFzZSBkZSBkYXRvcyBwb3VjaERCXHJcbiAgICBwdWJsaWMgUmVzZXJCRCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoJ0NhcnJpdG9Db21wcmFzJywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgRmlsdHJvcyB7XHJcbiAgICBwdWJsaWMgQXRyaWJ1dG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihpc0F0cmlidXRvOnN0cmluZywgaXNWYWxvcjpzdHJpbmcpe1xyXG4gICAgICAgIHRoaXMuQXRyaWJ1dG8gPSBpc0F0cmlidXRvO1xyXG4gICAgICAgIHRoaXMuVmFsb3IgPSBpc1ZhbG9yO1xyXG4gICAgfVxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1ByZEFkaWNpb25hbGVze1xyXG4gICAgU0tQMTpzdHJpbmc7XHJcbiAgICBBVFJJQlVUTzpzdHJpbmc7XHJcbiAgICBWQUxPUjpzdHJpbmc7XHJcbiAgICBOSVZFTDE6bnVtYmVyO1xyXG4gICAgTklWRUwyOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUHJlc2VudGFjaW9uZXMgfSBmcm9tIFwiLi9tMy1wcmVzZW50YWNpb25lc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkTGlzdGF7XHJcbiAgICBJRExJU1RBOnN0cmluZztcclxuICAgIFNLVTpzdHJpbmc7XHJcbiAgICBMT1RFOnN0cmluZztcclxuICAgIFBSRUNJTzpudW1iZXI7XHJcbiAgICBMQjogbnVtYmVyO1xyXG4gICAgTEM6IG51bWJlcjtcclxuICAgIExEOiBudW1iZXI7XHJcbiAgICBTVUJJTkRJQ0U6IHN0cmluZztcclxuICAgIFBPUklHSU5BTDogbnVtYmVyO1xyXG4gICAgcHVibGljIE0zUHJlc2VudGFjaW9uZXMgPSBuZXcgQXJyYXk8TTNQcmVzZW50YWNpb25lcz4oKTtcclxufSIsImltcG9ydCB7IE0zUHJkTGlzdGEgfSBmcm9tIFwiLi9NM1ByZExpc3RhLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrRGV0IH0gZnJvbSBcIi4vTTNQcmRQYWNrRGV0XCI7XHJcbmltcG9ydCB7IE0zQ29kc1hQUkQgfSBmcm9tIFwiLi9NM0NvZHNYUFJELnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrUmVnbGFzIH0gZnJvbSBcIi4vTTNQcmRQYWNrUmVnbGFzXCI7XHJcbmV4cG9ydCBjbGFzcyBNM1ByZEdlbmVyYWwge1xyXG4gICAgU0tVOiBzdHJpbmc7XHJcbiAgICBMT1RFOiBzdHJpbmc7XHJcbiAgICBOT01CUkUxOiBzdHJpbmc7XHJcbiAgICBOT01CUkVMQVJHTzogc3RyaW5nO1xyXG4gICAgQUNUMUNUQkw6IHN0cmluZztcclxuICAgIEFDVDJDVEJMOiBzdHJpbmc7XHJcbiAgICBDVEJMRFBSRDogc3RyaW5nO1xyXG4gICAgQ1RCTERJTVBQUkQ6IHN0cmluZztcclxuICAgIFNLUDE6IHN0cmluZztcclxuICAgIFNLUDI6IHN0cmluZztcclxuICAgIFNLUDM6IHN0cmluZztcclxuICAgIFNLUDQ6IHN0cmluZztcclxuICAgIFNLUDU6IHN0cmluZztcclxuICAgIERJU1BPTklCTEU6IG51bWJlcjtcclxuICAgIERJU1BPTklCTEVSZWY6IG51bWJlcjtcclxuICAgIE0zUEFDSzogQXJyYXk8TTNQcmRQYWNrRGV0PiA9IG51bGw7XHJcbiAgICBNM1BhY2tSZWdsYXM6IEFycmF5PE0zUHJkUGFja1JlZ2xhcz4gPSBudWxsO1xyXG4gICAgTG9NM0xpc3RhUHJlY2lvID0gbmV3IEFycmF5PE0zUHJkTGlzdGE+KCk7XHJcbiAgICBMb00zUHJkTGlzdGEgPSBuZXcgTTNQcmRMaXN0YSgpO1xyXG4gICAgTTNDb2RzID0gbmV3IEFycmF5PE0zQ29kc1hQUkQ+KCk7XHJcbiAgICBJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8TTNQUkRJbXB1ZXN0b3M+KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BSREltcHVlc3RvcyB7XHJcbiAgICBDb2RJbXA6IHN0cmluZztcclxuICAgIE1ldG9kb2xvZ2lhOiBzdHJpbmc7XHJcbiAgICBWYWxvcjogbnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQcmRHZW5lcmFsIH0gZnJvbSBcIi4vTTNQcmRHZW5lcmFsLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tCeVRpcG8gfSBmcm9tIFwiLi9tMy1wYWNrLWJ5LXRpcG9cIjtcclxuaW1wb3J0IHsgTTNQVW5pZE1lZGlkYSB9IGZyb20gXCIuL20zcC11bmlkLW1lZGlkYVwiO1xyXG5pbXBvcnQgeyBNM1ByZEdycEFzb2NpYWRvIH0gZnJvbSBcIi4vTTNQcmRHcnBBc29jaWFkb1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFR5cGVNM1ByZEdycCB7XHJcbiAgICBTS1AxOiBzdHJpbmc7XHJcbiAgICBSQVRJTkc6IG51bWJlcjtcclxuICAgIEZJQ0hBVEVDTklDQTogc3RyaW5nO1xyXG4gICAgTUFSQ0E6IHN0cmluZztcclxuICAgIENMQVNJRklDQUNJT046IHN0cmluZztcclxuICAgIE5PTUJSRTogc3RyaW5nO1xyXG4gICAgVElQTzogc3RyaW5nO1xyXG4gICAgQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIENhbXBvc0FkaWNpb25hbGVzOiBzdHJpbmc7XHJcbiAgICBMb00zUHJkR2VuZXJhbCA9IG5ldyBBcnJheTxNM1ByZEdlbmVyYWw+KCk7XHJcbiAgICBMb00zUHJkQWRpY2lvbmFsZXMgPSBuZXcgQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4oKTtcclxuICAgIE0zUEFDS0JZVElQTyA9IG5ldyBBcnJheTxNM1ByZFBhY2tCeVRpcG8+KCk7XHJcbiAgICBNM1ByZEdycEFzb2NpYWRvOkFycmF5PE0zUHJkR3JwQXNvY2lhZG8+ID0gbnVsbDtcclxuXHJcbiAgICBsaXN0SW1hZ2VuZXMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgSW1wdWVzdG9zID0gbmV3IEFycmF5PFR5cGVJbXB1ZXN0b3NQUkQ+KCk7XHJcbiAgICBNM1BVbmlkTWVkaWRhOiBNM1BVbmlkTWVkaWRhO1xyXG5cclxuICAgIGVuY29udHJhZG9Mb2NhbDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFR5cGVJbXB1ZXN0b3NQUkQge1xyXG4gICAgQ29kSW1wOiBzdHJpbmc7XHJcbiAgICBNZXRvZG9sb2dpYTogc3RyaW5nO1xyXG4gICAgVmFsb3I6IHN0cmluZ1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUEltcHVlc3Rvc3tcclxuICAgIHB1YmxpYyBQb3JjZW50YWplOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxvcjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTGltaXRlT3B1ZXN0bzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29kSW1wdWVzdG86c3RyaW5nO1xyXG4gICAgcHVibGljIEJhc2U6bnVtYmVyO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1BEZXRhbGxlSXRlbXMge1xyXG4gICAgcHVibGljIE5vbWJyZUNvbmNlcHRvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEl0ZW1zV0VCIHtcclxuICAgIHB1YmxpYyBkQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBkUHJlY2lvVG90YWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBCaXNQcm9kdWN0b1Byb21vOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgQmlzT2JzZXF1aW86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgVW5pZGFkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENsYXZlUHJkU1JWOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENsYXZlUHJkVW5pZGFkOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIElkUHJvY2Vzbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBvYnNlcnZhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgU3ViRXN0YWRvX286IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgRXN0YWRvX286IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgUGF0aEltYWdlbjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgSURFbmNSZXBldGlkbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgSURFbmNQcm9jZXNhZG86IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIElERW5jUGFkcmU6IG51bWJlciA9IC0xO1xyXG4gICAgcHVibGljIFRpcG9BZ3J1cGFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENvZGlnb0JhcnJhczogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBDYW1wb3NBZGljaW9uYWxlcyA9IFtdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQRGV0YWxsZUN1cG9uIHtcclxuICAgIHB1YmxpYyBJZEN1cG9uOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6IG51bWJlcjtcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgTTNQRGluYW1pY2FzIHtcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQRW5jRlAge1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBEZXNjcmlwY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvOnN0cmluZztcclxuICAgIHB1YmxpYyBJZFRpcG9QYWdvOm51bWJlcjsgLy8xOiBFZmVjdGl2byAyOiBUYXJqZXRhIGRlIGNyw4PCqWRpdG8gMzogVGFyamV0YSBEZWJpdG8gNDogUFNFXHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbENhbWJpbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsT3RyYUNsYXNpOm51bWJlciA9MDtcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcblxyXG5cclxuICAgIC8vVmFyaWFibGVzIFNvbG9Gcm9udFxyXG4gICAgcHVibGljIEFQTENhbWJpbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQVBMRmlkZWxpemFjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBkZWphcl9ib3JyYXI6Ym9vbGVhbiA9IHRydWU7XHJcblxyXG59IiwiaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BEZXRhbGxlQ3Vwb24gfSBmcm9tIFwiLi9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi9tMy1wLWltcHVlc3Rvc1wiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQRW52aW9zIH0gZnJvbSBcIi4vbTMtcC1lbnZpb3NcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbmNJdGVtcyB7XHJcbiAgICBwdWJsaWMgSWRQcm9kdWN0bzogc3RyaW5nO1xyXG4gICAgcHVibGljIExvdGU6IHN0cmluZztcclxuICAgIHB1YmxpYyBJRDogbnVtYmVyO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ29kaWdvQmFycmFzOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbnZpbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRElTUE9OSUJMRTogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBQYXRoSW1hZ2U6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zREVUID0gbmV3IEFycmF5PE0zUERldGFsbGVJdGVtcz4oKTsgICAgXHJcbiAgICBwdWJsaWMgTTNEZXRDdXBvbmVzID0gbmV3IEFycmF5PE0zUERldGFsbGVDdXBvbj4oKTtcclxuICAgIHB1YmxpYyBNM1BJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8TTNQSW1wdWVzdG9zPigpO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcbiAgICAvL0VzdGFzIHByb3BpZWRhZGVzIG5vIHNvbiByZXBsaWNhIGEgYmFzZSBkZSBkYXRvcywgc29uIHBhcmEgdXNvIGludGVybm8uXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuXHJcbiAgICBwdWJsaWMgSWRFbmNQYWRyZTpudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb0FncnVwYWNpb246c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvL09idGVuZXIgZWwgcHJlY2lvIHVuaXRhcmlhXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VVbml0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWEsIGNvbiBkZXNjdWVudG9zIGluY2x1aWRvc1xyXG4gICAgcHVibGljIEdldFByaWNlVW5pdE5ldG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgZWwgcHJlY2lvIHVuaXRhcmlhLCBjb24gZGVzY3VlbnRvcyBpbmNsdWlkb3NcclxuICAgIHB1YmxpYyBTZXRQcmljZVVuaXROZXRvKGlWYWxvcikge1xyXG4gICAgICAgIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gaVZhbG9yO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgZWwgcHJlY2lvIHRvdGFsLlxyXG4gICAgcHVibGljIEdldFByaWNlVG90YWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbnZpb3N7XHJcbiAgICBwdWJsaWMgSWRFbnZpbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRGb3JtYUVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmVGRW52aW86c3RyaW5nO1xyXG4gICAgcHVibGljIERpcmVjY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUGFpczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2l1ZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNGVHJhYmFqb3tcclxuICAgIHB1YmxpYyBJZEh1YjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRVYmljOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEh1YlByZTpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRVYmljUHJlOm51bWJlcjtcclxufSIsImltcG9ydCB7IE0zUEVuY0l0ZW1zIH0gZnJvbSBcIi4vbTMtcGVuYy1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNGUCB9IGZyb20gXCIuL20zLXBlbmMtZnBcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4vbTMtcGRpbmFtaWNhc1wiO1xyXG5pbXBvcnQgeyBNM1Byb21Db21iaW5hZGFYUHJvY2VzbyB9IGZyb20gXCIuL20zLXByb20tY29tYlwiO1xyXG5pbXBvcnQgeyBNM0ZUcmFiYWpvIH0gZnJvbSBcIi4vbTMtZi10cmFiYWpvXCI7XHJcbmltcG9ydCB7IE0zUEVudmlvcyB9IGZyb20gXCIuL20zLXAtZW52aW9zXCI7XHJcbmltcG9ydCB7IE0zUFJlY2VwY2lvbiB9IGZyb20gXCIuL20zLXByZWNlcGNpb25cIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi9tMy1wZXIteC1wcm9jZXNvXCI7XHJcbmltcG9ydCB7IE0zUmVnaXN0cm9UcnggfSBmcm9tIFwiLi9tMy1yZWctdHJ4XCI7XHJcbmltcG9ydCB7IE0zT3RDbGFzaWZpY2FjaW9uZXMgfSBmcm9tIFwiLi9tMy1vdC1jbGFzaWZpY2FjaW9uZXNcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuZXhwb3J0IGNsYXNzIE0zUHJvY2Vzb3Mge1xyXG4gICAgcHVibGljIElkTTM6c3RyaW5nO1xyXG4gICAgcHVibGljIEZlY2hhOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvVGVyY2VybzpudW1iZXI7XHJcbiAgICBwdWJsaWMgVERvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVWJpYzE6bnVtYmVyO1xyXG4gICAgcHVibGljIFViaWMyOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxvck5ldG86bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlciA9MDtcclxuICAgIHB1YmxpYyBWYWxPdHJhQ2xhc2k6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFN1YkVzdGFkb0RlczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvRGVzOnN0cmluZztcclxuICAgIHB1YmxpYyBTdWJFc3RhZG9BbnQ6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkb0FudDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVE1JZFByb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIElERGlhcmlvOnN0cmluZztcclxuICAgIHB1YmxpYyBJRERpYXJpb0NpZXJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSURIdWI6bnVtYmVyO1xyXG4gICAgcHVibGljIFRpcG9UUlg6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgcHVibGljIE0zT3RDbGFzaWZpY2FjaW9uZXMgPSBuZXcgQXJyYXk8TTNPdENsYXNpZmljYWNpb25lcz4oKTtcclxuICAgIHB1YmxpYyBsTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgIHB1YmxpYyBNM1BlclhQcm9jZXNvID0gbmV3IEFycmF5PE0zUGVyWFByb2Nlc28+KCk7XHJcbiAgICBwdWJsaWMgbE0zUEVuY0ZQID0gbmV3IEFycmF5PE0zUEVuY0ZQPigpO1xyXG4gICAgcHVibGljIE0zRlRyYWJham8gPSBuZXcgTTNGVHJhYmFqbygpO1xyXG4gICAgcHVibGljIE0zUEVudmlvcyA9IG5ldyBBcnJheTxNM1BFbnZpb3M+KCk7XHJcbiAgICBwdWJsaWMgTTNQUmVjZXBjaW9uID0gbmV3IEFycmF5PE0zUFJlY2VwY2lvbj4oKTtcclxuICAgIHB1YmxpYyBsTTNSZWdpc3Ryb1RyeCA9IG5ldyBBcnJheTxNM1JlZ2lzdHJvVHJ4PigpO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgRmVjaGFIb3JhRXN0YWRvOnN0cmluZztcclxuICAgIHB1YmxpYyBJZEVzdGFkbzpzdHJpbmc7XHJcblxyXG5cclxuICAgIC8vRXN0YXMgcHJvcGllZGFkZXMgbm8gc29uIHJlcGxpY2EgYSBiYXNlIGRlIGRhdG9zLCBzb24gcGFyYSB1c28gaW50ZXJuby5cclxuICAgIC8vcHVibGljIGxNM1Byb21Db21iaW5hZGEgPSBuZXcgQXJyYXk8TTNQcm9tQ29tYmluYWRhWFByb2Nlc28+KCk7XHJcblxyXG4gICAgcHVibGljIFByb21vc0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG5cclxuICAgIHB1YmxpYyBBcGxQYWdvRW5MaW5lYTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIEFwbERlc2RlU2VydmVyOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgbmRvY1VBY3Rpdm86c3RyaW5nOyAvL0pBR00gMjAxOTEwMTcgTnVldm9zIHBhcmFtZXRyb3MscGFyYSBsbGV2YXIgZWwgcmVnaXN0cm8gZGVsIHVzdWFyaW8gYWN0aXZvLCBxdWUgY3JlbyBlc3RlIHByb2Nlc29cclxuICAgIHB1YmxpYyB0ZG9jVUFjdGl2bzpzdHJpbmc7Ly9KQUdNIDIwMTkxMDE3IE51ZXZvcyBwYXJhbWV0cm9zLHBhcmEgbGxldmFyIGVsIHJlZ2lzdHJvIGRlbCB1c3VhcmlvIGFjdGl2bywgcXVlIGNyZW8gZXN0ZSBwcm9jZXNvXHJcbiAgICAvL3B1YmxpYyBiQVBMQ29tYmluYWRhc0FjdW06Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5GZWNoYSA9bW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUERpbmFtQnlBY3RpdmlkYWQgfSBmcm9tIFwiLi9tMy1wZGluYW0tYnktYWN0aXZpZGFkXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQUmVjZXBjaW9ue1xyXG4gICAgcHVibGljIElkUmVjZXBjaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEVuYzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6bnVtYmVyO1xyXG4gICAgcHVibGljIEZlY2hhOkRhdGU7ICAgIFxyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuICAgIHB1YmxpYyBFc3RhZG86IHN0cmluZztcclxufSIsImV4cG9ydCBjbGFzcyBNM1BlclhQcm9jZXNve1xyXG4gICAgcHVibGljIFRpcG9QZXJzb25hOnN0cmluZztcclxuICAgIHB1YmxpYyBUZG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBOZG9jOnN0cmluZzsgICAgXHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBEZXNjVGlwb1A6c3RyaW5nO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyAgTTNPdENsYXNpZmljYWNpb25lc3tcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRQcm9kdWN0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ2FudGlkYWQ6bnVtYmVyO1xyXG4gICAgcHVibGljIE9yZGVuOm51bWJlcjsvL1ZhcmlhYmxlIGRlIG9yZGVuYW1pZW50byBlbiBlbCBmcm9udFxyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZU0zRkUge1xyXG5cclxuICAgIHB1YmxpYyBhZGRfcHJvY2Vzb19nZW5lcmFyRkUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9hZGRfcHJvY2Vzb19nZW5lcmFyRkUvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkX3Byb2Nlc29fZ2VuZXJhck5DKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvYWRkX3Byb2Nlc29fZ2VuZXJhck5DL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGFkZFByb2Nlc29HZW5lcmFyRkVBc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBqc29uO1xyXG4gICAgICAgIGxldCByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM0ZFL2FkZF9wcm9jZXNvX2dlbmVyYXJGRS9cIiArIHNJREthdGlvcywgakRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShyZXNwKVxyXG4gICAgICAgICAgICByZXR1cm4ganNvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2VuZXJhckNhcnRhUG9ydGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGlkbTM6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWChcIkZFTVgvZ2VuZXJhckNhcnRhUG9ydGUvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIGlkbTMsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRJbmZvRmFjdHVyYUVsZWN0cm9uaWNhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCkgfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM0ZFL2dldEluZm9GYWN0dXJhRWxlY3Ryb25pY2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEluZm8pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0SHRtbEZyb21GRShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBpZE0zOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVzcDtcclxuICAgICAgICBsZXQgZGF0YSA9IHsgJ2lkTTMnOiBpZE0zIH07XHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNGRS9nZXRIdG1sRnJvbUZFLycgKyBpZEthdGlvcywgZGF0YSkudG9Qcm9taXNlKClcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgSVVfSW5mb0ZhY3R1cmFFbGVjdHJvbmljYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0ZhY3R1cmE6IGFueSwgdVRBY3Rpdm86IHN0cmluZywgdU5BY3Rpdm86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBpZF9rYXRpb3MudHJpbSgpLCAnb0ZhY3R1cmEnOiBvRmFjdHVyYSwgJ3VUQWN0aXZvJzogdVRBY3Rpdm8sICd1TkFjdGl2byc6IHVOQWN0aXZvIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM0ZFL0lVX0luZm9GYWN0dXJhRWxlY3Ryb25pY2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbEluc1Nlcmllc3hVYmljKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvZGVsSW5zU2VyaWVzeFViaWMvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7ICAgICAgICBcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoSlNPTi5wYXJzZShKU09OLnBhcnNlKGVycltcIl9ib2R5XCJdKS5NZXNzYWdlKS5SRVNQVUVTVEFbXCIwXCJdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJvY2Vzb1NlcnZpY2Uge1xyXG5cclxuICAgIHB1YmxpYyBhZGRfcHJvY2Vzb0VBKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIlByb2Nlc29zTTMvYWRkX3Byb2Nlc29FQS9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsYSBsaXN0YSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhLCB1biBhcnJheSBkZSBmaWx0cm9zLlxyXG4gICAgTTNHZXRfUHJvY2Vzb3NQb3JDYW50aWRhZChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ1Byb2Nlc29zTTMvTTNHZXRfUHJvY2Vzb3NQb3JDYW50aWRhZC8nICsgc0lES2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChvbFByb2Nlc29zLlJFU1BVRVNUQS5UUC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuVFAgPSBuZXcgQXJyYXkob2xQcm9jZXNvcy5SRVNQVUVTVEEuVFApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9sUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgbGlzdGEgZGUgcHJvZHVjdG8sIHRlbmllbmRvIGVuIGN1ZW50YSwgdW4gYXJyYXkgZGUgZmlsdHJvcy5cclxuICAgIHB1YmxpYyBNM0dldF9BY3RpdmlkYWRlc1lQcm9jZXNvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldF9BY3RpdmlkYWRlc1lQcm9jZXNvcy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb2xQcm9jZXNvcztcclxuICAgICAgICAgICAgb2xQcm9jZXNvcyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGFzIGFjdGl2aWRhZGVzIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBpZiAob2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9sUHJvY2Vzb3MuUkVTUFVFU1RBLkFDVElWSURBREVTID0gbmV3IEFycmF5KG9sUHJvY2Vzb3MuUkVTUFVFU1RBLkFDVElWSURBREVTKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsb3MgcHJvY2Vzb3Mgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3MuUkVTUFVFU1RBLkFDVElWSURBREVTLmZvckVhY2goQWN0aXZpZGFkID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChBY3RpdmlkYWQuUFJPQ0VTT1MgIT09IHVuZGVmaW5lZCAmJiBBY3RpdmlkYWQuUFJPQ0VTT1MubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBBY3RpdmlkYWQuUFJPQ0VTT1MgPSBuZXcgQXJyYXkoQWN0aXZpZGFkLlBST0NFU09TKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9sUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBwdWJsaWMgTTNHZXRfTTNQcm9jZXNvc0J5SWRQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRfTTNQcm9jZXNvc0J5SWRQcm9jZXNvLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcm9jZXNvLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb2xQcm9jZXNvc00zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zTTMgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxhcyBhY3RpdmlkYWRlcyBubyB2aWVuZW4gY29tbyB1biBhcnJheSwgY29udmVydGlybG9cclxuICAgICAgICAgICAgaWYgKG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TID0gbmV3IEFycmF5KG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbG9zIHByb2Nlc29zIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zTTMuUkVTUFVFU1RBLlNVQkVTVEFET1MuZm9yRWFjaChzdWJzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJzLk0zUFJPQ0VTT1MgIT09IHVuZGVmaW5lZCAmJiBzdWJzLk0zUFJPQ0VTT1MubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWJzLk0zUFJPQ0VTT1MgPSBuZXcgQXJyYXkoc3Vicy5NM1BST0NFU09TKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9sUHJvY2Vzb3NNMyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIE0zcHJvY2Vzb3MsIGRlc2RlIGVsIGlkZGlhcmlvLlxyXG4gICAgcHVibGljIGFzeW5jIEdldE0zUHJvY2Vzb3NCeUlkRGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWREaWFyaW86IHN0cmluZykge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiSWREaWFyaW9cIjogc0lkRGlhcmlvIH07XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc287XHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRNM1Byb2Nlc29zQnlJZERpYXJpby8nICsgc0lES2F0aW9zLCBvRGF0YSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBNM3Byb2Nlc29zLCBUZW5pZW5kbyBlbCBJRE0zLiAgICBcclxuICAgIHB1YmxpYyBNM0dldF9NM1Byb2Nlc29zQnlJZE0zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSURNMzogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNVYmljYWNpb246IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCB1YmljRXh0ZXJubyA9IGZhbHNlLCBiQVBMUGFnb3NQRCA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZE0zXCI6IHNJRE0zLCBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH07XHJcbiAgICAgICAgaWYgKGJBUExQYWdvc1BEKSB7XHJcbiAgICAgICAgICAgIG9EYXRhLmJBUExQYWdvc1BEID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRQcm9jZXNvTTNCeUlkTTMvJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9NM1Byb2Nlc29zOiBhbnk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gcmVzcDtcclxuXHJcbiAgICAgICAgICAgIC8vVmFsaWRhciBxdWUgbGEgdWJpY2FjaW9uIGFjdHVhbGVzIHZhbGlkYSBwYXJhIGVsIHByb2Nlc29cclxuICAgICAgICAgICAgLy9wY2FzdHJvLCBzZSBjb21lbnRhcmVhIHBvcnF1ZSBubyBmdW5jaW9uYSBjb24gdGYsIHJldG9ybmEgcGFyYSBURiBTSUVNUFJFIE5VTEwsIG5vIHNlIG1hbmVqYSB1YmljYWNpb25lc1xyXG4gICAgICAgICAgICAvL1NlIGNvbG9jYSBkaWYgYSAwLCBwb3IgdmVyc2lvbiBURiwgcXVlIG5vIHV0aWxpemEgZnVuY2lvbmFsaWRhZCBkZSBVYmljYWNpb25lc1xyXG4gICAgICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUudG9TdHJpbmcoKSAhPSBcIjBcIiAmJiBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZS50b1N0cmluZygpICE9IHNVYmljYWNpb24udG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF1YmljRXh0ZXJubykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9tYSBlbCBwcm9jZXNvIHF1ZSB0aWVuZSBwb3IgZGluYW1pY2EgX0lETTNSZXRvbWFkbyBlbCBpZG0zIGVudmFpZG8gcG9yIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIHNJRE0zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNM1Byb2Nlc29zQnlJZE0zUmV0b21hZG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJRE0zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiaWRNM1JldG9tYWRvXCI6IHNJRE0zIH07XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9nZXRNM1Byb2Nlc29zQnlJZE0zUmV0b21hZG8vJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHByb2Nlc28gTTMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJZCBNMyB5IElkcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIHNJRE0zIFxyXG4gICAgICogQHBhcmFtIHNJZFByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gc1ViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zR2V0X00zUHJvY2Vzb3NCeUlkTTNBc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lETTM6IHN0cmluZyxcclxuICAgICAgICBzSWRQcm9jZXNvOiBzdHJpbmcsIHNVYmljYWNpb246IHN0cmluZywgYkFQTFBhZ29zUEQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiSWRNM1wiOiBzSURNMywgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbyB9O1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIGlmIChiQVBMUGFnb3NQRCkge1xyXG4gICAgICAgICAgICBvRGF0YS5iQVBMUGFnb3NQRCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvR2V0UHJvY2Vzb00zQnlJZE0zLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHByb2Nlc28gTTMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJZERpYXJpb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkRGlhcmlvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbTNfZ2V0UHJvY2Vzb00zQnlJZERpYXJpb0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZERpYXJpbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhO1xyXG4gICAgICAgIG9EYXRhID0geyBcImlkRGlhcmlvXCI6IGlkRGlhcmlvIH07XHJcbiAgICAgICAgdmFyIHJlc3A6IGFueSA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9tM19nZXRQcm9jZXNvTTNCeUlkRGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYSBlc3R1cmN0dXJhcyBkZSBsYXMgY2FwdHVyYXMgZGluYW1pY2FzIGFzb2NpYWRhcyBhdW4gcHJvY2VvcyB5IHVuIGlkcHJvY2Vzb1xyXG4gICAgcHVibGljIG0zX2dldF9kYXRhX2NhcHRfZGluYW0oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vL29EYXRhID0ge1wiaWRfcHJvY2Vzb1wiOlwiXCIsXCJpZF9zdWJfcHJvY2Vzb1wiOlwiXCJ9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9tM19nZXRfZGF0YV9jYXB0X2RpbmFtLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBSZXRvcm5hIGVsIFJQVGVtcGxhdGUgcGFyYSBlbCBhcm1hZG8gZGVsIFJlcG9ydGVcclxuICAgIC8vICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgLy8gICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgIC8vICAqIEBwYXJhbSBpZF9yZXAgXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBhc3luYyBnZXRfdGVtcGxhdGVfcmVwb3J0ZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRfcmVwOiBzdHJpbmcpIHtcclxuICAgIC8vICAgICB2YXIgb0RhdGE7XHJcbiAgICAvLyAgICAgdmFyIHJlc3A7XHJcbiAgICAvLyAgICAgdmFyIG9Kc29uO1xyXG4gICAgLy8gICAgIG9EYXRhID0geyBcImlkX3JlcFwiOiBpZF9yZXAgfTtcclxuICAgIC8vICAgICB0cnkge1xyXG4gICAgLy8gICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL2dldF90ZW1wbGF0ZV9yZXBvcnRlLycgKyBpZF9rYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuICAgIC8vICAgICAgICAgb0pzb24gPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gb0pzb247XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGNhdGNoe1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGxvcyBwcm9jZXNvcyBhc29jaWFkb3MgYSB1bmEgcGVyc29uYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNM0dldFByb2Nlc29CeVBlcnNvbmEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldFByb2Nlc29CeVBlcnNvbmEvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBNM0dldFByb2Nlc29CeUlkRGlhcmlvQ2llcnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRQcm9jZXNvQnlJZERpYXJpb0NpZXJyZS8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9jZXNvcyBPZmYgbGluZVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBNM0dldFByb2Nlc29zT2ZmTGluZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0UHJvY2Vzb3NPZmZMaW5lLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvZW5hIGVsIFREZXRhbGxlUHJvY2VzbyBkZSB1biBwcm9jZXNvIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkX2thdGlvcyBcclxuICAgICAqIEBwYXJhbSBvRGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZGV0YWxsZVByb2Nlc29CeVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvbTNfZGV0YWxsZVByb2Nlc29CeVByb2Nlc28vJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLkRldGFsbGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0ZW5jaWFQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy92YWxpZGFyRXhpc3RlbmNpYVByb2Nlc28vJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvUHJvZHVjdG86IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvUHJvZHVjdG8pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICBwdWJsaWMgUHJlY2lvVG90YWw6IG51bWJlcjsgLy9QcmVjaW8gaW5jbHV5ZW5kbyBsYXMgcHJvbW9jaW9uZXNcclxuICAgIHB1YmxpYyBQcmVjaW9Ub3RhbFByb21vY2lvbjogbnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yVG90YWxNb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBMaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICBwdWJsaWMgSURQcm9tb2Npb246IG51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU7XHJcbiAgICBwdWJsaWMgVmFsb3I7XHJcbiAgICBwdWJsaWMgVmFsb3JQb3JjZW50YWplID0gMDtcclxuICAgIHB1YmxpYyBMaXN0T2JzU0tVID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgIHB1YmxpYyBQcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSA9IG51bGw7XHJcbiAgICBwdWJsaWMgVmFsb3JNb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBJZEN1cG9uOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHVibGljIFJlZ2xhOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgQXBsaWNhZGE6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgVGlwbzogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlZ2xhT2JzZXE6IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZE9ic2VxOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZmxhZ3MgPSB7IGZvcm1hUGFnbzogZmFsc2UgfTtcclxuICAgIHB1YmxpYyBsSWRBY3RpdmFQcm9tbzogQXJyYXk8bnVtYmVyPjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb21vY2lvbkNvbWJpbmFkYSB7XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb25YUHJvY2VzbzogbnVtYmVyO1xyXG4gICAgcHVibGljIElkUHJvbW9jaW9uQ29tYmluYWRhOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwbzI6IHN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6IHN0cmluZztcclxuICAgIHB1YmxpYyBBY2Npb246IGFueTtcclxuICAgIC8vcHVibGljIElkQ29uZGljaW9uOnN0cmluZzsgLy9Fc3RvIHBhcmEgYWdydXBhY2lvbiBkZSBsYSBwcm9tb2Npb24gZGUgY29tYm8uXHJcbn0iLCJleHBvcnQgY2xhc3MgTWF0aFRGIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcm91bmQoYTogYW55LCBkZWNpbWFsczogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IG11bHRpcGxvRGUxMCA9IE1hdGgucG93KDEwLCBkZWNpbWFscyk7XHJcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoK2EgKiBtdWx0aXBsb0RlMTApIC8gbXVsdGlwbG9EZTEwO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDg8Kzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw4PCs24gZXN0YSBkaXNlw4PCsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDg8KxYWRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcyl7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob0xpc3RhUHJlY2lvW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9kdWN0byhvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWwsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvTTNQcmRHZW5lcmFsW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGRlIHByb2R1Y3RvIGFncnVwYWRvLlxyXG4gICAgICogQHBhcmFtIG9UeXBlTTNQcmRHcnAgXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9kdWN0b1BSREdSUChvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvVHlwZU0zUHJkR3JwW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGluZm9ybWFjaW9uIGFkaWNpb25hbCwgZXN0YSBpbmZvcm1hY2lvbiBhZGljaW9uYWwgZXN0YSBlbiB1bmEgdmFyaWFibGUgZ2xvYmFsOiBnb0RhdGFBZGljaW9uYWxcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9BZGljaW9uYWwoY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgIGlmICh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKHRoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiTU9EXCIgJiYgK3RoaXMuZ29EYXRhQWRpY2lvbmFsW2NvbmRpY2lvbi5Db25jZXB0b10gPiArY29uZGljaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBjb250cmEgdXN1YXJpbyBkYXRhLlxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvVXNlckRhdGEoY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgIGlmICh0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXSwgY29uZGljaW9uLlZhbG9yLnRyaW0oKSkpIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXSAmJiB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXS5pbmNsdWRlcygnLCcpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWFbY29uZGljaW9uLkNvbmNlcHRvXS5zcGxpdCgnLCcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGVsZW1lbnQsIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9WZXJpZmljYXIgY29udHJhIGVsIGRldGFsbGUgZGUgbGEgY29uZGljacODwrNuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sXHJcbiAgICAgICAgZGV0Q29uZGljaW9uZXM6IEFycmF5PE0zREVUQ09ORElQUk9NTz4sIGNvbmNlcHRvQ29uZGljaW9uOiBzdHJpbmcsIGpBZGljaW9uYWxlc0NvbmRpY2lvbikge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgb2RldENvbmRpY2lvbmVzRmluZGVkO1xyXG4gICAgICAgIHN3aXRjaCAoY29uY2VwdG9Db25kaWNpb24udHJpbSgpKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tQMVwiOlxyXG5cclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDErMlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb1R5cGVNM1ByZEdycC5TS1AxICsgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5TS1AyKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfU0tVXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tVLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfRElTUFwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uRElTUE9OSUJMRS50b1N0cmluZygpLCBkZXQuVmFsb3IudG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9USVBPXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UeXBlTTNQcmRHcnAuVElQTy50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgXCJQRVJfUFJPQ0VTT1wiOi8vKiBTb2xvIHZhbGlkYSB1bmEgZGV0Q29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyWFByb2Nlc286IE0zUGVyWFByb2Nlc287XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBwZXJYUHJvY2VzbyA9IG9NM1Byb2Nlc29zLk0zUGVyWFByb2Nlc28uZmluZCh4ID0+IHguVGlwb1BlcnNvbmEgPT0gZGV0Q29uZGljaW9uZXNbMF0uVmFsb3IudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkVOXCIgJiYgcGVyWFByb2Nlc28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIgJiYgIXBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJBTE1BQ0VOXCI6XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJIT1JBUklPX0hPUkFcIjpcclxuICAgICAgICAgICAgICAgIHZhciBvVGltZU5vdzogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLnRvU3RyaW5nKCksIG9UaW1lTm93LmdldEhvdXJzKCkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiTG9NM1ByZEFkaWNpb25hbGVzXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0byAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZsckFkaSA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLkNvbmNlcHRvKS5WQUxPUlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBWbHJBZGkudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAvL1Byb2Nlc29zXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVswXS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUFJPQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMV0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvTTNQcm9jZXNvc1twcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW3Byb3BlcnR5XSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8vVmFsaWRhciByZXNwdWVzdGEsIGNvbiBvYmpldG8gYSB2YWxpZGFyXHJcbiAgICBwdWJsaWMgVmFsaWRhclJlc3B1ZXN0YShvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgakFkaWNpb25hbGVzO1xyXG4gICAgICAgIGlmIChvYmplY3RWYWxpZGF0ZSkge1xyXG4gICAgICAgICAgICBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKG9iamVjdFZhbGlkYXRlLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNSBBZ3JlZ2FyIHNlY2Npb24gZGUgdmFsaWRhY2lvbmVzLlxyXG4gICAgICAgICAgICB2YXIgYlJlc3AgPSB0aGlzLlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzKGpBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgaWYgKGJSZXNwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIGVudmlhIGVuIGFkaWNpb25hbGVzLCBlbCBqc29uIGRlIGxhIGluZm9ybWFjaW9uIGVuY29udHJhZGEgZGVsIGRldGFsbGUuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciByZWdsYXMgY29uZmlndXJhZGFzIGRlc2RlIEpTT04gZGUgQWRpY2lvbmFsZXNcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXM6IGFueSkge1xyXG4gICAgICAgIHZhciBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXNcIilcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMgJiYgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlRJUE8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVklHRU5DSUFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLlZhbGlkYXJWaWdlbmNpYShqQWRpY2lvbmFsZXMuUk9PVC5WQUxJREFDSU9ORVMuVkFMMSwgakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipFcnJvclwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJWaWdlbmNpYSh2YWwxOiBEYXRlLCB2YWwyOiBEYXRlKSB7XHJcblxyXG4gICAgICAgIHZhciBGZWNoYUFjdHVhbCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMSlcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh2YWwyKVxyXG5cclxuICAgICAgICAvLyB2YXIgZFZhbDEgPSBuZXcgRGF0ZSh2YWwxKTtcclxuICAgICAgICAvLyB2YXIgZFZhbDIgPSBuZXcgRGF0ZSh2YWwyKTtcclxuXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZFZhbDIpXHJcblxyXG5cclxuICAgICAgICB2YXIgbkZlY2hhQWN0dWFsOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcihGZWNoYUFjdHVhbCk7IC8vKyhGZWNoYUFjdHVhbC5nZXRGdWxsWWVhcigpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldE1vbnRoKCkgKyBcIlwiICsgRmVjaGFBY3R1YWwuZ2V0RGF0ZSgpKTtcclxuICAgICAgICB2YXIgblZhbDE6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDEpOyAvLysoZFZhbDEuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMS5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDEuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICB2YXIgblZhbDI6IG51bWJlciA9ICt0aGlzLkdldEZlY2hhTnVtYmVyKHZhbDIpIC8vKyhkVmFsMi5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRWYWwyLmdldE1vbnRoKCkgKyBcIlwiICsgKCtkVmFsMi5nZXREYXRlKCkgKyAxKSApO1xyXG4gICAgICAgIGlmIChuRmVjaGFBY3R1YWwgPj0gblZhbDEgJiYgbkZlY2hhQWN0dWFsIDw9IG5WYWwyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRGZWNoYU51bWJlcihkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgdmFyIGQgPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgYWNjaW9uLCBzaSBubyB0aWVuZSBjYXJnYWRhIHVuYS4gRXN0YSBhY2Npb24gc2UgY2FyZ2EgamVyYXJxdWljYW1lbnRlLlxyXG4gICAgcHVibGljIFZhbGlkYXJBY2Npb24oalJlc3AsIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqc29uQWRpYyA9IEpTT04ucGFyc2UoakFkaWNpb25hbGVzKTtcclxuICAgICAgICBpZiAoalJlc3AuQWNjaW9uID09IG51bGwgJiYganNvbkFkaWMuUk9PVC5BY2Npb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSBqc29uQWRpYy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvbWFyIGluZm9ybWFjacODwrNuIFxyXG4gICAgcHVibGljIFJldG9tYXJWYWxvcmVzUHJvbW9jaW9uKG9NM0VOQ1BST01POiBNM0VOQ1BST01PLCBqUmVzcCkge1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbiA9IHt9O1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5Ob21icmUgPSBvTTNFTkNQUk9NTy5Ob21icmU7XHJcbiAgICAgICAgalJlc3AuUHJvbW9jaW9uLklEID0gb00zRU5DUFJPTU8uSWRQcm9tb2Npb247XHJcbiAgICAgICAgLy9TaSBubyB0dXZvIG5pbmd1bmEgYWNjaW9uXHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IHsgXCJUaXBvMlwiOiBvTTNFTkNQUk9NTy5UaXBvMiwgXCJUaXBvXCI6IG9NM0VOQ1BST01PLlRpcG8gfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLy8gUmV0b21hciBkZXNkZSBlbCBlbmNhYmV6YWRvIHByb21vLCBzaSBubyBleGlzdGUgZWwgdGlwbyB5IFRpcG8yXHJcbiAgICAgICAgICAgIGlmICghalJlc3AuQWNjaW9uLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcC5BY2Npb24uVGlwbzIgPSBvTTNFTkNQUk9NTy5UaXBvMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcC5BY2Npb24uVGlwbyA9IG9NM0VOQ1BST01PLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FtaWVudG8gZGUgcHJvbW9jacODwrNuLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgYXBsaWNhciBsYSBwcm9tb2Npb24geSBsYXMgcHJvbW9jaW9uZXMgYSBhcGxpY2FyXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb2Npb24oSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTztcclxuICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICByZXR1cm4gdGhpcy5Qcm9jZXNhclByb21vR2VuZXJhbChKUHJvbW9jaW9uZXMsIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTywgb1Byb21vY2lvblByb2Nlc2FkYSwgb00zRU5DUFJPTU8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgdmFyIG9MaXN0YVByb21vc0Fzb2MgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIG5QcmVjaW8sIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01PKTtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICAgICAgb0xpc3RhUHJvbW9zQXNvYy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuVmFsaWRhck1lam9yUHJvbW9jaW9uKG9MaXN0YVByb21vc0Fzb2MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG5QcmVjaW8pO1xyXG5cclxuICAgICAgICAvLyBpZiAob1Byb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvcikgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybztcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsIDwgMCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvZG5lbyBkZSBsb3MgdmFsb3JlcyB0b3RhbGVzXHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFjaW9uIGRlIG1lam9yIG9wY2lvbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhcyBwcm9tb2Npb25lcyBwcm9jZXNhZGFzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgTGlzdGEgZGUgcHJvbW9jaW9uZXMgcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgUHJvbW9jaW9uIHByb2Nlc2FkYSwgcXVlIHJldG9ybmFyw4PCoSBhIGZsdWpvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhck1lam9yUHJvbW9jaW9uKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW86IG51bWJlcik6IFByb21vY2lvblByb2Nlc2FkYSB7XHJcbiAgICAgICAgbGV0IHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVGlwbyA9PSBcIlJFU1RSSUNDSU9OXCIpO1xyXG4gICAgICAgIC8vU2kgZWwgcHJvZHVjdG8gZXN0YSByZXN0cmluZ2lkbyBsZSBkYSBtYXlvciBwcmlvcmlkYWQgYSBlc3RhIHByb21vY2nDg8KzblxyXG4gICAgICAgIGlmICghcHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKSB7XHJcbiAgICAgICAgICAgIC8vMS4gU3VtYSBkZSB0b2RhcyBsYXMgcHJvbW9jaW9uZXMgQWN1bXVsYWJsZXNcclxuICAgICAgICAgICAgLy92YXIgZFByb21vQUNNOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAvL2RQcm9tb0FDTSA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiQUNNXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vRVhDID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJFWENcIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIGxldCBkUHJvbW9BQ01ESU4gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTURJTlwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgLy9Qcm9tb2Npb25lcyBObyBBY3VtdWxhYmxlc1xyXG5cclxuICAgICAgICAgICAgaWYgKGRQcm9tb0FDTURJTiA8IGRQcm9tb0VYQykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcGxpY2FQcm9tb0VYQyhvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBkUHJvbW9FWEMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBkUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYy8vLnB1c2gob0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSBkUHJvbW9FWEMpKTtcclxuXHJcbiAgICAgICAgICAgIC8vUmVjb3JyZXIgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBwcm9tby5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLy8vLy8vRlVOQ0lPTkFMSURBRCBQUk9EUklBIEZVTkNJT05BUiBNw4PCgVMgQURFTEFOVEUsIFNJIFNFIFFVSUVSRSBBR1JVUEFSIExBUyBQUk9NT0NJT05FUyBBQ00gWSBFWENcclxuICAgICAgICAgICAgLy8gaWYoZFByb21vQUNNID09IDAgJiYgZFByb21vRVhDID09IDApe1xyXG4gICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZSBlbmNvbnRyYXJvbiBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgIGlmKGRQcm9tb0FDTSA+IGRQcm9tb0VYQyl7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGFjdW11bGF0aXZhcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIikuZm9yRWFjaCh4ID0+IHguQXBsaWNhZGEgPSB0cnVlKTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gb0xpc3RhUHJvbW9zQXNvYzsvLy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9BQ00pICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLlZhbG9yTW9uZWRlcm8pLCAwKTtcclxuICAgICAgICAgICAgLy8gICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vR2FuYSBwcm9tb2Npb25lcyBleGNsdXllbnRlcy5cclxuICAgICAgICAgICAgLy8gICAgICAgICBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jLy8ucHVzaChvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykpO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gZFByb21vRVhDKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlZhbG9yID09IGRQcm9tb0VYQykuVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+KHByb21vQXNvY2lhZGFSZXN0cmluZ2lkbyk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gMDtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSAwO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgfVxyXG5cclxuICAgIGFwbGljYVByb21vRVhDKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vRVhDOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgcHJvbW9FeGM6IFByb21vY2lvbmVzQXNvY2lhZGFzO1xyXG4gICAgICAgIGlmICh2YWxvclByb21vRVhDID4gMCkge1xyXG4gICAgICAgICAgICBwcm9tb0V4YyA9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gdmFsb3JQcm9tb0VYQyB8fCB4LlZhbG9yTW9uZWRlcm8gPT0gdmFsb3JQcm9tb0VYQyk7XHJcbiAgICAgICAgICAgIHByb21vRXhjLkFwbGljYWRhID0gdHJ1ZTsgLy8gTWFyY2FjaW9uIGRlIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBwcm9tb0V4Yy5WYWxvcik7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW9FeGMuVmFsb3JNb25lZGVybztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBhcGxpY2FQcm9tb0FDTURJTihvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgdmFsb3JQcm9tb0FDTURJTjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9BQ01ESU4gPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYSA9PSBcIkFDTURJTlwiKSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gcHJvbW8uVmFsb3JNb25lZGVybztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSB2YWxvclByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgdmFsb3JQcm9tb0FDTURJTik7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgbWF4aW1vIHZhbG9yIHNlZ3VuIGxhIHJlZ2xhIGEgY29tcGFyYXJcclxuICAgICAqIEBwYXJhbSBvTGlzdGFQcm9tb3NBc29jIFxyXG4gICAgICogQHBhcmFtIHNSZWdsYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4sIHNSZWdsYTogc3RyaW5nLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB2YXIgcmVzdWx0OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoc1JlZ2xhKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQUNNXCI6XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVzdWx0ID0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAheC5mbGFncy5mb3JtYVBhZ28pLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBQ01ESU5cIjpcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlY2lvQWN0dWFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3JUb3RhbERlc2N1ZW50byA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tbyBvZiBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01ESU5cIiAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uVmFsb3JQb3JjZW50YWplID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAocHJlY2lvQWN0dWFsICogcHJvbW8uVmFsb3JQb3JjZW50YWplIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb0FjdHVhbCAtPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbERlc2N1ZW50byArPSBwcm9tby5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWxvclRvdGFsRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkVYQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBzUmVnbGEgJiYgKCF4LmZsYWdzLmZvcm1hUGFnbyB8fCB4LlRpcG8gPT0gXCJNT05FREVST1wiKSkubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLlZhbG9yID4gby5WYWxvck1vbmVkZXJvID8gby5WYWxvciA6IG8uVmFsb3JNb25lZGVybzsgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhciBwcm9tb2Npb24gc2VndW4gZWwgdGlwbyBcclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQnlUaXBvKHByb21vY2lvbjogYW55LCBQcmVjaW86IG51bWJlciwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4pOiBQcm9tb2Npb25lc0Fzb2NpYWRhcyB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIEFjY2lvbjtcclxuICAgICAgICAgICAgdmFyIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBQcm9tb2Npb25lc0Fzb2NpYWRhcygpO1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbiAhPSBudWxsICYmIHByb21vY2lvbi5Qcm9tb2Npb24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24gPSBwcm9tb2Npb24uUHJvbW9jaW9uLklEO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZSA9IHByb21vY2lvbi5Qcm9tb2Npb24uTm9tYnJlO1xyXG4gICAgICAgICAgICAgICAgQWNjaW9uID0gcHJvbW9jaW9uLkFjY2lvbjtcclxuICAgICAgICAgICAgICAgIGlmIChBY2Npb24uUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGEgPSBBY2Npb24uUmVnbGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IFwiRVhDXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzI7XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPXyVcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JQb3JjZW50YWplID0gK0FjY2lvbi5WYWxvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAoK1ByZWNpbykgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IEFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkRUT19FWEFDVFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAtICgrQWNjaW9uLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhT2JzZXEgPSBBY2Npb24uUmVnbGFPYnNlcTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQ2FudGlkYWRPYnNlcXVpb3Mob00zRU5DUFJPTU8sIEFjY2lvbi5PQlNFUVVJT1MsIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFsaWRhciBjYW50aWRhZCB2cyBjYW50aWRhZCBkZSBvYnNxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTU9ORURFUk9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICtBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vRlMgMjAxOTA4MjcgWWEgbm8gc2UgZ3VhcmRhIGVsIHZhbG9yIHRvdGFsIGRlbCBtb25lZGVybyBzaSBubyB1bmljYW1lbnRlIGVsIHBvcmNlbnRhamUuLi4gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yTW9uZWRlcm8gPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpICogKCgrQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDVVBPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JZEN1cG9uID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQUNUSVZBX1BST01PXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLmxJZEFjdGl2YVByb21vID0gQWNjaW9uLlZhbG9yLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJSRVNUUklDQ0lPTl9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlRpcG8gPSBBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJNT0RfQ0FOVElEQURcIjpcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy90aGlzLkFwbGljYXJSZWdsYU1vZENhbnRpZGFkKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcywgb1Byb21vY2lvblByb2Nlc2FkYSwgQWNjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5UaXBvID09IFwiQ09NQklOQURBXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhID0gbmV3IFByb21vY2lvbkNvbWJpbmFkYSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSA9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIgPSBBY2Npb24uVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLk5vbWJyZSA9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbiA9IEFjY2lvbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTywgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vY2lvbi5Gb3JtYVBhZ28pIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuZmxhZ3MuZm9ybWFQYWdvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sXHJcbiAgICAgICAgb2JzZXF1aW9zOiBBcnJheTxhbnk+LCBvUHJvbW9jaW9uZXNBc29jaWFkYXM6IFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEOiBudW1iZXIgPSAtMTtcclxuICAgICAgICAgICAgdmFyIFZhbG9yQ2FudFBSRFJlYWw6IG51bWJlciA9IHRoaXMuZ29EYXRhQWRpY2lvbmFsLmRDYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uZXNBc29jaWFkYXMuSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgVmFsb3JDYW50UFJEID0gK3guTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuQ2FudGlkYWRPYnNlcSA9IFZhbG9yQ2FudFBSRFxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgY2FtcG9zIGFkaWNpb25hbGVzIGVuIHByb21vY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gb00zRU5DUFJPTU8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBcclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyQ2FtcG9zQWRpY2lvbmFsZXMob00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIHByb21vY2lvbjogYW55KSB7XHJcbiAgICAgICAgc3dpdGNoIChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJPQlNFUV9DSUVSUkVcIjpcclxuICAgICAgICAgICAgICAgIC8vQWdyZWdhciBDYW50aWRhZC5cclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHZhciBzVmFsb3JDYW50aWRhZDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JDYW50aWRhZCA9IHguTTNDT05ESVBST01PLmZpbmQoeCA9PiB4LkNvbmNlcHRvID09IFwiZENhbnRpZGFkXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5DYW50aWRhZE9ic3EgPSBzVmFsb3JDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgICAgICAvLyBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGpBZGljOmFueSA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIC8vIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNsYXNpZmljYWNpb24gPSBqQWRpYy5ST09ULkFjY2lvbi5DYXJhY3RlcmlzdGljYTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQ09NQk9cIjpcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLk51bUNvbmRpY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMgPSBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTlswXS5NM0NPTkRJUFJPTU8ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vY2lvbi5JRENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLklkQ29uZGljaW9uID0gcHJvbW9jaW9uLklEQ29uZGljaW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIENvbWJpbmFkYSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbmVzIGNvbWJpbmFkYXNcclxuICAgIHB1YmxpYyBQcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvbW9Db21iaW5hZGFzVjIob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9jZXNhckNvbWJpbmFkYVwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1YyIENPTUJJTkFEQVxyXG4gICAgLyoqXHJcbiAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhcyBkZSBNM1Byb2Nlc29zXHJcbiAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBNMyBQcm9jZXNvcywgZWwgY3VhbCBzZSByZWNvcnJlcsODwqEgbGEgaW5mb3JtYWNpb24gZGUgbGlzdGEgZGUgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAqL1xyXG4gICAgcHVibGljIFByb21vQ29tYmluYWRhc1YyKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICBsZXQgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsID0gXy5jbG9uZURlZXAoaW9NM1Byb2Nlc28uTTNFTkMpO1xyXG5cclxuICAgICAgICBpZiAoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIHZhciBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhc1tpXTtcclxuICAgICAgICAgICAgdmFyIGVzQWN1bXVsYWJsZSA9IHRoaXMuR2V0RXNBY3VtdWxhYmxlUHJvbW8oY29tYmkpXHJcbiAgICAgICAgICAgIC8vL09idGVuZXIgdG9kb3MgbG9zIEVuY2FiZXphZG9zIHF1ZSBhcGxpY2FuIGEgbGEgcHJvbW9jaW9uIGEgbGEgcXVlIHNlIGVzdGEgaXRlcmFuZG9cclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IHRoaXMuR2V0RW5jYWJlemFkb0J5Q29tYmkoY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21iaS5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlczogMyBnYXNlb3NhcyBwb3IgJDUwMFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Qcm9jZXNhclByb21vT2JzcUNpZXJyZShsUHJlY2lvcywgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIk9CU0VRX1NVTVRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhck9ic2VxU3VtVG90YWwob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiLCBjb21iaSwgbFByZWNpb3MsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiWENBUkFDVEVSSVNUSUNBUEFSQ0lBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3JkZW5hckxpc3RhRW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyQ2FyYWN0ZXJpc3RpY2FQYXJjaWFsKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGxDb21ibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFwbENvbWJvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbENvbWJvID0gdGhpcy5Qcm9tb2Npb25Db21iaW5hZGFDb21ibyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fVkFMT1JUT1RBTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9EX0FQTERFU0NcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWIsIGNvbWJpLCBpb00zUHJvY2VzbywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHByb21vY2lvbiBlcyBwYXJhIDJ4MSwgM3gxLCA0eDIsIC4uLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTGlzdEVuY2FiICYmIG9MaXN0RW5jYWIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlYyhsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVlc3RhYmxlY2UgbGEgY2FudGlkYWQgb3JpZ2luYWwgcGFyYSBxdWUgbm8gc2UgcXVlZGUgZW4gdW4gYnV2bGUgaW5maW5pdG9cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1BFbmNPcmlnaW5hbGVzIG9mIGVuY0NvbkxhQ2FudGlkYWRPcmlnaW5hbCkge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRPcmlnaW5hbCA9IG9NM1BFbmNPcmlnaW5hbGVzLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0FjdHVhbCA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNPcmlnaW5hbGVzLklEKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9BY3R1YWwuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGNhbnRpZGFkT3JpZ2luYWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9yZGVuYXJMaXN0YUVuYyhvbGlzdGFFbmM6IE0zUEVuY0l0ZW1zW10sIGVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgIGlmIChlc0FjdW11bGFibGUpIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUTkVUTycpLlZhbG9yKSAtICgrYS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpKTtcclxuICAgICAgICBlbHNlIG9saXN0YUVuYy5zb3J0KChhLCBiKSA9PiAoK2IuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVCcpLlZhbG9yKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBcGxSZWdsYUNvbWJWYWxvclRvdGFsKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG4gICAgICAgIHZhciBjYW50aWRhZERlc2NQcm9tbzogbnVtYmVyID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgcHJlY2lvVG90YWxDb21wcmE6IG51bWJlciA9IGxQcmVjaW9zLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArIE51bWJlcihiLlBVTklUTkVUTyk7IH0sIDApO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcocHJlY2lvVG90YWxDb21wcmEpO1xyXG4gICAgICAgIGxldCBkZXNjQWN1bSA9IDA7XHJcbiAgICAgICAgbGV0IGRlc2NQcm9kQWN0dWFsO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxQcmVjaW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGRlc2NQcm9kQWN0dWFsID0gKGxQcmVjaW9zW2ldLlBVTklUTkVUTyAvIHByZWNpb1RvdGFsQ29tcHJhKSAqIGNhbnRpZGFkRGVzY1Byb21vIC8vNDBcclxuICAgICAgICAgICAgZGVzY0FjdW0gKz0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gbFByZWNpb3NbaV0uUFVOSVRORVRPIC0gZGVzY1Byb2RBY3R1YWw7XHJcbiAgICAgICAgICAgIC8vIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IDApIHtcclxuICAgICAgICAgICAgLy8gICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gICAgIGlmIChsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPCBjYW50aWRhZERlc2NQcm9tbykge1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGNhbnRpZGFkRGVzY1Byb21vIC09IGxQcmVjaW9zW2ldLlBVTklUTkVUTztcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLT0gY2FudGlkYWREZXNjUHJvbW87XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYW50aWRhZERlc2NQcm9tbyA+IGRlc2NBY3VtIHx8IGNhbnRpZGFkRGVzY1Byb21vIDwgZGVzY0FjdW0pIHtcclxuICAgICAgICAgICAgLy9maW5kIGRlbCB1bHRpbW8gXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbmNvbnRyZSBkaWZlcmVuY2lhIGVuIHByb21vcyBjb21iaW5hZGFzOiBcIiArIGNhbnRpZGFkRGVzY1Byb21vICsgXCIgdnMgXCIgKyBkZXNjQWN1bSk7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyA9IGxQcmVjaW9zW2xQcmVjaW9zLmxlbmd0aCAtIDFdLlBVTklUTkVUTyAtIChjYW50aWRhZERlc2NQcm9tbyAtIGRlc2NBY3VtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJPYnNlcVN1bVRvdGFsKHByb2R1Y3Rvc0FwbGljYVByb21vOiBNM1BFbmNJdGVtc1tdLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCB2YWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZFByb2R1Y3RvQWN0dWFsID0gMTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IGRpZmVyZW5jaWEgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBlbmNJdGVtIG9mIHByb2R1Y3Rvc0FwbGljYVByb21vKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgICAgICBsZXQgcFVuaXRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRBY3R1YWwgPSArZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA8PSBjYW50aWRhZEFjdHVhbCkge1xyXG4gICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zICs9IHBVbml0QWN0dWFsO1xyXG4gICAgICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCsrO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0b1JldmlzYWRvID0gcHJvZHVjdG9zUmV2aXNhZG9zLmZpbmQoeCA9PiB4LklkID09IGVuY0l0ZW0uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2R1Y3RvUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBlbmNJdGVtLklELCBDYW50aWRhZDogMSB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdW1hVmFsb3JQcm9kdWN0b3MgKyBkaWZlcmVuY2lhID49IHZhbG9yUHJvbW8pIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIG9NM1Byb2Nlc29zLCBwcm9kdWN0b3NSZXZpc2Fkb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHN1bWFWYWxvclByb2R1Y3RvcyAtIHZhbG9yUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIHZhbG9yQ29tYm8sIDEpO1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBvTTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcykge1xyXG4gICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBsZXQgcHJvZEhpam86IE0zUEVuY0l0ZW1zO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBwcm9kUmV2aXNhZG8gb2YgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9kUmV2aXNhZG8pIHtcclxuICAgICAgICAgICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklEID09IHByb2RSZXZpc2Fkby5JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kSGlqbyA9IF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28ocHJvZEhpam8sIHByb2RSZXZpc2Fkby5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChwcm9kSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhckFQcm9kdWN0b3NRdWl0YXJDb21iaShvTTNQcm9jZXNvLCBwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm9TdW1Ub3RhbChwcm9kdWN0b3NFbk0zUHJvY2VzbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpOiBNM1BFbmNJdGVtcyB7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRMaXN0YVByZWNpb3MobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc0ZpbHRlciA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih5ID0+IHkuSUQgPT0gb0xpc3RFbmNhYltpXS5JRCkuZm9yRWFjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zRmlsdGVyLnB1c2goeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zRmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbW9jaW9uIGRlIGNvbWJvLCB4IHByb2R1Y3RvcywgeSBwcm9kdWN0b3MsIC4uLiBuIHByb2R1Y3RvcyBcclxuICAgICAqIHBvciAkMTAwMFxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKiBAcGFyYW0gYkVzQWN1bXVsYWJsZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4sIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGxldCBmbGFnQXBsaWNvUHJvbW8gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbk51bWVyb0NvbmRpY2lvbmVzOiBudW1iZXIgPSArY29tYmkuQWNjaW9uLk51bUNvbmRpY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JQcm9tbyA9ICtjb21iaS5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBMaXN0Q29uZGljaW9uZXMgPSBuZXcgQXJyYXk8QXJyYXk8YW55Pj4oKTtcclxuICAgICAgICAgICAgdmFyIG1pbmltb0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcG9yY2VudGFqZVByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHZhbG9yVG90YWxTaW5Qcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZTogTTNSZWdTZXJ2aWNlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG5OdW1lcm9Db25kaWNpb25lczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBjb25kaWNpb24gMS5cclxuICAgICAgICAgICAgICAgIHZhciBMaXN0UHJvbW9Db21iaTogQXJyYXk8TTNQRW5jSXRlbXM+ID0gdGhpcy5CdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYiwgaS50b1N0cmluZygpLCBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIExpc3RDb25kaWNpb25lcy5wdXNoKHRoaXMuR2V0TGlzdGFQcmVjaW9zKGxQcmVjaW9zLCBMaXN0UHJvbW9Db21iaSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbHRyYXJMaXN0YUNvbmRpY2lvbmVzQ29tYm8oTGlzdENvbmRpY2lvbmVzLCBvTGlzdEVuY2FiKTtcclxuICAgICAgICAgICAgaWYgKExpc3RDb25kaWNpb25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0J1c2NhciBlbCB2YWxvciBtZW5vciBkZSBsYXMgaXRlbXMgYWdyZWdhZGFzXHJcbiAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IExpc3RDb25kaWNpb25lc1swXS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGorKykgey8vQ29taWVuemEgZGVzZGUgMSBwb3JxdWUgZWwgMCB5YSBzZSB2YWxpZG8gZW4gbGEgYW50ZXJpb3IgbGluZWFcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXNQcmVjaW9zOiBBcnJheTxhbnk+ID0gTGlzdENvbmRpY2lvbmVzW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdNaW4gPSBpdGVtc1ByZWNpb3MubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdNaW4gPCBtaW5pbW9JdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IG5ld01pbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL0xvcyBjb21ib3MgZGViZW4gcHJvY2VzYXJzZSBkZSBhIHVubyBwYXJhIHN1IGNvcnJlY3RvIGZ1bmNpb25hbWllbnRvXHJcbiAgICAgICAgICAgICAgICBpZiAobWluaW1vSXRlbXMgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1vSXRlbXMgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vUmVjb3JyZSB0b2RvcyBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zIGRlIGxhIHByb21vIHBhcmEgc2FiZXIgY3VhbCBlcyBlbCB2YWxvciByb2FsIGRlIGxhIHByb21vXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5Qcm9tbyArPSArbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9DYWxjdWxhIGVsIHZhbG9yIGRlbCBwb3JjZW50YWplIGRlIGxhIHByb21vIGEgcGFydGlyIGRlbCBjYWxvciBkZWwgY29tYm8geSBkZSBsYSBzdW1hIGRlIGxvcyBwcmVjaW9zIG9yaWdpbmFsZXMgZGUgbG9zIHByb2R1Y3Rvc1xyXG4gICAgICAgICAgICAgICAgcG9yY2VudGFqZVByb21vID0gMTAwIC0gKCtWYWxvclByb21vICogMTAwIC8gdmFsb3JUb3RhbFNpblByb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IExpc3RDb25kaWNpb25lcy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb25kaSA9IExpc3RDb25kaWNpb25lc1trXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IG1pbmltb0l0ZW1zOyBsKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYzogYW55ID0gY29uZGlbbF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5mb3JFYWNoKHByZWNpbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlY2lvLkluZGljZSA9PSBlbmMuSW5kaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjaW8uUHJvbW9BcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsb3IgPSBwcmVjaW8uUFVOSVRORVRPO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Nb2RpZmljYSBlbCBwcmVjaW8gZGUgbG9zIHByb2R1Y3RvcyBhIHN1IG51ZXZvIHZhbG9yIGNvbiBsYSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IHZhbG9yIC0gKHZhbG9yICogcG9yY2VudGFqZVByb21vIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlByb21vQXBsaWNhZGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJlY2lvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRW4gbGFzIHByb21vcyBwb3IgY29tYm8gbm8gYXBsaWNhbiBlbCBwcmVjaW8gZGUgbG9zIG90cm9zIHByb2R1Y3RvcyBxdWUgbm8gaGFjZW4gcGFydGUgZGVsIGNvbWJvIDopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xQcmVjaW9zLmZpbmQoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LkluZGljZSA9PSBlbmMuSW5kaWNlKS5QVU5JVE5FVE8gPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ0FwbGljb1Byb21vID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZsYWdBcGxpY29Qcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gY29tYmkuQWNjaW9uLkNvZGlnbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFwcm9kdWN0b1Byb21vQ29tYmlFeGlzdGVudGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZS5sb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8oaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGNvbWJpLkFjY2lvbi5Db2RpZ28sIGNvbWJpLkFjY2lvbi5WYWxvciwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGltcGlhckVuY0l0ZW1QcmRDb25kaShvTGlzdEVuY2FiKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQcm9tb2Npb25Db21iaW5hZGFDb21ib1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWdBcGxpY29Qcm9tbztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhsaXN0Q29uZGljaW9uZXM6IEFycmF5PGFueT4sIG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0Q29uZGljaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBudWV2YUNvbmRpY2lvbiA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpY2lvbiBvZiBsaXN0Q29uZGljaW9uZXNbX2ldKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZW5jSXRlbSA9IG9NM1BFbmNJdGVtc0xpc3QuZmluZCh4ID0+IHguSUQgPT0gY29uZGljaW9uLklEKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRldENhbnRpZGFkID0gZW5jSXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA9IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA/IGVuY0l0ZW1bXCJQcmRDb25kaVwiXSA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldENhbnRpZGFkID4gZW5jSXRlbVtcIlByZENvbmRpXCJdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51ZXZhQ29uZGljaW9uID0gW2NvbmRpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY0l0ZW1bXCJQcmRDb25kaVwiXSsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlzdENvbmRpY2lvbmVzW19pXSA9IG51ZXZhQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsaW1waWFyRW5jSXRlbVByZENvbmRpKG9NM1BFbmNJdGVtc0xpc3Q6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIG9NM1BFbmNJdGVtc0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIGVsZW1lbnRbXCJQcmRDb25kaVwiXTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkID0gMSkge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b1F1aXRhcjtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0gPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByb2R1Y3RvUXVpdGFyID0gb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLmZpbmQoeCA9PiB4LklEID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKTtcclxuICAgICAgICBpZiAocHJvZHVjdG9RdWl0YXIpIHtcclxuICAgICAgICAgICAgcHJvZHVjdG9RdWl0YXIuQ2FudGlkYWQgKz0gKC0xICogY2FudGlkYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdLnB1c2goeyBJRDogb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8sIENhbnRpZGFkOiAoLTEgKiBjYW50aWRhZCkgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZ3JlZ2EgZWwgcHJvZHVjdG8gZGUgbGEgbGlzdGEgZGUgZW50cmFkYSBhIHVuIGFycmVnbG8gZGUgcHJvZHVjdG9zIHF1ZSBwb3N0ZXJpb3JtZW50ZSBzZXJhIGxvcyBwcm9kdWN0b3MgaGlqb3MgZGVsIHByb2R1Y3RvIENvbWJvXHJcbiAgICBhZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3MocHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gdGhpcy5nZXRQcm9kdXRvUHJvbW9Db21ibyhvTTNQcm9jZXNvLk0zRU5DLCBvUHJlY2lvRGVsUHJvZHVjdG9BY3R1YWwpO1xyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgICAgICAvL0xhIGNhbnRpZGFkIGRpc21pbnV5ZSBwZXJvIGVzdGUgbW92aW1pZW50byBzZSByZXZlcnNhIGFsIHRlcm1pbmFyIGRlIHZhbGlkYXIgZXN0YSBwcm9tb1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIDEpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0Rpc21pbnV5ZSBlbiB1bm8gbGEgY2FudGlkYWQgZGVsIHByb2R1Y3RvIHkgcmV0b3JuYSB1biBjbG9uIGRlIGVzdGVcclxuICAgIGdldFByb2R1dG9Qcm9tb0NvbWJvKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IHByb2R1Y3Rvc0VuTTNQcm9jZXNvLmZpbmQoeCA9PiB4LklEID09IG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbC5JRClcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBpZiAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gKCtvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yIC0gMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfLmNsb25lRGVlcChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBlbiBoYXNobWFwIGRlIHByZWNpb3NcclxuICAgICAqIEBwYXJhbSBobWxQcmVjaW9zIFxyXG4gICAgICogQHBhcmFtIElEIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkdG9IbVByZWNpb3MoaG1sUHJlY2lvczogQXJyYXk8YW55PiwgSUQ6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBmaW5kZWQ6IGFueSA9IGhtbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gSUQpO1xyXG4gICAgICAgIGlmIChmaW5kZWQpIHtcclxuICAgICAgICAgICAgZmluZGVkLkluZGljZSA9ICtmaW5kZWQuSW5kaWNlICsgKzE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZmluZGVkID0geyBcIklEXCI6IElELCBcIkluZGljZVwiOiAwIH07XHJcbiAgICAgICAgICAgIGhtbFByZWNpb3MucHVzaChmaW5kZWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmluZGVkLkluZGljZTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1c2NhciBlbmNhYmV6YWRvcyBxdWUgdGVuZ2EgbGEgcHJvbW9jaW9uIHkgY29uZGljaW9uIGVudmlhZGEgY29tbyBwYXJhbWV0cm9cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIElkQ29uZGljaW9uIFxyXG4gICAgICogQHBhcmFtIGlkUHJvbW9jaW9uZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdXNjYXJFbmNCeVByb21vWUNvbmQob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBJZENvbmRpY2lvbjogc3RyaW5nLCBpZFByb21vY2lvbmVzOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0VuY0ZpbmRlZCA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUpXHJcbiAgICAgICAgICAgICAgICBpZiAoIW9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlIHx8ICEob00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXRDYW50aWRhZCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXQgJiYgZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9zOiBBcnJheTxhbnk+ID0gSlNPTi5wYXJzZShkZXQuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbW9GaW5kZWQgPSBwcm9tb3MuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gaWRQcm9tb2Npb25lcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21vRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGljaW9uRmluZGVkID0gcHJvbW9GaW5kZWQuQWNjaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaWNpb25GaW5kZWQuZmluZCh4ID0+IHggPT0gSWRDb25kaWNpb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZCA9PSBJZENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0VuY0ZpbmRlZC5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvRW5jRmluZGVkO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw4PCs24gc2kgbGEgcHJvbW9jacODwrNuIHF1ZSBsbGVnYSBjb21vIHBhcmFtZXRybywgZXMgYWN1bXVsYWJsZSBvIG5vXHJcbiAgICAgKiBAcGFyYW0gcHJvbW9jaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0RXNBY3VtdWxhYmxlUHJvbW8ocHJvbW9jaW9uOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAocHJvbW9jaW9uLkFjY2lvbi5SZWdsYSAmJiBwcm9tb2Npb24uQWNjaW9uLlJlZ2xhID09IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRFc0FjdW11bGFibGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhclByb2R1Y3RvQXBsRGVzYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zLCBlc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGxldCBwcm9kc0FwbERlc2N1ZW50bzogQXJyYXk8TTNQRW5jSXRlbXM+ID0gW107XHJcbiAgICAgICAgbGV0IHNrdUFwbERlc2N1ZW50b3M6IEFycmF5PGFueT4gPSBjb21iaS5BY2Npb24uc2t1QXBsRGVzYzsgLy9be1NLVTpcIlhYWFhYWFwifSwge1NLVTpcIllZWVlZWVlcIn1dXHJcbiAgICAgICAgbGV0IG1heE51bURlc2N1ZW50b3MgPSArY29tYmkuQWNjaW9uLm1heE51bURlc2M7XHJcbiAgICAgICAgbGV0IGNvbnREZXNjQXBsaWNhZG9zID0gMDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9DYWxjdWxhIGVsIG51bWVybyBtYXhpbW8gZGUgZGVzY2luZXRvcyBxdWUgcHVlZGUgYXBsaWNhciBsYSBwcm9tbyBxdWUgZXMgY29tYmkuQWNjaW9uLm1heE51bURlc2MgbXVsdGlwbGljYWRvIHBvciBsYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHBhbGljYW4gbGEgcHJvbW8gZW4gZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICBtYXhOdW1EZXNjdWVudG9zID0gb0xpc3RFbmNhYi5yZWR1Y2UoKGFjYywgY3VyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgfSwgMCkgKiBtYXhOdW1EZXNjdWVudG9zO1xyXG5cclxuICAgICAgICAgICAgLy9EZSBsb3MgcHJvZHVjdG9zIGRlbCBwcm9jZXNvIGZpbHRybyBsb3MgcHJvZHVjdG9zIHF1ZSBhcGxpY2FyYW4gZWwgZGVzY3VlbnRvIHNlZ3VuIGxvcyBTS1UgY29uZmlndXJhZG9zIGVuIGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLk0zRU5DLmZvckVhY2gob00zUEVuY0l0ZW1zID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChza3VBcGxEZXNjdWVudG9zLmZpbmQoeCA9PiB4LlNLVSA9PSBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bykpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kc0FwbERlc2N1ZW50by5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy9Dw4PCoWxjdWxvIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcyBkZSBsb3MgcHJvZHVjdG9zIGEgbG9zIHF1ZSBsYSBwcm9tbyBhcGxpY2FyYSBkZXNjdWVudG9cclxuICAgICAgICAgICAgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhwcm9kc0FwbERlc2N1ZW50bywgZXNBY3VtdWxhYmxlKTtcclxuXHJcbiAgICAgICAgICAgIC8vQXBsaWNhIHRhbnRvcyBkZXNjdWVudG9zIHNlIHB1ZWRhbiBhIHBsYWljYXIgYSBjYWRhIHZhbG9yIGRlIGxQcmVjaW9cclxuICAgICAgICAgICAgd2hpbGUgKGNvbnREZXNjQXBsaWNhZG9zIDwgbWF4TnVtRGVzY3VlbnRvcyAmJiBjb250RGVzY0FwbGljYWRvcyA8IGxQcmVjaW9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTyAtPSAoK2xQcmVjaW9zW2NvbnREZXNjQXBsaWNhZG9zXS5QVU5JVE5FVE8pICogKCgrY29tYmkuQWNjaW9uLlZhbG9yKSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICBjb250RGVzY0FwbGljYWRvcysrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1JlY2FsY3VsYSBsb3MgdmFsb3JlcyBkZWwgcHJvZHVjdG8gYXBsaWNhbmRvIGVsIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHNBcGxEZXNjdWVudG8sIGNvbWJpLCB0cnVlLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBvYnNlcXVpb3MgZW4gZWwgY2llcnJlXHJcbiAgICAgKiBWYWxpZGEgdG9kYSBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAqIFZhbGlkYSBsYSBwcm9tb2Npw4PCs24sIHBvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGluZ3Jlc2Fkb3MsIGN1w4PCoW50b3Mgb2JzZXF1aW9zIHNlIHB1ZWRlbiBkYXIuXHJcbiAgICAgKiBUcmFlIHRvZG9zIGxvcyBvYnNlcXVpb3MgcXVlIHNlIGluZ3Jlc2Fyb24gZW4gZWwgY2Fycml0byBkZSBjb21wcmFzLCBsb3MgbGlzdGFcclxuICAgICAqIGNvbG9jYSBlbiB2YWxvciAwIGxvcyBvYnNlcXVpb3MgcXVlIHNlbGVjY2lvbm8gYXV0b21hdGljYW1lbnRlIGVsIGFsZ29yaXRtb1xyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MsIGltcHVlc3RvcyB5IGRlbWFzIHZhbG9yZXMgdG90YWxlcy5cclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGxvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcyBhbCBjYXJyaXRvIHF1ZSB0aWVuZW4gb2JzZXF1aW9cclxuICAgICAqIEBwYXJhbSBjb21iaSBJbmZvcm1hY2nDg8KzbiBkZSBwcm9tb2Npw4PCs24gZGUgb2JzZXF1aW9zXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gUHJvY2VzbyBjb24gdG9kb3MgbG9zIHByb2R1Y3RvcyBlIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvY2VzYXJQcm9tb09ic3FDaWVycmUob0xpc3RFbmNhYjogQXJyYXk8YW55PiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlvTTNQcm9jZXNvWydQcm9kdWN0b3NDb21iaSddID0gW107XHJcbiAgICAgICAgbGV0IGNhbnRQb3JPYnMgPSArY29tYmkuQWNjaW9uLkNhbnRpZGFkT2JzcTsgLy9Qb3IgY2FkYSBjdWFudG9zIHByb2R1Y3RvcyBjb24gbGEgcHJvbW9jacODwrNuIHNlIGRhcsODwqEgZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgbGV0IGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgbGV0IHN1bWFWYWxvclByb2R1Y3RvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkT2JzZXF1aW9zID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JDb21ibyA9IDA7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc1JldmlzYWRvcyA9IFtdO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgbTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub0xpc3RhT2JzZXF1aW9zID0gY29tYmkuQWNjaW9uLk9CU0VRVUlPUztcclxuICAgICAgICBtM1JlZ1NlcnZpY2Uub2JzZXF1aW9zQ2FudGlkYWQgPSAwXHJcbiAgICAgICAgLy8gdmFyIGNhbnRPYnNlcXVpb3M6IG51bWJlciA9IDA7IC8vQ2FudGlkYWQgZGUgb2JzZXF1aW9zIHF1ZSBzZSBkYXLDg8KhIHBvciBlc3RhIGNvbXByYS5cclxuXHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvZHVjdG8gb2Ygb0xpc3RFbmNhYikge1xyXG4gICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcHJvZHVjdG8uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICBjYW50QWdyZWdhZGErKztcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gcHJvZHVjdG8uSUQpO1xyXG4gICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9SZXZpc2Fkby5DYW50aWRhZCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zLnB1c2goeyBJZDogcHJvZHVjdG8uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FudEFncmVnYWRhID09PSBjYW50UG9yT2JzKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvckNvbWJvICs9IHN1bWFWYWxvclByb2R1Y3RvcztcclxuICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgaW9NM1Byb2Nlc28sIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZE9ic2VxdWlvcysrO1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgICAgICAgICBjYW50QWdyZWdhZGEgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG0zUmVnU2VydmljZS5hcm1hckxpc3RhT2JzZXF1aW9zQ29tYmlTS1UoY29tYmksIHByb2R1Y3RvQ29tYm8sIGNhbnRpZGFkT2JzZXF1aW9zKTtcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc29bXCJvTTNSZWdTZXJ2aWNlXCJdID0gbTNSZWdTZXJ2aWNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwbGljYXIgcmVnbGFzLCByZXNwZWN0byBhIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYS5cclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyBcclxuICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAqL1xyXG4gICAgcHVibGljIEFwbGljYXJSZWdsYU1vZENhbnRpZGFkKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgQWNjaW9uID0gY29tYmkuQWNjaW9uO1xyXG5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IEFjY2lvbi5DYW50aWRhZDsgLy9FamVtcGxvIDogM1xyXG4gICAgICAgIC8vdmFyIGlDYW50aWRhZEFQTFByb21vOiBudW1iZXI7IC8vTnVtZXJvIHJlYWwgZGUgYXBsaWNhY2lvbiBkZSBwcm9tb2Npb25lcywgU2kgYXBsaWNhIHJlc3RhIGVsIHJlc2lkdW8uXHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlcjsgLy9DYW50aWRhZCByZWFsIGluZ3Jlc2FkYS5cclxuICAgICAgICB2YXIgVmFsb3JQcm9tbzogbnVtYmVyID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIHZhciB2YWxvclByb21vVW5pdDogbnVtYmVyID0gKCtWYWxvclByb21vKSAvICgraUNhbnRpZGFkUHJvbW8pXHJcbiAgICAgICAgaUNhbnRpZGFkUmVhbCA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgPj0gaUNhbnRpZGFkUHJvbW8pIHsgLy9KQUdNIDIwMTkwNDI2IFNFIENBTUJJQSwgQU5URVMgRVNUQUJBIExBIEZVTkNJT05BTElEQUQgREUgQ0FOVElEQUQgUkVBTCBWUyBDQU5USURBRCBQUk9NT0NJT04uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9pQ2FudGlkYWRBUExQcm9tbyA9IGlDYW50aWRhZFJlYWwgLyBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICBpQ2FudGlkYWRSZWFsID0gaUNhbnRpZGFkUmVhbCAtIFJlc2lkdW87XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlDYW50aWRhZFJlYWw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA+IHZhbG9yUHJvbW9Vbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gdmFsb3JQcm9tb1VuaXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsUHJlY2lvcy5maW5kKHggPT4geC5BcGxpY2FkbykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJBcGxpY2FyUmVnbGFNb2RDYW50aWRhZFwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhcmdhciBjb21iaW5hZGFzIGRlc2RlIGRpbmFtaWNhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0Q29tYmluYWRhc0Zyb21EaW5hbWljYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgc0NvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgb0NvbWJpbmFkYSA9IEpTT04ucGFyc2Uoc0NvbWJpbmFkYSk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID0gb0NvbWJpbmFkYTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGEgZGluYW1pY2FzIHByb2Nlc28gZGUgY29tYmluYWRhc1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzRmluZGVkOiBNM1BEaW5hbWljYXM7XHJcbiAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZCA9IGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiQ09NQklOQURBXCIpO1xyXG4gICAgICAgIGlmIChvTTNQRGluYW1pY2FzRmluZGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPiA9IEpTT04ucGFyc2Uob00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvcik7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvUHJvbW9Db21iaTogUHJvbW9jaW9uQ29tYmluYWRhID0gaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBhcnJQcm9tb1tpXS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW9Qcm9tb0NvbWJpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcy5wdXNoKGFyclByb21vW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gXCJDT01CSU5BREFcIjtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG5cclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhciBwcm9tb2Npb25lcywgc2VndW4gbGEgbGlzdGEgZGUgcHJlY2lvcyBkaXZpZGlkYS5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBkZSBwcmVjaW9zLCBjb250cmEgZXN0ZSBvYmpldG8gc2UgaXRlcmFyw4PCoSB5IHNlIG9yZGVuYXLDg8KhIGRlIG1heW9yIGEgbWVub3JcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIFxyXG4gICAgICogQHBhcmFtIGNvbWJpIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgVGlwb1Byb21vID0gY29tYmkuVGlwbzI7XHJcbiAgICAgICAgdmFyIGl4OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBpeTogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgeDogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMV1cclxuICAgICAgICB2YXIgeTogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMF0gLSAoK3gpO1xyXG4gICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgYkVudHJvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgcmVzaWR1b1ggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgICAgICAgICAgeCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vU2UgaXRlcmEgZWwgYXJyZWdsbyBkZSBwcmluY2lwaW8gYSBmaW4geSBkZSBmaW4gYSBwcmluY2lwaW8uLi4gXHJcbiAgICAgICAgLy8vQ29uZm9ybWUgc2UgcmVjb3JyZSBlbCBhcnJlZ2xvIGRlIGZpbiBhIHByaW5pY2lvLCBzZSB2YSBkYW5kbyBsYSBwcm9tb2Npw4PCs24gYSBsb3MgcHJvZHVjdG9zIGRlIG1lbm9yIHZhbG9yLlxyXG4gICAgICAgIC8vL1NpIGxhIHByb21vY2nDg8KzbiBlc3RhIGluY29tcGxldGEsIGxvcyBwcm9kdWN0b3MgZGUgbGEgbWl0YWQgcXVlZGFuIHNpbiBwcm9tb2Npw4PCs24gXHJcbiAgICAgICAgdmFyIGk6IG51bWJlciA9IDA7XHJcbiAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGogPSArbFByZWNpb3MubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCBsUHJlY2lvcy5sZW5ndGggJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaXggPSAwO1xyXG4gICAgICAgICAgICAgICAgaXkgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeCA8IHgpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaXgrKztcclxuICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaXkgPCB5ICYmIGogPj0gaSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzaWR1b1ggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiRW50cm8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3Nbal0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2pdLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl5Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgai0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAgICAgICAgIC8vSkdBTSAyMDE5MTAyMywgZnVuY2lvbmFsaWRhZCBkZSBxdWUgc29sbyBlbnRyYSBhY8ODwqEgY3VhbmRvIHNlIGNhbWJpbyBhbGd1biBwcmVjaW9cclxuICAgICAgICAgICAgaWYgKGJFbnRybykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBmYWxzZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgLy8gICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuXHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLlNldFZhbG9yUHJvbW9jaW9uZXMoZW5jKTtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuQWdyZWdhckxpc3RhUHJvbW8oZW5jLCBjb21iaSk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByZWNpbyB0b3RhbCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MgYSB0ZW5lciBlbiBjdWVudGFcclxuICAgICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgUHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zOiBBcnJheTxhbnk+LCBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGJBcGxWYWxpZGE6IGJvb2xlYW4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICB2YXIgZFZhbG9yUHJvbW9BbnQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy92YXIgZFZhbG9yUHJvbW9BbnRBY3VtOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVmFsb3JBY3Q6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9OdWV2byA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG4gICAgICAgICAgICB2YXIgcHJlY2lvVG90YWxBbnRlcmlvcjtcclxuICAgICAgICAgICAgcHJlY2lvVG90YWxBbnRlcmlvciA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxOCBTRSBRVUlUQSBWQUxJREFDSU9OLCBQT1IgRkxVSk8gUVVFIFNJIFNFIERFVlVFTFZFIFRSQUUgTEEgUFJPTU8sIFBFUk8gU0kgU0UgQk9SUkEuIGlmIChkUHJlY2lvTnVldm8gPCBwcmVjaW9Ub3RhbEFudGVyaW9yKSB7IC8vIFNlIGFncmVnYSB2YWxpZGFjaW9uIGRlIHByZWNpbywgcGFyYSBlc2NvZ2VyIGVsIG1lam9yLiBObyBwdWVkZW4gYSB2ZXIgMiBwcm9tb2Npb25lcy5cclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gZFByZWNpb051ZXZvO1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFJFQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vTGltcGlhciBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMuVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvcywgZW5jKSB8fCAhYkFwbFZhbGlkYSkgJiYgIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIikuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIC8vIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGRWYWxvckFjdCA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9IHRoaXMuR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zLCBlbmMpO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gdGhpcy5HZXRWYWxvclByb21vQUN0KGVuYywgZFZhbG9yUHJvbW9BbnQsIGRQcmVjaW9OdWV2bywgcHJlY2lvVG90YWxBbnRlcmlvciwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2UgYWdyZWdhIHBhcmEgcHJvbW9jaW9uZXMgYWN1bXVsYWJsZXMuIGFjdW11bGFiXHJcbiAgICAgICAgICAgICAgICBpZiAoIWJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKS5WYWxvciA9IGRWYWxvclByb21vQW50LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRXMgYWN1bXVsYWJsZSwgdXRpbGl6YXIgbGEgaW5mb3JtYWNpw4PCs24gXHJcbiAgICAgICAgICAgICAgICAgICAgZFZhbG9yUHJvbW9BbnQgPSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvciAtIHByZWNpb1RvdGFsQW50ZXJpb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMsIGRWYWxvckFjdCArIGRWYWxvclByb21vQW50KTtcclxuICAgICAgICAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpLCBkVmFsb3JBY3QpO1xyXG4gICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYywgZFByZWNpb051ZXZvKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zRGlyZWN0YXMoZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maWx0ZXIoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlZBTF9QUk9NT0NfXCIpKS5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkZXQuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUXVpdGFyTGFzUHJvbW9zQ29tYmluYWRhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST19DT01CSV9cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW8gdW5pdGFyaW8sIGEgcGFydGlyIGRlIHVuIG51ZXZvIHByZWNpbyBUb3RhbC5cclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gbmV3UHJpY2UgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvVW5pdEZyb21Ub3RhbChlbmM6IE0zUEVuY0l0ZW1zLCBuZXdQcmljZTogbnVtYmVyKSB7XHJcbiAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA9ICgrbmV3UHJpY2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzaSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1biBwcm9kdWN0byBzZSBjYW1iaWFyb24gbyBuby5cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBMaXN0YSBjb24gdG9kb3MgbG9zIGl0ZW1zXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpVG9kb3NBUExQcm9tb0NvbWJpbmFkYShsUHJlY2lvczogQXJyYXk8YW55PiwgZW5jOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIC8vQ2hlY2ssIHNpIGFsZ3VubyBkZSBsYSBsaXN0YSBkZSBwcmVjaW8gZXMgaWd1YWwgYWwgcHJlY2lvIGFudGVyaW9yXHJcbiAgICAgICAgdmFyIHByZWNpb0FudGVyaW9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZpbmQoeCA9PiB4LlBVTklUTkVUTyA9PSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIGlmIChwcmVjaW9BbnRlcmlvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvcmVzIGRlIHByb21vY2lvbmVzIGRlcGVuZGllbmRvIGRlbCBudW1lcm8gZGUgaXRlbXMgcXVlIG5vIHNlIG1vZGlmaWNhcm9uXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FudGVyaW9yKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGRWYWxvciA9IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIG51bWVyb0l0ZW1zID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciBkVW5pdFByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICtudW1lcm9JdGVtcyAqICtkVW5pdFByb21vO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIGRlIGxhIHByb21vY2lvbiBxdWUgc2UgZXN0YSBwcm9jZXNhbmRvIGFjdHVhbG1lbnRlXHJcbiAgICAgKiBAcGFyYW0gZW5jIFxyXG4gICAgICogQHBhcmFtIHZhbG9yUHJvbW9BbnQgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3RUb3RhbE51ZXZvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0VmFsb3JQcm9tb0FDdChlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vQW50OiBudW1iZXIsIHZhbG90VG90YWxOdWV2bzogbnVtYmVyLCBwcmVjaW9Ub3RhbEFudDogbnVtYmVyLCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yVG90YWxTaW5EdG86IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUHJvbW9BY3Q6IG51bWJlcjtcclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHNpIHZpZW5lIGFjdW11bGFibGUgdXRpbGl6YXIgZWwgcHJlY2lvIGFudGVyaW9yLCB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgZHRvLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9IHByZWNpb1RvdGFsQW50O1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG90VG90YWxOdWV2bztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yVG90YWxTaW5EdG8gPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgdmFsb3JQcm9tb0FjdCA9ICt2YWxvclRvdGFsU2luRHRvIC0gK3ZhbG9yUHJvbW9BbnQgLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHZhbG9yUHJvbW9BY3Q7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBHZXRWYWxvclByb21vQUN0OiBcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRlYXIgZWwgdmFsb3IgZGUgbGEgcHJvbW9jaW9uXHJcbiAgICAgKiBAcGFyYW0gZW5jIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNldFZhbG9yUHJvbW9jaW9uZXMoZW5jOiBNM1BFbmNJdGVtcywgdmFsb3JQcm9tbzogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9lbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9ICgoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFNJTkRUT1wiKS5WYWxvcikgLSAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcikpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vRlMgMjAxOTA3MjUgUmVkb25kZW8gZGVsIHZhbG9yIGRlIHByb21vY2lvblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IChNYXRoLnJvdW5kKHZhbG9yUHJvbW8gKiAxMDApIC8gMTAwKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MTggU2UgYWdyZWdhIGVsIHZhbG9yIHVuaXRhcmlvIGRlIGxhIHByb21vY2nDg8KzblxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVlVOSVRQUk9NT1wiKS5WYWxvciA9ICgrKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApIC8gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikudG9TdHJpbmcoKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vICAvKipcclxuICAgIC8vICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgIC8vICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgLy8gICovXHJcbiAgICAvLyBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lc0Zyb21MaXN0YVByZWNpb3MoZW5jOiBNM1BFbmNJdGVtcywgbFByZWNpb3M6IEFycmF5PGFueT4pIHtcclxuICAgIC8vICAgICB0cnkge1xyXG4gICAgLy8gICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEICYmIHguUFVOSVRORVRPID09IGRWYWxvcilcclxuICAgIC8vICAgICB9IGNhdGNoe1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXNCeUxpc3RhUHJlY0JldGEobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgLy8gICAgIGlmIChsUHJlY2lvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgIC8vICAgICAgICAgdmFyIGlTaXplUHJlYzogbnVtYmVyID0gbFByZWNpb3MubGVuZ3RoO1xyXG4gICAgLy8gICAgICAgICB2YXIgaU1pdGFkOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgcmVzaWR1b1g6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgLy8gICAgICAgICB2YXIgeTogbnVtYmVyID0gK1RpcG9Qcm9tby5zcGxpdChcIlhcIilbMF0gLSAoK3gpO1xyXG4gICAgLy8gICAgICAgICB2YXIgaUR0bzogbnVtYmVyO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgcmVzaWR1b1ggPSAreC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgaU1pdGFkID0gKCt5KSAvICgraVNpemVQcmVjKTtcclxuICAgIC8vICAgICAgICAgaU1pdGFkID0gTWF0aC5jZWlsKCgraU1pdGFkKSAqICgreCkpIC0gMTtcclxuXHJcbiAgICAvLyAgICAgICAgIGxQcmVjaW9zID0gbFByZWNpb3Muc29ydCgoYSwgYikgPT4gYS5QVU5JVE5FVE8gPCBiLlBVTklUTkVUTyA/IDEgOiBhLlBVTklUTkVUTyA+IGIuUFVOSVRORVRPID8gLTEgOiAwKVxyXG5cclxuICAgIC8vICAgICAgICAgdmFyIGlYID0gMDtcclxuICAgIC8vICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGlEdG8gPSBpTWl0YWQ7XHJcbiAgICAvLyAgICAgICAgICAgICB3aGlsZSAoaUR0byA8IGlTaXplUHJlYykge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlEdG8rKztcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLy9QYXJhIGxhcyBwcm9tb2Npb24gY29tbzogMlgxLjUsIC4uLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvL0VzdGEgc29wb3J0YW5kbyBzb2xvIHBhcmE6IDJYMS41XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gKiAoK3Jlc2lkdW9YIC8gMTApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZShpWCA8IHgpe1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpWCsrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIGlYID0gMDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgICAgICAvL0NhbGN1bGFyIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgICAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgLy8gICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciA9IGxQcmVjaW9zLmZpbHRlcih4ID0+IHguSUQgPT0gZW5jLklEKS5cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBsaXN0YSBkZSBkZXRhbGxlIGVsOiAgTk9NQl9QUk9NT0MsIFZBTF9QUk9NT0MgeSBJRF9QUk9NT0NcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZ3JlZ2FyTGlzdGFQcm9tbyhlbmM6IE0zUEVuY0l0ZW1zLCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBkVmFsb3JQcm9tb0NvbWJpOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGV0Tm9tYnJlczogc3RyaW5nO1xyXG4gICAgICAgIHZhciBkZXRWYWxvcmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldElkczogc3RyaW5nO1xyXG5cclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc05hbWVzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtc1ZhbHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zSWRzOiBNM1BEZXRhbGxlSXRlbXMvLyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcyA9IGVuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIk5PTUJfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpO1xyXG5cclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtc05hbWVzKSB7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5Ob21icmVDb25jZXB0byA9IFwiTk9NQl9QUk9fQ09NQklcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscy5Ob21icmVDb25jZXB0byA9IFwiVkFMX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuTm9tYnJlQ29uY2VwdG8gPSBcIklEX1BST19DT01CSVwiXHJcblxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gXCJcIlxyXG5cclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc05hbWVzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zVmFscylcclxuICAgICAgICAgICAgZW5jLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtc0lkcylcclxuXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yICsgY29tYmkuTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgKyBjb21iaS5JZFByb21vY2lvbkNvbWJpbmFkYSArIFwiLFwiO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgKyBkVmFsb3JQcm9tb0NvbWJpLnRvU3RyaW5nKCkgKyBcIixcIjtcclxuXHJcbiAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDg8KzblxyXG4gICAgICAgIGxldCBsaXN0Tm9tYnJlID0gb00zUERldGFsbGVJdGVtc05hbWVzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0SWQgPSBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGxldCBsaXN0VmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvci5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RJZC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiTk9NQl9QUk9fQ09NQklfXCIgKyBfaSk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShlbmMuTTNERVQsIGxpc3ROb21icmVbX2ldLCBcIklEX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiVkFMX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWN0dWFsaXphck9DcmVhclBEaW5hbWljYShhcnJheURpbmFtaWNhczogQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPiwgbm9tYnJlRGluYW1pY2E6IHN0cmluZywgVmFsb3JEaW5hbWljYTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9NM1BEZXRhbGxlSXRlbXMgPSBhcnJheURpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBub21icmVEaW5hbWljYSk7XHJcbiAgICAgICAgaWYgKG9NM1BEZXRhbGxlSXRlbXMpIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gbm9tYnJlRGluYW1pY2E7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBWYWxvckRpbmFtaWNhO1xyXG4gICAgICAgICAgICBhcnJheURpbmFtaWNhcy5wdXNoKG9NM1BEZXRhbGxlSXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGEgbGlzdGEgZGUgZW5jYWJlemFkb3MsIHF1ZSBhcGxpY2FuIGEgbGEgbGlzdGEgY29tYmluYWRhIHF1ZSB0aWVuZVxyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Db21iaW5hZGEgT2JqZXRvIGRlIHByb21vY2lvbiBjb21iaWFuZGFcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBPYmpldG8gZGUgTTNQcm9jZXNvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0RW5jYWJlemFkb0J5Q29tYmkob1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgIG9MaXN0RW5jYWIgPSBpb00zUHJvY2Vzby5NM0VOQy5maWx0ZXIoZW5jID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbmMuUHJvbW9Db21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFByb21vQ29tYmluYWRhRU5DKGVuYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIShlbmMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgJiYgK2VuYy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTEyMDggc2UgY2FtYmlhIHZhbGlkYWNpb24sIHBhcmEgcXVlIHRlbmdhIGVuIGN1ZW50YSBjdWFscXVpZXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuYy5Qcm9tb0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdEVuY2FiO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFNldFByb21vQ29tYmluYWRhRU5DKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyA9IEpTT04ucGFyc2Uob00zUERldGFsbGVJdGVtcy5WYWxvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXIgbGlzdGEgZGUgcHJlY2lvcyB5IGlkIGRlIGVuY2FiZXphZG8sIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBsaXN0YSBkZSBlbmNhYmV6YWRvc1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcm9jZXNhclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLy9EZXNBY29wbGFyIGxpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgdmFyIGxQcmVjaW9zID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgbkNhbnRpZGFkOiBudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBuUHJlY2lvVW5pdDogbnVtYmVyO1xyXG4gICAgICAgICAgICBuQ2FudGlkYWQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzMwIHZhbGlkYSBzaSBsYSBwcm9tb2Npb24gZXMgYWN1bXVsYWJsZS5cclxuICAgICAgICAgICAgaWYgKGJFc0FjdW11bGFibGUpIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3JcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG5QcmVjaW9Vbml0ID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbkNhbnRpZGFkOyBqKyspIHtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zLnB1c2goeyBcIkluZGljZVwiOiBqLCBcIlBVTklUTkVUT1wiOiBuUHJlY2lvVW5pdCwgXCJJRFwiOiBlbmMuSUQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxQcmVjaW9zO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAvLyAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgLy8gICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgIC8vICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgLy8gICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAvLyAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgLy8gICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgLy8gICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgLy8gICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgLy8gfVxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0ZJTiBWMiBDT01CSU5BREFcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFByb2Nlc2FyQ29tYmluYWRhWHBvcllcclxuICAgICogUHJvY2VzYXIgcHJvbW9jaW9uIGNvbWJpbmFkYSBxdWUgc2UgbGxldmFuIHggcHJvZHVjdG9zIHBvciBlbCBwcmVjaW9uIGRlIHkgcHJvZHVjdG9zLlxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhckNvbWJpbmFkYVhwb3JZKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBtM0VuY0FncmVnYWRvOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHZhciBtM0VuY3NDb25Qcm9tbzogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIHZhciBtM0NvbWJpbmFkYXhQcm9jZXNvOiBNM1Byb21Db21iaW5hZGFYUHJvY2VzbztcclxuXHJcbiAgICAgICAgLy9WYWxpZGEgc2kgZWwgcHJvZHVjdG8gYWdyZWdhZG8sIHRpZW5lIHVuYSBtaXNtYSBwcm9tb2Npb24gYWN0aXZhIGVuIGxhIGZhY3R1cmEuXHJcbiAgICAgICAgLy8gaWYgKG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEgIT0gbnVsbCAmJiBvTTNQcm9jZXNvcy5sTTNQcm9tQ29tYmluYWRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyAgICAgbTNDb21iaW5hZGF4UHJvY2VzbyA9IG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEuZmluZChjb21iaW5hZGFzID0+IGNvbWJpbmFkYXMuSWRQcm9tb2Npb24gPT0gbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25Db21iaW5hZGEgJiYgY29tYmluYWRhcy5UZXJtaW5hZGEgPT0gZmFsc2UpO1xyXG4gICAgICAgIC8vICAgICAvL1ZhbGlkYSBzaSB5YSBleGlzdGUgdW4gcHJvY2Vzby5cclxuICAgICAgICAvLyAgICAgaWYgKG0zQ29tYmluYWRheFByb2Nlc28gIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9IG0zQ29tYmluYWRheFByb2Nlc28uSWRQcm9tb2Npb25YUHJvY2VzbztcclxuICAgICAgICAvLyAgICAgICAgIC8vVHJhZSBsb3MgRW5jYWJlemFkb3MgY29uIGxhIHByb21vY2lvbiBcclxuICAgICAgICAvLyAgICAgICAgIG0zRW5jc0NvblByb21vID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuY3MgPT4gZW5jcy5Qcm9tb0NvbWJpbmFkYXMgIT0gbnVsbCAmJiBlbmNzLlByb21vQ29tYmluYWRhcy5sZW5ndGggPiAwICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzWzBdLklkUHJvbW9jaW9uWFByb2Nlc28gPT0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvKTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByb21vWFBvclkobTNFbmNzQ29uUHJvbW8sIG0zQ29tYmluYWRheFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEgPSBuZXcgQXJyYXk8TTNQcm9tQ29tYmluYWRhWFByb2Nlc28+KCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuQWdyZWdhclByb21vY2lvbkNvbWJpbmFkYUFQcm9jZXNvKG9NM1Byb2Nlc29zLCBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL3JlY2FsY3VsYXIgcHJvbW9jaW9uLCBkZXBlbmRpZW5kbyBkZSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgZW5jYWJlemFkb3MuXHJcbiAgICAvLzEuVmFsaWRhciBzaSB5YSBlc3RhbiB0b2RvcyBsb3MgaXRlbXMgcGFyYSByZWNhbGN1bGFyIGxhIHByb21vY2lvblxyXG4gICAgLy8yLiBPcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBkZSBtYXlvciBhIG1lbm9yIHByZWNpby5cclxuICAgIC8vMy4gRGVqYXIgZWwgcHJlY2lvIGRlIGxvcyBpdGVtcyBkZSBtZW5vciBwcmVjaW9uIGVuIDBcclxuICAgIC8vIHB1YmxpYyBSZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbzogQXJyYXk8TTNQRW5jSXRlbXM+LCBtM0NvbWJpbmFkYXhQcm9jZXNvOiBNM1Byb21Db21iaW5hZGFYUHJvY2Vzbykge1xyXG4gICAgLy8gICAgIHZhciBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGE7XHJcbiAgICAvLyAgICAgdmFyIHZhcng6IG51bWJlcjtcclxuICAgIC8vICAgICB2YXIgdmFyeTogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciBwYXJ0ZURlY1k6IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb1Byb21vY2lvbkNvbWJpbmFkYSA9IG0zRW5jc0NvblByb21vWzBdLlByb21vQ29tYmluYWRhc1swXTtcclxuXHJcbiAgICAvLyAgICAgdmFyeCA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzBdKTtcclxuICAgIC8vICAgICB2YXJ5ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMV0pO1xyXG5cclxuICAgIC8vICAgICBpZiAoU3RyaW5nKHZhcnkpLmluY2x1ZGVzKFwiLlwiKSkge1xyXG4gICAgLy8gICAgICAgICBwYXJ0ZURlY1kgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXS5zcGxpdChcIi5cIilbMV0pO1xyXG4gICAgLy8gICAgICAgICB2YXJ5ID0gcGFyc2VGbG9hdChTdHJpbmcodmFyeSkuc3BsaXQoXCIuXCIpWzBdKTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGlmICh2YXJ4ID09IG0zRW5jc0NvblByb21vLmxlbmd0aCkge1xyXG4gICAgLy8gICAgICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvLlRlcm1pbmFkYSA9IHRydWU7XHJcbiAgICAvLyAgICAgICAgIC8vT3JkZW5hciBsb3MgZW5jYWJlemFkb3MgcG9yIHByZWNpbyBtYXlvciBhIG1lbm9yXHJcbiAgICAvLyAgICAgICAgIG0zRW5jc0NvblByb21vID0gbTNFbmNzQ29uUHJvbW8uc29ydCgoYSwgYikgPT5cclxuICAgIC8vICAgICAgICAgICAgIChhLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IDEgOlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICgoYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPCBhLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcikgPyAtMSA6IDApKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbTNFbmNzQ29uUHJvbW8ubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vVmFsaWRhIHNpIHlhIFxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHBhcnRlRGVjWSAhPSAwICYmICgraSkgPT0gKCt2YXJ5KSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcnRlRGVjWSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbTNFbmNzQ29uUHJvbW9baV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gKCgrbTNFbmNzQ29uUHJvbW9baV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSAqICgrKCtwYXJ0ZURlY1kpIC8gMTAwKSkudG9TdHJpbmcoKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCtpKSArIDEgPiB2YXJ5KSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbTNFbmNzQ29uUHJvbW9baV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gXCIwXCI7XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB0b3RhbCBkZSBwdW50b3MgZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRyYW5zYWNjacODwrNuIHJlZG9uZGVhZG9zIGhhY8ODwq1hIGFiYWpvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfdG90YWxfZmlkZWxpemFjaW9uKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsX2ZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0b3RhbF9maWRlbGl6YWNpb24gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkZJREVMSVpBQ0lPTlwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCgoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJGSURFTElaQUNJT05cIikuVmFsb3IpIC8gMTAwKSAqICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSksIDApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vU2UgcmVkb25kZWFyYSBubyBhY2Egc2lubyBlbiBsYSBzdW1hIHRvdGFsIGRlbCBmaWRlbGl6YWNpb24gZGUgY2FkYSBmb3JtYSBkZSBwYWdvXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGllbmUgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1biBwcm9jZXNvLCBldmFsdWFuZG8gY2FkYSBmb3JtYSBkZSBwYWdvXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF92YWx1ZV9maWRlbGl6YWNpb25fYnlfcHJvY2Vzbyhwcm9jZXNvOiBNM1Byb2Nlc29zLCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuXHJcbiAgICAgICAgdmFyIHBhZ29fdG90YWxfcHJvY2VzbzogbnVtYmVyID0gcHJvY2Vzby5WYWxvck5ldG87XHJcbiAgICAgICAgLy92YXIgbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbjogbnVtYmVyID0gdGhpcy5nZXRfdG90YWxfZmlkZWxpemFjaW9uKHByb2Nlc28pO1xyXG4gICAgICAgIHZhciByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbywgXCJQQUdPXCIsIFwiTU9ORURFUk9cIik7XHJcblxyXG4gICAgICAgIGlmIChwcm9jZXNvLmxNM1BFbmNGUCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcHJvY2Vzby5sTTNQRW5jRlAubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZm9ybWFfcGFnbzogTTNQRW5jRlAgPSBwcm9jZXNvLmxNM1BFbmNGUFtfaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbW9BcGxpY2FkYTogTTNDT05ESVBST01PO1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbGljYV9maWRlbGl6YWNpb24gPSB0aGlzLnZhbGlkYXRlX2NvbmRpX2J5X2Zvcm1hX3BhZ28oZm9ybWFfcGFnbywgbGlzdF9jb25kaV9wcm9tbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFwbGljYV9maWRlbGl6YWNpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclBhZ28gPSBmb3JtYV9wYWdvLlZhbG9yIC0gZm9ybWFfcGFnby5WYWxDYW1iaW87XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gKz0gdGhpcy5jYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvLCBwcm9jZXNvLk0zRU5DLCB2YWxvclBhZ28sIGFwbGljYV9maWRlbGl6YWNpb24sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uID4gbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbikge1xyXG4gICAgICAgIC8vICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IG1heF92YWx1ZV9maWRlbGl6YWNpb247XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMub01hdGhURi5yb3VuZChyZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiwgMik7XHJcbiAgICAgICAgcmV0dXJuIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIGRlIHRpcG8gZGUgcGFnbyBhIHBhcnRpciBkZSBBcnJheTxNM0NPTkRJUFJPTU8+XHJcbiAgICAgKiBAcGFyYW0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvIC5cclxuICAgICAqIEBwYXJhbSBsaXN0TTNFbmNJdGVtIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG86IEFycmF5PE0zQ09ORElQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPik6IEFycmF5PE0zQ09ORElQUk9NTz4ge1xyXG4gICAgICAgIGxldCByZXN0cmljY2lvbmVzQWN0aXZhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgaWYgKGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0TTNFbmNJdGVtLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpc3RNM0RldCA9IGxpc3RNM0VuY0l0ZW1bX2ldLk0zREVUO1xyXG4gICAgICAgICAgICAgICAgaWYgKCtsaXN0TTNFbmNJdGVtW19pXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tb2Npb25lcyA9IGxpc3RNM0RldC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaWRQcm9tb2Npb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRQcm9tbyA9IGlkUHJvbW9jaW9uZXMuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgaWRQcm9tby5sZW5ndGg7IF9rKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9ICtpZFByb21vW19rXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25kaVByb21vID0gbGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaVByb21vICYmICFyZXN0cmljY2lvbmVzQWN0aXZhcy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljY2lvbmVzQWN0aXZhcy5wdXNoKGNvbmRpUHJvbW8pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3RyaWNjaW9uZXNBY3RpdmFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYXMgcmVzdHJpY2Npb25lcyBBY3RpdmFzIHBhcmEgbG9zIHByb2R1Y3RvcyBkZWwgcHJvY2VzbyBhY3R1YWxcclxuICAgICAqIEBwYXJhbSBsaXN0RW5jUHJvbW8gXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXNGcm9tRW5jUHJvbW8obGlzdEVuY1Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgbGlzdE0zRW5jSXRlbTogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RFbmNQcm9tbywgXCJQQUdPXCIsIFwiUkVTVFJJQ0NJT05fUEFHT1wiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY2Npb25lc1RpcG9QYWdvQWN0aXZhcyhsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8sIGxpc3RNM0VuY0l0ZW0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIG1vdmltaWVudG9zIHJlYWxpemFkb3MgcG9yIHVuIG0zc2FsZG9zeGN1ZW50YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL3ZhciBkYXRhID0geyBcImlkX20zXCI6IGlkbTMsIFwiaWRfcHJvY2Vzb1wiOiBwcm9jZXNvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvbTNfZ2V0X21vdmltaWVudG9zX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBtb3ZzID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB2YXIgcmVzcF9tb3ZzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiAoIW1vdnMuTU9WUy5NT1YubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzLnB1c2gobW92cy5NT1ZTLk1PVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwX21vdnMgPSBtb3ZzLk1PVlMuTU9WO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcF9tb3ZzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgbGEgZm9ybWEgZGUgcGFnbyBjdW1wbGUgYWxndW5hIGNvbmRpY2lvbiBkZSBmaWRlbGl6YWNpb25cclxuICAgICAqIEBwYXJhbSBmb3JtYV9wYWdvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfY29uZGlfcHJvbW86IGxpc3RhZG8gZGUgY29uZGljaW9uZXMgZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9jb25kaV9ieV9mb3JtYV9wYWdvKGZvcm1hX3BhZ286IE0zUEVuY0ZQLCBsaXN0X2NvbmRpX3Byb21vOiBBcnJheTxNM0NPTkRJUFJPTU8+KSB7XHJcbiAgICAgICAgLy9yZXR1cm4gbGlzdF9jb25kaV9wcm9tb1swXTtcclxuICAgICAgICBsZXQgcHJvbW9zQXBsaWNhZGFzID0gbmV3IEFycmF5PE0zQ09ORElQUk9NTz4oKTtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdF9jb25kaV9wcm9tby5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbmRpX3Byb21vID0gbGlzdF9jb25kaV9wcm9tb1tfaV07XHJcbiAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbmRpX3Byb21vLkNvbmNlcHRvLnRyaW0oKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIklEX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVsIG9wZXJhZG9yIGVzIERJRkYgY3JlYSB1bmEgZXhwcmVzaW9uIHJlZ3VsYSBwYXJhIGV4Y2x1aXIgbG8gdGlwb2RlcGFnbyBjb25maWd1cmFkb3NcclxuICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYSAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIkRJRkZcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaV9wcm9tby5WYWxvciA9IFwiXig/IShcIiArIGNvbmRpX3Byb21vLlZhbG9yICsgXCIpXFxcXGIpXFxcXHcrJFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKSRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChjb25kaV9wcm9tby5WYWxvciwgXCJpXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS50ZXN0KGZvcm1hX3BhZ28uSWRUaXBvUGFnby50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3NBcGxpY2FkYXMucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9tb3NBcGxpY2FkYXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGxpc3RhZG8gZGUgY29uZGljaW9uZXMgdmFsaWRhcyBwYXJhIHVuYSBhY3RpdmlkYWQgZGFkYVxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPiwgYWN0aXZpZGFkOiBzdHJpbmcsIHRpcG8yOiBzdHJpbmcpOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPiA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGlzdF9lbmNfcHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5jYWJlemFkb1Byb21vID0gbGlzdF9lbmNfcHJvbW9bX2tdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRWaWdlbmNpYSA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5WaWdlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgZEluaWNpbyA9IG5ldyBEYXRlKGVuY2FiZXphZG9Qcm9tby5JbmljaW8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc3RhZG8gJiYgZFZpZ2VuY2lhID49IGhveSAmJiBkSW5pY2lvIDw9IGhveSAmJiBlbmNhYmV6YWRvUHJvbW8uVGlwbzIgPT0gdGlwbzIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgZW5jYWJlemFkb1Byb21vLk0zQ09ORElBR1JVUEFDSU9OLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfYWdydXBhY2lvbiA9IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTltfaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfaiA9IDA7IF9qIDwgY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU8ubGVuZ3RoOyBfaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlfcHJvbW8gPSBjb25kaV9hZ3J1cGFjaW9uLk0zQ09ORElQUk9NT1tfal07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGlfcHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEICYmIGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBhY3RpdmlkYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9jb25kaV9wcm9tby5wdXNoKGNvbmRpX3Byb21vKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsaXN0X2NvbmRpX3Byb21vO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuYSBmb3JtYSBkZSBwYWdvIGRlIGFjdWVyZG8gYSBzdSBwb3JjZW50YWplIHJlc3BlY3RvIGVsIHZhbG9yIHRvdGFsIGRlbCBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcGFnb190b3RhbF9wcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIG1heF92YWx1ZV9maWRlbGl6YWNpb24gXHJcbiAgICAgKiBAcGFyYW0gdmFsdWVfZm9ybWFfcGFnbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc286IG51bWJlciwgbGlzdE0zRW5jOiBNM1BFbmNJdGVtc1tdLCB2YWx1ZV9mb3JtYV9wYWdvOiBudW1iZXIsIHByb21vc0FwbGljYWRhOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pIHtcclxuICAgICAgICBsZXQgbGlzdFByb21vc0FwbGljYWRhcztcclxuICAgICAgICBsZXQgZGV0YWxsZUlkUHJvbW9jO1xyXG4gICAgICAgIGxldCB2YWxvckZpZGVsaXphY2lvbiA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRfZm9ybWFfcGFnbzogbnVtYmVyID0gdmFsdWVfZm9ybWFfcGFnbyAvIHBhZ29fdG90YWxfcHJvY2VzbztcclxuICAgICAgICB2YXIgcHJlY2lvUHJvZHVjdG8gPSAwO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0TTNFbmMpIHtcclxuICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkZXRhbGxlSWRQcm9tb2MgPSBpdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPTU9DXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Qcm9kdWN0byA9ICtpdGVtLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZUlkUHJvbW9jICYmIGRldGFsbGVJZFByb21vYy5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgbGlzdFByb21vc0FwbGljYWRhcyA9IGRldGFsbGVJZFByb21vYy5WYWxvci5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9tb0FwbCBvZiBwcm9tb3NBcGxpY2FkYSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RQcm9tb3NBcGxpY2FkYXMuZmluZCh4ID0+ICt4ID09IHByb21vQXBsLklkUHJvbW9jaW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tbyA9IGxpc3RfZW5jX3Byb21vLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IHByb21vQXBsLklkUHJvbW9jaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckZpZGVsaXphY2lvbiArPSAocHJlY2lvUHJvZHVjdG8gKiB0aGlzLmdldFBvcmNlbnRhamVGaWRlbGl6YWNpb25Gcm9tRW5jUHJvbW8ocHJvbW8pIC8gMTAwKSAqIChwZXJjZW50X2Zvcm1hX3BhZ28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvckZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UocHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09UICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYSB1bmEgZGluYW1pY2EgY29uIGVsIHZhbG9yIGRlIGxhIGZpZGVsaXphY2nDg8KzbiBkZSBkaWNobyBwcm9jZXNvIHkgcmV0b3JuYSBkaWNobyBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZF9kaW5hbWljYV9maWRlbGl6YWNpb25fdG9fcHJvY2Vzbyhwcm9jZXNvOiBNM1Byb2Nlc29zLCBsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4pOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICB2YXIgdmFsdWVfZmlkZWxpemFjaW9uID0gMFxyXG4gICAgICAgIGlmIChsaXN0X2VuY19wcm9tbykge1xyXG4gICAgICAgICAgICB2YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLmdldF92YWx1ZV9maWRlbGl6YWNpb25fYnlfcHJvY2Vzbyhwcm9jZXNvLCBsaXN0X2VuY19wcm9tbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWVfZmlkZWxpemFjaW9uID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgZGluYW1pY2FfZmlkZWxpemFjaW9uOiBNM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIGRpbmFtaWNhX2ZpZGVsaXphY2lvbi5Ob21icmUgPSBcIkZJREVMSVpBQ0lPTlwiXHJcbiAgICAgICAgICAgIGRpbmFtaWNhX2ZpZGVsaXphY2lvbi5WYWxvciA9IHZhbHVlX2ZpZGVsaXphY2lvbi50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAgICAgcHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2goZGluYW1pY2FfZmlkZWxpemFjaW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxhIGV4aXN0ZW5jaWEgZGUgdW4gZG9jdW1lbnRvIGRlIGZpZGVsaXphY2lvbiBlbiBsYSB0YWJsYSBNM1NhbGRvc1hDdWVudGFcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRvY3VtZW50byBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL3ZhbGlkYXRlX2RvY19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgc2FsZG9feF9jdWVudGE7XHJcbiAgICAgICAgICAgIHNhbGRvX3hfY3VlbnRhID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpLlJFU1BVRVNUQS5NM1NhbGRvc1hDdWVudGE7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhzYWxkb194X2N1ZW50YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphIGVsIHNhbGRvIHN1bWFuZG9sZSBlbCB2YWxvciBlbnZpYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vZGF0YSA9IHtcImRvY3VtZW50b1wiOmRvY3VtZW50bywgXCJ2YWxvcl9tb3ZpbWllbnRvXCI6dmFsb3JfbW92aWVudG8sIFwicGFnb1wiOnBhZ28gfVxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvYWN0dWFsaXphcl9zYWxkb19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBkYXRhLnBhZ28uaWREaWFyaW8gPSByZXNwW1wiX2JvZHlcIl0ucmVwbGFjZSgnXCInLCAnJykucmVwbGFjZSgnXCInLCAnJyk7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhkYXRhLnBhZ28pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmEgVW4gYm9ubyBkZSBkZXZvbHVjaW9uIHBvciBlbCB2YWxvciBkYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhID0ge1wicHJvY2Vzb1wiLHByb2Nlc28sXCJ2YWxvclwiOnZhbG9yfVxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19nZW5lcmFyX2Jvbm9fZGV2b2x1Y2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL20zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhIHVuIG51ZXZvIHJlZ2lzdHJvIGVuIGxhIHRhYmxhIFNhbGRvWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbTNJbnNlcnRTYWxkb1hDdWVudGEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL3ZhciBkYXRhID0geyAnRG9jdW1lbnRvJzogdGhpcy5kb2N1bWVudG8sICdURG9jVGl0dWxhcic6ICc1JywgJ05Eb2NUaXR1bGFyJzogdGhpcy5uZG9jX2NsaWVudGUsICdOb21DdWVudGEnOiAnRklERUxJWkFDSU9OJywgJ1ZhbEN1ZW50YSc6IDAgfVxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNJbnNlcnRTYWxkb1hDdWVudGEvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbChNM0VOQzogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgaWYgKE0zRU5DKSB7XHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWQgPSBNM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApO1xyXG4gICAgICAgICAgICBpZiAoZENhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRDYW50aWRhZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaENvbmZpZ0xQU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiQ29uZmlnTFBfXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8vIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLnN5bmNDb3VjaCgpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLyB2YWxpZGFyUGFxdWV0ZXMoKSB7XHJcbiAgICAvLyAgICAgaWYgKHRoaXMuYXBsUGFxdWV0ZXMpIHtcclxuICAgIC8vICAgICAgICAgbGV0IHViaWNhY2lvbiA9IHRoaXMuZ2V0VWJpY2FjaW9uKCk7XHJcbiAgICAvLyAgICAgICAgIGlmICh1YmljYWNpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzYVwiICsgdWJpY2FjaW9uICsgXCJfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGVsc2Uge1xyXG4gICAgLy8gICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHN5bmNDb3VjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaWRrYXRpb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJjb25maWdscF9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFViaWNhY2lvbigpIHtcclxuICAgICAgICBsZXQgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICBsZXQgb1NVYmljYWNpb247XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uSURVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU1ViaWNhY2lvbi5JRFViaWNhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgLy8gcHVibGljIEdldEthdGlvc00zRnJvbVNlc3Npb24oKSB7XHJcbiAgICAvLyAgICAgdmFyIEthdGlvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuaWRrYXRpb3MudG9VcHBlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgaWYgKEthdGlvcyAhPT0gdW5kZWZpbmVkICYmIEthdGlvcyAhPSBudWxsKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBqS2F0aW9zTTMgPSBKU09OLnBhcnNlKEthdGlvcyk7XHJcbiAgICAvLyAgICAgICAgIGlmIChqS2F0aW9zTTMgJiYgakthdGlvc00zLkthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3NNMy5hcGxQYXFzKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmFwbFBhcXVldGVzID0gakthdGlvc00zLkthdGlvc00zLmFwbFBhcXNcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveShpZGthdGlvcykge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXBsU3luY0NvdWNoQXV0byA9IHRoaXMuZ2V0RmxhZ1N5bmNDb3VjaCgpO1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdGhpcy5hcGxTeW5jQ291Y2hBdXRvLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIENPTkZJR0xQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuaW5mbygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlTHAoaWQpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCB7IENvdWNoQ29uZmlnTFBTZXJ2aWNlIH0gZnJvbSBcIi4uL09mZmxpbmUvY291Y2gtY29uZmlnbHAuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tIFwiLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8ge1xyXG4gICAgcHJpdmF0ZSBvTWF0aFRGID0gbmV3IE1hdGhURigpO1xyXG4gICAgcHJpdmF0ZSBnc2lka2F0aW9zOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGFwbFByZWNpb3NEaW5hbWljb3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZGthdGlvcykge1xyXG4gICAgICAgIHRoaXMuZ3NpZGthdGlvcyA9IGlka2F0aW9zO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIGxldCBLYXRpb3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0thdGlvc1wiICsgdGhpcy5nc2lka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3MgJiYgakthdGlvc00zLkthdGlvcy5LYXRpb3NNMykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFwbCA9IGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMuZmluZCh4ID0+IHguTGxhdmUudG9VcHBlckNhc2UoKSA9PSBcIkFQTExQRElOQU1JQ09TXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFwbCAmJiBhcGwuVmFsb3IgPT0gXCIxXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwbFByZWNpb3NEaW5hbWljb3MgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL0FzaWduYXIgbGlzdGEgZGUgcHJlY2lvcywgc2VndW4gbGlzdGEgZGUgcHJlY2lvcyBhc29jaWFkbyBhIHVzdWFyaW8gcG9yIGNhZGEgdWpubyBkZSAgbG9zIHByb2R1Y3RvcyBoaWpvc1xyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb00zUGFjayhQcm9kdWN0b01hZXN0cm86IFR5cGVNM1ByZEdycCwgb0RhdGFVc2VyOiBhbnksIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zKSB7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUHJkR3JwQXNvY2lhZG8gb2YgUHJvZHVjdG9NYWVzdHJvLk0zUHJkR3JwQXNvY2lhZG8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW8ob00zUHJkR3JwQXNvY2lhZG8uTTNHUlAsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByZEdlbmVyYWwgb2YgUHJvZHVjdG9NYWVzdHJvLkxvTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbTNQYWNrIG9mIHByZEdlbmVyYWwuTTNQQUNLKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkFzaWduYXJMaXN0YVByZWNpbyhtM1BhY2suTTNHUlAsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vQXNpZ25hciBsaXN0YSBkZSBwcmVjaW9zLCBzZWd1biBsaXN0YSBkZSBwcmVjaW9zIGFzb2NpYWRvIGEgdXN1YXJpby5cclxuICAgIHB1YmxpYyBhc3luYyBBc2lnbmFyTGlzdGFQcmVjaW8oUHJvZHVjdG9NYWVzdHJvOiBUeXBlTTNQcmRHcnAsIG9EYXRhVXNlcjogYW55LCBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmIChvRGF0YVVzZXIgIT0gbnVsbCAmJiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9kdWN0b01hZXN0cm8uTG9NM1ByZEdlbmVyYWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcmRHcmwgPSBQcm9kdWN0b01hZXN0cm8uTG9NM1ByZEdlbmVyYWxbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBvTGlzdGFGaW5kZWQgPSBwcmRHcmwuTG9NM0xpc3RhUHJlY2lvLmZpbmQobFByZSA9PiBsUHJlLklETElTVEEgPT0gc3BsaXRQcmVjaW9bMF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBsUHJlY2lvc0RpbmFtaWNvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0UHJlY2lvWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTEJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MaXN0YUZpbmRlZC5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9Db3VjaENvbmZpZ0xQU2VydmljZSA9IG5ldyBDb3VjaENvbmZpZ0xQU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RhQ291Y2ggPSBhd2FpdCBvQ291Y2hDb25maWdMUFNlcnZpY2UuZ2V0KHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpDb25maWdMUCA9IEpTT04ucGFyc2UobGlzdGFDb3VjaC5KQ29uZmlndXJhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakNvbmZpZ0xQICYmIGpDb25maWdMUC5GYWN0b3JlcyAmJiBqQ29uZmlnTFAuRmFjdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmYWN0b3IgPSBwYXJzZUZsb2F0KGpDb25maWdMUC5GYWN0b3Jlcy5maW5kKHggPT4geC5Ob21icmUgPT0gc3BsaXRQcmVjaW9bMV0pLkZhY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IHRoaXMub01hdGhURi5yb3VuZChvTGlzdGFGaW5kZWQuUFJFQ0lPICogZmFjdG9yLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKHByZXNlbnRhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhY2lvbi5WQUxPUiA9IHRoaXMub01hdGhURi5yb3VuZChwcmVzZW50YWNpb24uVkFMT1IgKiBmYWN0b3IsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGVuIGFzaWduYXJsaXN0YXByZWNpbzogXCIgKyBFeC5tZXNzYWdlICsgXCIgLSBcIiArIHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTGlzdGFGaW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZEdybC5Mb00zUHJkTGlzdGEgPSBvTGlzdGFGaW5kZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuVmFsaWRhckRhdGFGcm9tSW52ZW50YXJpbyhwcmRHcmwsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBNM1ByZEFkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgICAgIG9NM1ByZEFkaWNpb25hbGVzLkFUUklCVVRPID0gXCJMSVNUQVBSRUNJT1wiO1xyXG4gICAgICAgICAgICBvTTNQcmRBZGljaW9uYWxlcy5WQUxPUiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW87XHJcbiAgICAgICAgICAgIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkQWRpY2lvbmFsZXMucHVzaChvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChQcm9kdWN0b01hZXN0cm8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb0FHZW5lcmFsKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvKTtcclxuICAgICAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb0xpc3RhRmluZGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5WYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybCwgb0RhdGFVc2VyLCBvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB2YXIgc0xpc3RhOiBzdHJpbmcgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vVmFsaWRhciBzaSBlcyB1biB2YWxvciBkZSBpbnZlbnRhcmlvLlxyXG4gICAgICAgIGlmIChzTGlzdGEuc3BsaXQoJ18nKVswXSA9PSBcIklOVlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBqRGF0YTogYW55ID0geyBcInViaWNhY2lvblwiOiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcInNrdVwiOiBwcmRHcmwuU0tVLCBcImxvdGVcIjogcHJkR3JsLkxPVEUsIFwiY29uY2VwdG9cIjogc0xpc3RhLnNwbGl0KCdfJylbMV0gfTtcclxuICAgICAgICAgICAgdmFyIHByZWNpbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UuR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihvUG9zdFNlcnZpY2VNMywgdGhpcy5nc2lka2F0aW9zLCBqRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwcmVjaW8gJiYgcHJlY2lvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmRMaXN0YS5JRExJU1RBID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLkxPVEUgPSBwcmRHcmwuTE9URTtcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlBSRUNJTyA9IHByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlNLVSA9IHByZEdybC5TS1U7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb00zUHJkTGlzdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IHNlc3Npb25XRTggfSBmcm9tIFwiLi4vLi4vLi4vU2Vzc2lvbi9zZXNzaW9uLmNsYXNzXCI7XHJcbmltcG9ydCB7IEZpbHRyb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9maWx0cm9zXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyDDicK1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNNYWVzdHJvIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NQb3JDcmVkaXRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRNM1Byb2Nlc29zUG9yQ3JlZGl0by8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb0J5SWRQcmVzdGFtbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkUHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcmVzdGFtbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG4gICAgLy9yYWUgZWwgVElQTywgU0tQMSwgTk9NQlJFIGRlIGxhIHRhYmxhIHByZGdycFxyXG4gICAgcHVibGljIG0zR2V0UFJER1JQKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0TTNQUkRHUlAvJyArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgY2FudGlkYWQgZGlzcG9uaWJsZSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIFNLUDEgeSBsYSB1YmljYWNpw4PCs24uXHJcbiAgICAvL0xhIGRhdGEgZGViZSB0ZW5lciB1bmEgZXN0cnVjdHVyYToge1wiVUJJQ0FDSU9OXCI6XCIxMTExXCIsIFwiU0tQMVwiOlwiOTk5OWFcIn1cclxuICAgIHB1YmxpYyBNM0dldENhbnRpZGFkQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXRDYW50aWRhZEJ5U0tQMS8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIGdvRGF0YURpc3A6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmIChvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vTm8gZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIGdvRGF0YURpc3AgPSBuZXcgQXJyYXk8YW55PihvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ29EYXRhRGlzcCA9IG9EYXRhLlJFU1BVRVNUQS5ESVNQT05JQklMSURBRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnb0RhdGFEaXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhnb0RhdGFEaXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBHZXRMaXN0YVByZFhGaWx0cm9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9sRmlsdHJvczogQXJyYXk8RmlsdHJvcz4sIHNJRExpc3RhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGlkVWJpY2FjaW9uID0gXCItMVwiLCBAT3B0aW9uYWwoKSBhcGxVbHRpbW9GaWx0cm8gPSB0cnVlLCBAT3B0aW9uYWwoKSB0b3BMaW1pdCA9IFwiMFwiLCBAT3B0aW9uYWwoKSBmaWx0cmFySW52VWJpYyA9IFwiMFwiKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwiRmlsdHJvc1wiOiBKU09OLnN0cmluZ2lmeShvbEZpbHRyb3MpLCBcIklkTGlzdGFcIjogc0lETGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiYXBsVWx0aW1vRmlsdHJvXCI6IGFwbFVsdGltb0ZpbHRybywgXCJ0b3BMaW1pdFwiOiB0b3BMaW1pdCwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIGlmIChvbEZpbHRyb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTGlzdFBSREZpbHRyb3MvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwLCBvbEZpbHRyb3MpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihcIk5vIGhheSBmaWx0cm9zIHBhcmEgbGEgYnVzcXVlZGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0NhdGVnb3JpYTogc3RyaW5nLCBvRGF0YUNsYXNpZmljYWNpb24sIElkTGlzdGE6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgQE9wdGlvbmFsKCkgaWRVYmljYWNpb24gPSBcIi0xXCIsIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG4gICAgICAgIHZhciBvbEZpbHRyb3M6IEFycmF5PEZpbHRyb3M+O1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb2xGaWx0cm9zID0gdGhpcy5GaW5kRmlsdGVySW5DbGFzaWZpY2FjaW9uKHNDYXRlZ29yaWEsIHNJREthdGlvcywgb0RhdGFDbGFzaWZpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcIkZpbHRyb3NcIjogSlNPTi5zdHJpbmdpZnkob2xGaWx0cm9zKSwgXCJJZExpc3RhXCI6IElkTGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiZmlsdHJhckludlViaWNcIjogZmlsdHJhckludlViaWMgfTtcclxuICAgICAgICBpZiAob2xGaWx0cm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vR2V0X0xpc3RQUkRGaWx0cm9zLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgb2xGaWx0cm9zKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiTm8gaGF5IGZpbHRyb3MgcGFyYSBsYSBidXNxdWVkYVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfS8vRW5kIEdldExpc3RhUHJkWENhdGVnb3JpYVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWFXaXRoT3V0RmlsdGVycyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzQ2F0ZWdvcmlhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlDbGFzaWZpY2FjaW9uLycgKyBzSURLYXRpb3MgKyAnLycgKyBzQ2F0ZWdvcmlhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0TGlzdGFQcmRYQ2F0ZWdvcmlhXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBlbCBub21icmUgbyBkZXNjcmlwY2nDg8Kzbi5cclxuICAgIEdldExpc3RhUHJkWE5vbWJyZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FyZ2FyTGlzdFByZEJ5R2VuZXJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2Nhcmdhckxpc3RQcmRCeUdlbmVyaWMvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2FyZ2FyIGluZm9ybWFjaW9uIGRlIGNsYXNpZmljYWNpb25cclxuICAgIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqc29uUmVzcCxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vdmFyIG9zZXNzaW9uV0U4ID0gbmV3IHNlc3Npb25XRTgoKTtcclxuXHJcbiAgICAgICAgLy9qc29uUmVzcCA9IG9zZXNzaW9uV0U4LkdldERhdGFDTEFTSUZJQ0FDSU9OKHNJREthdGlvcyk7XHJcbiAgICAgICAgaWYgKGpzb25SZXNwID09PSB1bmRlZmluZWQgfHwganNvblJlc3AgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL00zR2V0Q2xhc2lmaWNhY2lvbi9cIiArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAganNvblJlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQXJyYXlDbGFzaWZpY2FjaW9uKGpzb25SZXNwKTtcclxuICAgICAgICAgICAgICAgIC8vb3Nlc3Npb25XRTguU2V0RGF0YUNMQVNJRklDQUNJT04oanNvblJlc3AsIHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfS8vRW5kIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uXHJcblxyXG4gICAgLy9WYWxpZGFyIHF1ZSBsYSBjbGFzaWZpY2FjaW9uLCBlc3RlbiBjb21vIGFycmF5LlxyXG4gICAgVmFsaWRhckFycmF5Q2xhc2lmaWNhY2lvbihvRGF0YUNsYXMpIHtcclxuICAgICAgICB0aGlzLlJlY3Vyc2l2ZUNvbnZlcnRBcnJheShvRGF0YUNsYXMuUkVTUFVFU1RBLkNMQVNJRklDQUNJT05FUyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQXBsaWNhciBmaWx0cm9zIGEgbGEgY2F0ZWdvcmlhIGVudHJhbnRlLlxyXG4gICAgRmluZEZpbHRlckluQ2xhc2lmaWNhY2lvbihzQ2xhc0ZpbmQ6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhQ2xhc2lmaWNhY2lvbikge1xyXG4gICAgICAgIHZhciBzQ2xhc2lmaWNhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgb0RhdGFGaWx0cmFkYTtcclxuICAgICAgICAvL3ZhciBvc2Vzc2lvbldFOCA9IG5ldyBzZXNzaW9uV0U4KCk7XHJcbiAgICAgICAgdmFyIG9sRmlsdHJvcyA9IG5ldyBBcnJheTxGaWx0cm9zPigpO1xyXG4gICAgICAgIHZhciBvRmlsdHJvczogRmlsdHJvcztcclxuICAgICAgICB2YXIgZmlsdHJvQXRyaWJ1dG86IHN0cmluZztcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzQ2xhc0ZpbmQpO1xyXG4gICAgICAgIC8vb0RhdGFDbGFzaWZpY2FjaW9uID0gb3Nlc3Npb25XRTguR2V0RGF0YUNMQVNJRklDQUNJT04oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgb0RhdGFGaWx0cmFkYSA9IG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTO1xyXG5cclxuICAgICAgICBpZiAoc0NsYXNGaW5kLmxlbmd0aCAlIDMgPT0gMCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoc0NsYXNGaW5kICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBzQ2xhc2lmaWNhY2lvbiA9IHNDbGFzaWZpY2FjaW9uICsgc0NsYXNGaW5kLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICAgICAgICAgIHNDbGFzRmluZCA9IHNDbGFzRmluZC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgICAgICBvRGF0YUZpbHRyYWRhID0gb0RhdGFGaWx0cmFkYS5DQVRFR09SSUEuZmluZChmaWx0cm8gPT4gZmlsdHJvLkNMQVNJRklDQUNJT04udG9TdHJpbmcoKSA9PSBzQ2xhc2lmaWNhY2lvbi50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0cm9BdHJpYnV0byA9IG9EYXRhRmlsdHJhZGEuQVRSSUJVVE87XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRyb0F0cmlidXRvLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJST09UXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0ZpbHRyb3MgPSBuZXcgRmlsdHJvcyhvRGF0YUZpbHRyYWRhLkFUUklCVVRPLCBvRGF0YUZpbHRyYWRhLkRlc2NyaXBjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvbEZpbHRyb3MucHVzaChvRmlsdHJvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vb0RhdGFSZXNwQ2xhID0gdGhpcy5SZWN1cnNpdmVDbGFzaWZpY2FjaW9uKG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTLkNBVEVHT1JJQSwgc0NsYXNGaW5kKTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFSZXNwQ2xhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2xGaWx0cm9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjdXJzaXZpZGFkLCBwYXJhIHZhbGlkYXIgcXVlIHRvZG9zIGxvcyBub2Rvcywgc2VhbiB0aXBvIGFycmF5XHJcbiAgICBSZWN1cnNpdmVDb252ZXJ0QXJyYXkob0RhdGFDbGFzKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhQ2xhcy5DQVRFR09SSUEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob0RhdGFDbGFzLkNBVEVHT1JJQS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQSA9IG5ldyBBcnJheShvRGF0YUNsYXMuQ0FURUdPUklBKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KG9EYXRhQ2xhcy5DQVRFR09SSUFbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQS5mb3JFYWNoKGNsYXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KGNsYXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYSB1biBwcm9kdWN0b1xyXG4gICAgbTNBZGRQcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgdGRvY1VBY3Rpdm86IHN0cmluZywgbmRvY1VBY3Rpdm86IHN0cmluZywgb00zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIGRpc2FibGVkV2ViOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBkYXRhID0geyAnc1Rkb2NVc3VhcmlvJzogdGRvY1VBY3Rpdm8sICdzTmRvY1VzdWFyaW8nOiBuZG9jVUFjdGl2bywgJ29NM1ByZEdycCc6IG9NM1ByZEdycCwgJ2Rpc2FibGVkV2ViJzogZGlzYWJsZWRXZWIgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vYWRkUHJvZHVjdG8vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gcG9yIFNLUDEuXHJcbiAgICBNM0dldFByb2R1Y3RvQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vTTNHZXRQcm9kdWN0b0J5U0tQMS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHJhbmRvbSBwb3IgU0tQMS5cclxuICAgIE0zR2V0UHJvZHVjdG9SYW5kb21CeVNLUDEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9NM0dldFByb2R1Y3RvUmFuZG9tQnlTS1AxL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBwb3IgU0tQMS5cclxuICAgIE0zR2V0Q2F0QXNvY2lhZGFzQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBza3AxOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoXCJNM01hZXN0cm8vTTNHZXRDYXRBc29jaWFkYXNCeVNLUDEvXCIgKyBzSURLYXRpb3MgKyAnLycgKyBza3AxKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vR2V0IEltYWdlbmVzIGVudmlhbmRvIGVuIGxhIG9EYXRhOiB7XCJQYXRoXCI6XCJ4eHhcIiwgXCJTS1VcIjpcIlNLVXh4eFwifVxyXG4gICAgcHVibGljIE0zR2V0SW1hZ2VuZXNCeVBhdGgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTTNNdWx0aW1lZGlhQnlQYXRoLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9vYnRlbmVyIGluZm9ybWFjaW9uIGRlIHBsYW50aWxsYXMsIGRlc2RlIHNlcnZpZG9yLi4uIFxyXG4gICAgR2V0X00zU0tQbGFudGlsbGFCeVNLVUlEKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBTS1VJRDogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL0dldF9NM1NLUGxhbnRpbGxhQnlTS1VJRC9cIiArIHNJREthdGlvcyArIFwiL1wiICsgU0tVSUQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcHJvZHVjdG9zLCBkZXNkZSBjb2RpZ28gZGUgYmFycmFzXHJcbiAgICBHZXRJbmZvQnlGaWx0ZXJDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzRmlsdGVyQ29kZTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiRklMVEVSQ09ERVwiOiBzRmlsdGVyQ29kZSB9O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFNLUDFQcmRzQnlGaWx0ZXJzQ29kZS8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0SW5mb0J5RmlsdGVyQ29kZSBcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9NM1ViaWNhY2lvbmVzLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zVWJpY2FjaW9uZXNcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXNDb21wbGV0YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uOiBzdHJpbmcsIHNJZEh1Yjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zV2l0aFRpbWVPdXQoJ00zTWFlc3Ryby9nZXRfTTNVYmljYWNpb25lc0NvbXBsZXRhLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24gKyAnLycgKyBzSWRIdWIsIDEwMDAwKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9NM1ViaWNhY2lvbmVzQ29tcGxldGFcclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIHB1YmxpYyBNM0dldFByb2R1Y3RvQnlTS1UoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhQb3N0U2VydmljZU0zKTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFByb2R1Y3RvQnlTS1UvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIGFzeW5jIE0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzU0tVOiBzdHJpbmcsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIFViaWNhY2lvbjogc3RyaW5nID0gXCItMVwiLCBzQXBsRXhjOiBzdHJpbmcgPSBcIjFcIikge1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGRhdGEgPSB7ICdTS1UnOiBzU0tVLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb24gPT0gXCItMVwiID8gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiA6IFViaWNhY2lvbiwgJ0FwbEV4Yyc6IHNBcGxFeGMgfTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuXHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0UHJvZHVjdG9CeVNLVS8nICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocmVzcCwgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIGVzcGVjZmljbyB0ZW5pZW5kbyBlbiBjdWVudGEgY29kaWdvLlxyXG4gICAgYXN5bmMgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1RyYWUgbG9zIHJlZ2lzdHJvcyBxdWUgc2UgZW5jdWVudHJlbiBlbiBNM1Byb2Nlc29zIHF1ZSBzZSBlbmN1ZW50cmVuIGNvbiBlc3RhZG9nZW5lcmFsIHByb2Nlc29cclxuICAgIE0zZ2V0UmVnaXN0cm9zRW5Qcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRfUmVnaXN0cm9zRW5Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JTb2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRpZW5lIGVsIHRvcCAyMCBkZSBwcm9kdWN0b3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIGdldF9NM1ByZEdycEJ5Tm9tYnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzTm9tYnJlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X00zUHJkR3JwQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLk0zR1JQO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zUHJkR3JwQnlOb21icmVcclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIHB1YmxpYyBHZXRNM1ByZEFncnVwYWRvQnlOb21icmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNOb21icmU6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfbTNfcHJkX2J5X25vbWJyZV9hZ3J1cGFkby8nICsgc0lES2F0aW9zICsgJy8nICsgc05vbWJyZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuTTNHUlA7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG8geSBxdWUgbm8gZXN0ZW4gZXhsY3VpZG9zIChNM0V4Y1ByZFhVYmljKVxyXG4gICAgcHVibGljIGdldF9tM19wcmRfYnlfbm9tYnJlX2FncnVwYWRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2RhdGEgPSB7bm9tYnJlOidhc2Rhc2QnLCBpZFViaWNhY2lvbjonMSd9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X20zX3ByZF9ieV9ub21icmVfYWdydXBhZG8vJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQS5NM0dSUDtcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL09idGllbmUgZWwgcGF0aCBiYXNlIGRvbmRlIHNlIGVuY3VlbnRyYSBhbG9qYWRhcyBsYXMgaW1hZ2VuZXMgZW4gZWwgc2Vydmlkb3JcclxuICAgIHB1YmxpYyBnZXRfUGF0aFNlcnZpZG9ySW1hZ2VuZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzLycgKyBzSURLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3ApXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzXHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBlc3BlY2ZpY28gdGVuaWVuZG8gZW4gY3VlbnRhIGNvZGlnby5cclxuICAgIEdldF9NM1Byb2R1Y3RvRXNwZWNCeUNvZGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9HZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvUHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhvUHJvZHVjdG8sIG9EYXRhVXNlciwgUG9zdFNlcnZpY2VNMykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlVGltZU91dChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgaWYgKHRpbWVvdXRUaW1lICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykgZGF0YS5mZWNoYUxQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW87XHJcbiAgICAgICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSwgdGltZW91dFRpbWUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRfRG9jc0Zyb21Db3VjaE1hZXN0cm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybywgc0lkS2F0aW9zOiBzdHJpbmcsIHNEb2M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0X0RvY3NGcm9tQ291Y2hNYWVzdHJvXCIpXHJcbiAgICAgICAgdmFyIHNJZEtleURvYyA9IG9NM0NvdWNoTWFlc3Ryby5HZXRLZXlEb2N1bWVudG9EQihzSWRLYXRpb3MsIHNEb2MpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNJZEtleURvYylcclxuICAgICAgICBvTTNDb3VjaE1hZXN0cm8uR2V0RGF0YVBvdWNoQkQoc0lkS2V5RG9jKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzdWx0KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRQcm9kdWN0b0VzcGVjQnlDb2RlRnJvbUNvdWNoKGpQcm9kdWN0c0NvdWNoOiBhbnksIHNDb2RlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGpQcm9kdWN0c0ZpbCA9IGpQcm9kdWN0c0NvdWNoLmZpbmQoeCA9PiB4LkxvTTNQcmRHZW5lcmFsICE9IHVuZGVmaW5lZCAmJiB4LkxvTTNQcmRHZW5lcmFsLmZpbmQodyA9PiB3Lk0zQ29kcyAhPSB1bmRlZmluZWQgJiYgdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpICE9IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RfY2xvbmUgPSBfLmNsb25lRGVlcChqUHJvZHVjdHNGaWwpO1xyXG5cclxuICAgICAgICBpZiAoalByb2R1Y3RzRmlsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YXIgalByZEVzcCA9IGpQcm9kdWN0c0ZpbC5Mb00zUHJkR2VuZXJhbC5maW5kKHcgPT4gdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHByb2R1Y3RfY2xvbmUuTG9NM1ByZEdlbmVyYWwgPSBbXTtcclxuICAgICAgICAgICAgcHJvZHVjdF9jbG9uZS5Mb00zUHJkR2VuZXJhbC5wdXNoKGpQcmRFc3ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInByb2R1Y3RfY2xvbmVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdF9jbG9uZSlcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0X2Nsb25lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnJvcihcIk5vIHNlIGVuY29udHLDg8KzIG51bmfDg8K6biByZWdpc3Ryby5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBUaXBvcyBkZSBwcm9jZXNvcyBkZXNkZSBlbCBzZXJ2aWRvclxyXG4gICAgcHVibGljIGdldF9UaXBvc1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgYWN0aXZpZGFkOiBzdHJpbmcgPSAnVmVudGFzJykge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1RpcG9zUHJvY2Vzby8nICsgc0lES2F0aW9zICsgJy8nICsgYWN0aXZpZGFkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9UaXBvc1Byb2Nlc29cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIEluZm8gZGUgdW4gcHJvY2VzbyBhIHBhcnRpciBkZSB1biBpZFByb2Nlc28geSB1biBJZE0zXHJcbiAgICBwdWJsaWMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfSW5mb1BlcnNvbmFfUHJvY2Vzby8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBJbmZvIGRlIHVuIHByb2Nlc28gYSBwYXJ0aXIgZGUgdW4gaWRQcm9jZXNvIHkgdW4gSWRNMyBkZSBtYW5lcmEgc2luY3LDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGpEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc29fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIganNvbjtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9JbmZvUGVyc29uYV9Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgdW4gcHJvZHVjdG8gYWdydXBhZG8sIHRlbmllbmRvIHVuYSBsaXN0YSBkZSBwcm9kdWN0byBhZ3J1cGFkb3MgeSB1biBza3VcclxuICAgIHB1YmxpYyBHZXRNM1ByZEdycEZyb21MaXN0KExpc3RQcmQ6IEFycmF5PFR5cGVNM1ByZEdycD4sIHNrdSk6IFR5cGVNM1ByZEdycCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9UeXBlTTNQcmRHcnBSZXN1bHQ6IFR5cGVNM1ByZEdycDtcclxuICAgICAgICAgICAgb1R5cGVNM1ByZEdycFJlc3VsdCA9IExpc3RQcmQuZmluZChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwcmQuTG9NM1ByZEdlbmVyYWwuZm9yRWFjaChwcmQgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkLlNLVSA9PT0gc2t1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9UeXBlTTNQcmRHcnBSZXN1bHQuTG9NM1ByZEdlbmVyYWwgPSBvVHlwZU0zUHJkR3JwUmVzdWx0LkxvTTNQcmRHZW5lcmFsLmZpbHRlcihnZW4gPT4gZ2VuLlNLVSA9PSBza3UpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1R5cGVNM1ByZEdycFJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBkZSB1bmEgbGlzdGEgZGUgdWJpY2FjaW9uZXMsIHVuYSB1YmljYWNpb24gZW4gcGFydGljdWxhciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uRnJvbUxpc3QoTGlzdFViaWM6IEFycmF5PE0zVWJpY2FjaW9uPiwgc0lkVWJpYykge1xyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgICAgIG9NM1ViaWNhY2lvbiA9IExpc3RVYmljLmZpbmQodWJpYyA9PiB1YmljLklEVWJpY2FjaW9uID09IHNJZFViaWMpO1xyXG4gICAgICAgIHJldHVybiBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBYbWwgZGUgY29uZmlndXJhY2lvbiBkZSBsYSBlbXByZXNhIGEgcGFydGlyIGRlbCBpZHViaWNhY2lvblxyXG4gICAgcHVibGljIGdldF9YbWxDb25maWdfeF9JZFViaWNhY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9YbWxDb25maWdfeF9JZFViaWNhY2lvbi8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsb3MgYXRyaWJ1dG9zIGVuIG0zY2xhc2lmaWNhIGEgcGFydGlyIGRlIHVuIGlka2F0aW9zXHJcbiAgICBnZXRfY2xhc2lmaWNhdGlvbl9hdHRyaWJ1dGVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9jbGFzaWZpY2F0aW9uX2F0dHJpYnV0ZXMvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5BVFRSSUJVVEVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhcyBjYXRlZ29yaWFzIGVuIG0zY2xhc2lmaWNhIGEgcGFydGlyIGRlIHVuIGlka2F0aW9zIHkgdW4gYXRyaWJ1dG9cclxuICAgIGdldF9jbGFzaWZpY2F0aW9uX2NhdGVnb3JpZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9jbGFzaWZpY2F0aW9uX2NhdGVnb3JpZXMvJyArIGlkX2thdGlvcyArIFwiL1wiICsgYXR0cmlidXRlKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkNBVEVHT1JJRVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3BjaW9uZXNBZGljaW9uYWxlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRPcGNpb25lc0FkaWNpb25hbGVzLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQVRUUklCVVRFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEF0cmlidXRvc0FkaWNpb25hbGVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRBdHJpYnV0b3NBZGljaW9uYWxlcy8nICsgaWRfa2F0aW9zICsgXCIvXCIgKyBhdHRyaWJ1dGUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQ0FURUdPUklFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIGluZm9ybWFjaW9uIGRlIHRpcG9zIGRlIGVudmlvLlxyXG4gICAgTTNHZXRGb3JtYXNFbnZpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9NM0dldEZvcm1hc0VudmlvLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIGpzUmVzcDtcclxuICAgICAgICAgICAganNSZXNwID0gSlNPTi5wYXJzZShyZXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc1Jlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpbmllIHRvZGFzIGxhcyBNM1ViaWNhY2lvbmVzIGFzb2NpYWRhcyBhIHVuIGlkX2thdGlvc1xyXG4gICAgcHVibGljIGdldF91YmljYWNpb25lc19jb21wbGV0ZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfdWJpY2FjaW9uZXNfY29tcGxldGUvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpbmllIHRvZGFzIGxhcyBNM1ViaWNhY2lvbmVzIGFzb2NpYWRhcyBhIHVuIGlkX2thdGlvc1xyXG4gICAgcHVibGljIGdldF91YmljYWNpb25lc19zaW1wbGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X3ViaWNhY2lvbmVzX3NpbXBsZS8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpbmllIHRvZGFzIGxhcyBNM1ViaWNhY2lvbmVzIGFzb2NpYWRhcyBhIHVuIGlkX2thdGlvc1xyXG4gICAgcHVibGljIGFzeW5jIE0zR0VUX0xJU1RBUFJFQ0lPU19BU3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNHRVRfTElTVEFQUkVDSU9TLycgKyBpZF9rYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBvUmVjTGlzdGFQcmVjWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBHZXRFbmNhYmV6YWRvTGlzdGFzUHJlY2lvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9HZXRDb25maWdMUC8nICsgc0lES2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RyYXJDb2xvbmlhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcsIHNDb2xvbmlhOiBzdHJpbmcsIHNDb2RQb3N0YWwsIHNUZWxlZm9ubzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsIHNMaW5lYTE6IHN0cmluZywgc0NvZGVzdGFkbzogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwic0NvbG9uaWFcIjogc0NvbG9uaWEsIFwic0NvZFBvc3RhbFwiOiBzQ29kUG9zdGFsLCBcInNUZWxlZm9ub1wiOiBzVGVsZWZvbm8sIFwibmRvY1wiOiBuZG9jLCBcInNMaW5lYTFcIjogc0xpbmVhMSwgXCJzQ29kZXN0YWRvXCI6IHNDb2Rlc3RhZG8gfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNNYWVzdHJvL3JlZ2lzdHJhckNvbG9uaWEvJyArIElkS2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShwb3N0cyA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRlbmVyIHByb21vY2lvbmVzIFxyXG4gICAgcHVibGljIGFzeW5jIE0zX0dldFByb21vY2lvbmVzTWFlc3Ryb0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9NM19HZXRQcm9tb2Npb25lc01hZXN0cm8vJyArIGlkX2thdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9SZWNMaXN0YVByZWM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL09idGVuZXIgRGluYW1pY2FzIHBvciBhY3RpdmlkYWQgXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHZXREaW5CeUFjdGl2aWRhZChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldERpbkJ5QWN0aXZpZGFkLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vdmFyIGpzUmVzcDphbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAvL2pzUmVzcCA9IEpTT04ucGFyc2UoanNSZXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAvLyB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICAvLyBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXREaW5CeUFjdGl2aWRhZC8nICsgaWRfa2F0aW9zLCBvRGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgLy8gcmV0dXJuIG9SZWNMaXN0YVByZWM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxhIGluZm8gYmFzaWNhIGRlIGxhcyB1YmljYWNpb25lcyBjb24gSHViIHRpcG8gV0VCIGFjdGl2b3MgZW4gZWwgbW9tZW50b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgZ2V0VWJpY2FjaW9uZXNXZWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRVYmljYWNpb25lc1dlYi8nICsgaWRLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3ApKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgUmV0b3JuYSBsYSBpbmZvIGJhc2ljYSBkZSBsYXMgdWJpY2FjaW9uZXMgY29uIEh1YiB0aXBvIFdFQiBhY3Rpdm9zIGVuIGVsIG1vbWVudG8gcXVlIGFiYXJxdWVuIHVuIGNvZHBvc3RhbCBlbiBjb25jcmV0b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBnZXRVYmljYWNpb25lc0J5Q29kUG9zdGFsKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vZGF0YSA9IHsgXCJjb2RQb3N0YWxcIjogc3RyaW5nIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0VWJpY2FjaW9uZXNCeUNvZFBvc3RhbC8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgcGF0aCBkZSBsYSBmYWN0dXJhIGVsZWN0csODwrNuaWNhIGEgcGFydGlyIGRlIHVuIElkRGlhcmlvIGFzb2NpYWRvIGFsIHByb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYXRoRkVGcm9tRGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIHRpcG9HZW5lcmFjaW9uOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRQYXRoRkVGcm9tRGlhcmlvLycgKyBpZEthdGlvcyArICcvJyArIHRpcG9HZW5lcmFjaW9uLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGE6IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwdWVzdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGlhcmlvQWRpY2lvbmFsZXN4RGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keUdlbmVyYWxlcygnRGlhcmlvL2dldERpYXJpb0FkaWNpb25hbGVzeERpYXJpby8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIElVX0h1YihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0h1YjogYW55LCB1VEFjdGl2bzogc3RyaW5nLCB1TkFjdGl2bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCksICdvSHViJzogb0h1YiwgJ3VUQWN0aXZvJzogdVRBY3Rpdm8sICd1TkFjdGl2byc6IHVOQWN0aXZvIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vSVVfSHViJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGVsIGN0aXZvIGRlc2RlIHNlcnZpZG9yXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIHViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIEdldEN0aXZvQllQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZHByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZHByb2Nlc28nOiBpZHByb2Nlc28sICd1YmljYWNpb24nOiB1YmljYWNpb24sICdodWInOiBodWIgfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDdGl2b0JZUHJvY2Vzby8nICsgaWRfa2F0aW9zLnRyaW0oKSwgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgVmFsaWRhckN0aXZvc1ZTTG9jYWwoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgaW5mUHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIGZ1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNMy9WYWxpZGFyQ3Rpdm9zVlNMb2NhbC8nICsgaWRfa2F0aW9zICsgJy8nICsgdWJpY2FjaW9uICsgJy8nICsgaHViLCBpbmZQcm9jZXNvKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIGZ1bmNpb25SZXNwKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlc3AoeyBcImVycm9yXCI6IGVycm9yIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBHZW5lcmFyQXV0b3JpemFjaW9uQ3VlbnRhcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBkYXRhKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcblxyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvR2VuZXJhckF1dG9yaXphY2lvbkN1ZW50YXMnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgc2kgZWwgY29kaWdvIGluZ3Jlc2FkbyBjb3JyZXNwb25kZSBhbCBkb2N1bWVudG8geSBzaSBlbCBjb2RpZ28gZXN0YSBlbiBlc3RhZG8gYWN0aXZvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICovXHJcbiAgICBhc3luYyB2YWxpZGFjaW9uQXV0b3JpemFjaW9uTTNDdWVudGFzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGRhdGEpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuXHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNMy92YWxpZGFjaW9uQXV0b3JpemFjaW9uTTNDdWVudGFzJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBWZXJpZmljYXJQYWdvVGFyamV0YUJCVkEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZEtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGpEYXRhID0geyBcIklka2F0aW9zXCI6IHNJREthdGlvcywgXCJpZEtleVwiOiBzSWRLZXkgfVxyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL1ZlcmlmaWNhclBhZ29UYXJqZXRhQkJWQScsIGpEYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHJldHVybiBJbmZvO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRlMgMjAxOTA4MTM6IFJldG9ybmEgbG9zIGNvZGlnb3MgZGUgbG9zIFNLUChza3BUb0ZpbmQpIHkgc3UgcmVzcGVjdGl2byBzaWduaWZpY2FkbyBwYXJhIHVuIHByb2R1Y3RvIGRhZG9cclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERlc2NyaXBjaW9uU0tQcyhpZEthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLFxyXG4gICAgICAgIGRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2xldCBkYXRhID0ge1wiU0tQMVwiOlwiU0tQMVwiLCBTS1BUb0ZpbmQ6IDIgfX07XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zQ29uc3VsdGFzL2dldERlc2NyaXBjaW9uU0tQcy9cIiArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhkYXRhLlNLUDEsIEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBnZXRUb3RhbGVzQ2llcnJlQ2FqYShwb3N0U2VydmljZTogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIHN1YmljYWNpb246IHN0cmluZywgc2h1Yjogc3RyaW5nLCBzdXN1YXJpbzogc3RyaW5nLCBzRmVjaGFJOiBzdHJpbmcsIHNGZWNoYUY6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBzZWNvcGNpb25lczogYW55O1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBzSWRLYXRpb3MsICd1YmljYWNpb24nOiBzdWJpY2FjaW9uLCAnaHViJzogc2h1YiwgJ3VzdWFyaW8nOiBzdXN1YXJpbywgJ0ZlY2hhSSc6IHNGZWNoYUksICdGZWNoYUYnOiBzRmVjaGFGIH1cclxuICAgICAgICBzZWNvcGNpb25lcyA9IGF3YWl0IHBvc3RTZXJ2aWNlLmdldFdpdGhCb2R5TTMoJ00zL2dldFRvdGFsZXNDaWVycmVDYWphJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICBzZWNvcGNpb25lcyA9IEpTT04ucGFyc2Uoc2Vjb3BjaW9uZXMpXHJcbiAgICAgICAgcmV0dXJuIHNlY29wY2lvbmVzXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Q2llcnJlc3hVYmljYWNpb24ocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzdWJpY2FjaW9uOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc0ZlY2hhOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAndWJpY2FjaW9uJzogc3ViaWNhY2lvbiwgJ2lkUHJvY2Vzbyc6IHNJZFByb2Nlc28sICdGZWNoYSc6IHNGZWNoYSB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRDaWVycmVzeFViaWNhY2lvbicsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENpZXJyZXN4RW1wcmVzYShwb3N0U2VydmljZTogUG9zdFNlcnZpY2VNMywgc0lkS2F0aW9zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc0ZlY2hhOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAnaWRQcm9jZXNvJzogc0lkUHJvY2VzbywgJ0ZlY2hhJzogc0ZlY2hhIH1cclxuICAgICAgICBzZWNvcGNpb25lcyA9IGF3YWl0IHBvc3RTZXJ2aWNlLmdldFdpdGhCb2R5TTMoJ00zL2dldENpZXJyZXN4RW1wcmVzYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhZSBlbCBtM3Byb2Nlc29zIHNlZ3B1biBlbCBpZHByZXN0YW1vXHJcbiAgICBwdWJsaWMgc2ltdWxhcnBhZ29FbmxpbmVhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWRNMzogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zL1ZhbGlkYWNpb25QYWdvSW50ZWdyYWNpb25UZXN0LycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRNMyArICcvJyArIHNJZFByb2Nlc28pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyUHJkc01pc21vUHJvdmVlZG9yKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBub21icmVBZGljaW9uYWxQcm92ZWVkb3I6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9GdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby92YWxpZGFyUHJkc01pc21vUHJvdmVlZG9yL1wiICsgaWRfa2F0aW9zICsgXCIvXCIgKyBub21icmVBZGljaW9uYWxQcm92ZWVkb3IsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvclwiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKGVyclsnX2JvZHknXSkuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhclJlc3RyaWNjaW9uSW52TmVnYXRpdm8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vdmFsaWRhclJlc3RyaWNjaW9uSW52TmVnYXRpdm8vXCIgKyBpZF9rYXRpb3MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdmFsaWRhclJlc3RyaWNjaW9uSW52TmVnYXRpdm9cIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldEluZm9QcmRHYXN0b3NFbnZpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuXHJcbiAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTWFlc3Ryby9nZXRJbmZvUHJkR2FzdG9zRW52aW8vXCIgKyBpZF9rYXRpb3MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpLlJFU1BVRVNUQVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIHVuYSBzYWxkb3hjdWVudGEgYWxlYXRvcmlvIHBvciBlbCB2YWxvciBkYWRvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhID0ge1wicHJvY2Vzb1wiLHByb2Nlc28sXCJ2YWxvclwiOnZhbG9yLFwibm9tYnJlRG9jXCI6IG5vbWJyZURvY31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG0zX2dlbmVyYXJfTTNTWENfYWxlYXRvcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9NM1NYQ19hbGVhdG9yaW8vXCIgKyBpZGthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04ucGFyc2UocmVzcFsnX2JvZHknXSkudG9TdHJpbmcoKSkuUkVTUFVFU1RBO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgdW4gY29uY2VwdG8gZGVsIE0zX3NhbGRvc0l0ZW1VYlxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbkVycm9yIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTTNfYWN0dWFsaXphckNvbmNlcHRvU0lVKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9NM19hY3R1YWxpemFyQ29uY2VwdG9TSVUvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wcm9jZXNvc1wiO1xyXG5pbXBvcnQgeyBNM1BFbmNJdGVtcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR2VuZXJhbC50eXBlXCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgTTNQRGV0YWxsZUl0ZW1zLCBNM1BJdGVtc1dFQiwgTTNQRGV0YWxsZUN1cG9uIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0RhdGEgfSBmcm9tIFwiLi4vRGF0YS9tMy1kYXRhXCI7XHJcbmltcG9ydCB7IERFRkFVTFRfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3NvclwiO1xyXG5pbXBvcnQgeyB4bWxUb0pzb25URiB9IGZyb20gXCIuLi8uLi9Db252ZXJ0L3htbFRvSlNvbi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BJbXB1ZXN0b3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcC1pbXB1ZXN0b3NcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM0VOQ1BST01PIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM0VOQ1BST01PLmNsYXNzXCI7XHJcbmltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgcHJvbW9jaW9uZXNTZXJ2aWNlIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgUHJvbW9jaW9uUHJvY2VzYWRhLCBQcm9tb2Npb25lc0Fzb2NpYWRhcywgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSBcIi4uL1Byb21vY2lvbmVzL01vZGVscy9NM1Byb21vUHJvY2VzYWRhLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4vTTNNYWVzdHJvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkaW5hbWljYXNcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBhIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjNcIjtcclxuaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvdXRpbFwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNQcmRBZGljaW9uYWxlcyB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkQWRpY2lvbmFsZXMudHlwZVwiO1xyXG5pbXBvcnQgeyBNM090Q2xhc2lmaWNhY2lvbmVzIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgeyBNM1ByZExpc3RhIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlXCI7XHJcbmltcG9ydCB7IE1hdGhURiB9IGZyb20gXCIuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzc1wiO1xyXG5pbXBvcnQgeyBFQ0FOQ0VMRUQgfSBmcm9tIFwiY29uc3RhbnRzXCI7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG52YXIgYmlnRGVjaW1hbCA9IHJlcXVpcmUoJ2pzLWJpZy1kZWNpbWFsJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdTZXJ2aWNlIHtcclxuICAgIHB1YmxpYyBvTWF0aFRGOiBNYXRoVEYgPSBuZXcgTWF0aFRGKCk7XHJcbiAgICBwcml2YXRlIG9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm87XHJcbiAgICBwdWJsaWMgb0xpc3RhT2JzZXF1aW9zOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NFeGM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb09Qcm9tbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgb2JzZXF1aW9zQ2FudGlkYWQ6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbElkQWN0aXZhUHJvbW8gPSBbXTtcclxuICAgIHByaXZhdGUgR29Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zO1xyXG4gICAgcHJpdmF0ZSBnc0lka2F0aW9zO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBJc1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZGthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8gPSBpb00zQ291Y2hNYWVzdHJvO1xyXG4gICAgICAgIHRoaXMuR29Qb3N0U2VydmljZU0zID0gSXNQb3N0U2VydmljZU0zO1xyXG4gICAgICAgIHRoaXMuZ3NJZGthdGlvcyA9IHNJZGthdGlvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgKiBWYWxpZGFyIG51bWVybyBkZSBpdGVtcyBhZ3JlZ2Fkb3MuIHNpIGVzIG1heW9yIGEgMS4wMDAgcHJlbmRlIHBhcmFtZXRybyBcclxuICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTnVtZXJvSXRlbXMob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPiAxMDAwKSB7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5BcGxEZXNkZVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgIG9sTTNQcm9jZXNvcy5NM0VOQyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyTnVtZXJvSXRlbXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JZE0zID0gb0pzb24uUkVTUFVFU1RBLklETTM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJT0NJRVJSRVxyXG5cclxuICAgICAgICAgICAgLy9BY3R1YWxpemFjaW9uIGRlIGVzdGFkb3MuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuRXN0YWRvRGVzO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvSnNvbi5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIGFwbFJldG9tYXJJbmZvOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9SZWdpc3Ryb0V2ZW50b00zL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBBcnJheTxNM1Byb2Nlc29zPiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTNPZmZMaW5lL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQyArIFwiL1wiICsgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9NM1Byb2Nlc29zKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vL1JldG9tYXIgaW5mb3JtYWNpb24gcGFyYSBlbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIFJldG9tYXJJbmZvcm1hY2lvbihvRGF0YVVzZXI6IGFueSwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGFwbFJldG9tYXJJbmZvOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhVXNlciAhPSBudWxsICYmIG9NM1Byb2Nlc29zLklkTTMgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5JZE0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFwbFJldG9tYXJJbmZvKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IHVuZGVmaW5lZCB8fCBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIGRhdG9zIGVuIGJhc2UgZGUgZGF0b3MgcG91Y2hEQi5cclxuICAgIHB1YmxpYyBQcm9jZXNhbWllbnRvU2VydmljZVBvdWNoREIob00zRGF0YTogTTNEYXRhLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIC8vQ2FyZ2FyIGRldGFsbGUgZGUgaXRlbXNcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4oYXN5bmMgcmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyArb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCBNM0VuYyA9IHRoaXMuZ2V0X00zRU5DX2J5X2lkcHJkX2xvdGUob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVLCBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUpO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9EYXRhQ2Fycml0b0NvbXByYXMpO1xyXG4gICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BZ3JlZ2FyIGEgY2Fycml0byBwcm9kdWN0by5cclxuICAgIHB1YmxpYyBhZGR0b2NhcnQob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RVbml0U2VsZWN0ZWQ6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICBwcm9kdWN0VW5pdFNlbGVjdGVkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG4gICAgICAgIC8vSkFHTSAyMDE5MDcyMiBzZSBhZ3JlZ2EgcGFyYSBjdWFuZG8gZXMgZWwgcHJpbWVyIHByb2R1Y3RvIHF1ZSBzZSBhZ3JlZ2Fyw4PCoVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0VOQy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvRGF0YVVzZXIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGlvTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy52YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zUHJvY2Vzb3MuTTNFTkMsIHByb2R1Y3RVbml0U2VsZWN0ZWQsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIGlmIChjYW50aWRhZF9hY3R1YWwgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9sZXQgY2FudGlkYWRfYWN0dWFsID0gdGhpcy5nZXRDYW50aWRhZChvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gKCtjYW50aWRhZF9hY3R1YWwpICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZDtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVICYmIHByb2QuTG90ZSA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLkxPVEUgJiYgIShwcm9kLklkRW5jUGFkcmUgPiAwKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQsIHZhbG9yRGVzY3VlbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChmdW5jaW9uT0spXHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9WYWxpZGEgcXVlIGV4aXN0YSBwcm9kdWN0byBlbiBsb3MgZW5jYWJlemFkb3MuIFRydWU6IFNpIGV4aXN0ZSwgRmFsc2UgZGUgb3RybyBtb2RvXHJcbiAgICAvLyBTZSBjYW1iaWEgZnVuY2lvbmFsaWRhZCBkZSByZXR1cm4uXHJcbiAgICBwdWJsaWMgdmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM0xpc3RhRW5jOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1ByZEdybDogTTNQcmRHZW5lcmFsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgb0VuYzogTTNQRW5jSXRlbXMgPSBudWxsO1xyXG4gICAgICAgIHZhciBjYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IC0xO1xyXG4gICAgICAgIGlmIChvTTNMaXN0YUVuYyAhPT0gdW5kZWZpbmVkICYmIG9NM1ByZEdybCAhPT0gdW5kZWZpbmVkICYmIG9NM0xpc3RhRW5jLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgIG9FbmMgPSBvTTNMaXN0YUVuYy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBvTTNQcmRHcmwuU0tVICYmICFlbmMuSWRFbmNQYWRyZSAmJiB0aGlzLmdldENhbnRpZGFkUG9zaXRpdmEoZW5jKSk7XHJcbiAgICAgICAgICAgIGlmIChvRW5jICE9PSB1bmRlZmluZWQgJiYgb0VuYyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA3MTcgVmFsaWRhciBhaG9yYSBlbCBwcmVjaW8uXHJcbiAgICAgICAgICAgICAgICB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR3JsLCArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jLCBvTTNQcmRHcmwuTG9NM1ByZExpc3RhKSAmJiAhdGhpcy5WYWxpZGFyRXN0YVBhcXVldGUob0VuYywgb00zTGlzdGFFbmMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSBvRW5jLklEO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRpZGFkID0gK29FbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbnRpZGFkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhbnRpZGFkUG9zaXRpdmEob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjYW50aWRhZCA9IDA7XHJcbiAgICAgICAgbGV0IGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIilcclxuXHJcbiAgICAgICAgaWYgKGRldENhbnRpZGFkKSB7XHJcbiAgICAgICAgICAgIGNhbnRpZGFkID0gK2RldENhbnRpZGFkLlZhbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHF1ZSBlbCBlbmNhYmV6YWRvIGNvbiBlbCBwcm9kdWN0byBhZ3JlZ2Fkbywgc2VhIHVuIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gb00zTGlzdGFFbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyRXN0YVBhcXVldGUob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgb00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNMaXN0YUVuYy5maW5kKHggPT4geC5JZEVuY1BhZHJlID09IG9NM1BFbmNJdGVtcy5JRCkpIHtcclxuICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgKiBAcGFyYW0gb0VuYyBcclxuICAgICAqIEBwYXJhbSBvTTNQcmRMaXN0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJQcmVjaW9zUHJkcyhvRW5jOiBNM1BFbmNJdGVtcywgb00zUHJkTGlzdGE6IE0zUHJkTGlzdGEpIHtcclxuICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0VuYzogbnVtYmVyID0gK29FbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIGRQcmVjaW9MaXN0OiBudW1iZXIgPSBvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgICAgICBpZiAoZFByZWNpb0xpc3QgPT0gZFByZWNpb0VuYykge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIFZhbGlkYXJQcmVjaW9zUHJkc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyBVcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvblxyXG4gICAgICAgICwgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiA9IG51bGwpIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBtM1ViaWNhY2lvbiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikgey8vTm8gZXhpc3RlIGVsIGNhcnJpdG8gXHJcbiAgICAgICAgICAgICAgICAgICAgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvbW9BZnRlckNhcnJpdG9PayhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICBpZiAobTNVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgdmFyIGxvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHRoaXMuZ3NJZGthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICB0aGlzLlByb2NQcm9tb0FmdGVyQWRkVG9DYXJ0KG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIGxvTTNQSXRlbXNXRUIsIG0zVWJpY2FjaW9uLCB0cnVlKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhvRGF0YSk7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzQXN5bmMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJFbnRybzFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiRW50cm8yXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkbyBlbiBwcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2tcIik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5vRW5jYWJlemFkb00zQ29tcG9uZW50LlJlY2FyZ2FyQ2Fycml0bygpO1xyXG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLkxvYWRDYXJ0KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FjdHVhbGl6YWNpb24gZGUgTTMgcHJvY2Vzb3MsIGNvbiBkYXRhIGxpc3RhIHBhcmEgYWN0dWFsaXphci5cclxuICAgIHB1YmxpYyB1cGRhdGVBUG91Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIHRpcG9VYmljYWNpb246IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBubyBjb250cm9sYWRvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZWxldGVNM1Byb2Nlc28ob00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgYXdhaXQgb00zRGF0YS5EZWxldGUoc0tleUNhcnJpdG8pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9FbGltaW5hciBkb2N1bWVudG8gZGUgY291Y2gvcG91Y2gsIGluaWNpbyB5IGFjdHVhbFxyXG4gICAgcHVibGljIERlbERvY3NTdGFydEFuZEN1cnJlbnQob00zRGF0YTogTTNEYXRhLCBzSURLYXRpb3M6IHN0cmluZywgb2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBVYmljYWNpb25DdXJyZW50LCBIdWJDdXJyZW50KSB7XHJcbiAgICAgICAgLy9FbGltaW5hciBJbmljaWFsXHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPT0gdW5kZWZpbmVkICYmIG9sTTNQcm9jZXNvcy5JRERpYXJpb0NpZXJyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YVVzZXIgPSB7IFwiVXN1YXJpb1Npc3RlbWFcIjogeyBcIlRET0NcIjogb2xNM1Byb2Nlc29zLlREb2MsIFwiTkRPQ1wiOiBvbE0zUHJvY2Vzb3MuTkRvYywgXCJVQklDQUNJT05cIjogb2xNM1Byb2Nlc29zLlViaWMxLnRvU3RyaW5nKCksIFwiSURIVUJcIjogb2xNM1Byb2Nlc29zLklESHViIH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIHN0YXJ0XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgLy9FbGltaW5hciBhY3R1YWxcclxuICAgICAgICAgICAgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IFViaWNhY2lvbkN1cnJlbnQudG9TdHJpbmcoKSwgXCJJREhVQlwiOiBIdWJDdXJyZW50IH0gfVxyXG4gICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRGVsZXRlIGN1cnJlbnRcIik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgLy9HdWFyZGFyIGVuIEJEIFBvdWNoREJcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICAvL09idGVuZXIga2V5IGRlIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVHJhc2xhZGFyIGluZm9ybWFjacODwrNuIGRlIGNhcnJpdG8sIGRvcyB1c3Vhcmlvc1xyXG4gICAgcHVibGljIGFzeW5jIE1vdmVDYXJ0SW50b1VzZXIoc0lES2F0aW9zOiBzdHJpbmcsIG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyT3JpZ2VuOiBhbnksIG9EYXRhVXNlckRlc3Rpbm86IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0b09yaWdlbjtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9EZXN0aW5vO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b09yaWdlbiA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvRGVzdGlubyA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBsZXQgb00zUHJvY2VzbyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG9PcmlnZW4pO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzby5URG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvLk5Eb2MgPSBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0M7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvW1wiX3JldlwiXTtcclxuICAgICAgICAgICAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0b0Rlc3Rpbm8sIG9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpb3MgdG90YWxlcyB5IGRlIGJhc2VcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zUHJvbW9Db21iaW5hZGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIHZhciBkUHJlY2lvVG90YWxCYXNlO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3I6IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy8gdmFyIGRWYWxvck5ldG86IG51bWJlciA9IDA7XHJcblxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbCA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciAvLygrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSAqICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgLy8gICAgIGRQcmVjaW9Ub3RhbEJhc2UgPSB0aGlzLkNhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKGVuYywgZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMQkFTRVwiKS5WYWxvciA9IFN0cmluZyhNYXRoLnJvdW5kKGRQcmVjaW9Ub3RhbEJhc2UgKiAxMDApIC8gMTAwKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yID0gKCtkVmFsb3IpICsgKCtkUHJlY2lvVG90YWxCYXNlKTtcclxuICAgICAgICAvLyAgICAgZFZhbG9yTmV0byA9ICgrZFZhbG9yTmV0bykgKyAoK2RQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuUmVjYWxjdWxvSW1wdWVzdG9zKGVuYywgZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgLy8gLy9vTTNQcm9jZXNvcy5WYWxvciA9IGRWYWxvcjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1JlY2FsY3VsYXIgcHJlY2lvcy4gcmVjb3JyaWVuZG8gbG9zIGVuY2FiZXphZG9zLlxyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIHZhbG9yID0gMDtcclxuICAgICAgICB2YXIgVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5mb3JFYWNoKGVuYyA9PiB7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MTAxMCBzZSBjYW1iaWEgZWwgdmFsb3IgZGVsIHByZWNpbyB1bml0YXJpbyBiYXNlLCB5YSBxdWUgYWwgbW9tZW50byBkZSBsbGFtYXIgbGEgZnVuY2nDg8KzbiBWYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc29cclxuICAgICAgICAgICAgLy8gc2UgcmVjYWxjdWxvIGVsIHByZWNpbyB0b3RhbCwgZGVwZW5kaWVuZG8gZGUgZXN0ZSB2YWxvci5cclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2UoZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpLlZhbG9yLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5vTWF0aFRGLnJvdW5kKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvciwgMikpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZEVuYyA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGlmICgrZENhbnRpZGFkRW5jICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKS5WYWxvciA9ICgrcFRvdGFsQmFzZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSBcIjBcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKGVuYywgK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bGFyIHByZWNpbyBiYXNlIGRlIHVuIHByZWNpbywgdGVuaWVuZG8gZWwgdmFsb3IgdG90YWwgbyBuZXRvLlxyXG4gICAgcHVibGljIENhbGN1bGFyUHJlY2lvQmFzZUZyb21Qcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9OZXRvOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZFZhbG9ySW1wdWVzdG86IG51bWJlciA9IDE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JJbXB1ZXN0byA9ICgrZFZhbG9ySW1wdWVzdG8pICsgKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICgoK2RQcmVjaW9OZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvL1JlY2FsY3VsbyBkZSB2YWxvciBkZSBpbXB1ZXN0b3MsIGN1YW5kbyBjYW1iaWEgZWwgdmFsb3IuIFNlYSBwb3IgY2FudGlkYWQsIGVsaW1pbmFjacODwrNuLi4uXHJcbiAgICAvLyBwdWJsaWMgUmVjYWxjdWxvSW1wdWVzdG9zKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRQcmVjaW9CYXNlOiBudW1iZXIpIHtcclxuICAgIC8vICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAvLyAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAvLyAgICAgICAgIGltcC5WYWxvciA9ICgrZFByZWNpb0Jhc2UpICogKCtpbXAuUG9yY2VudGFqZSk7XHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBudWV2byBjb25jZXB0b1xyXG4gICAgLy8gICAgICAgICBpbXAuQmFzZSA9IGRQcmVjaW9CYXNlO1xyXG4gICAgLy8gICAgICAgICBkVG90YWxJbXB1ZXN0byA9ICgrZFRvdGFsSW1wdWVzdG8pICsgKCtpbXAuVmFsb3IpO1xyXG4gICAgLy8gICAgICAgICAvL1N1bWEgZGUgcHJlY2lvIGJhc2UgXHJcbiAgICAvLyAgICAgICAgIGRQcmVjaW9CYXNlID0gKCtkUHJlY2lvQmFzZSkgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyAgICAgZFRvdGFsSW1wdWVzdG8gPSBNYXRoLnJvdW5kKGRUb3RhbEltcHVlc3RvICogMTAwKSAvIDEwMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgPSBkVG90YWxJbXB1ZXN0by50b1N0cmluZygpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWFjaW9uIG51ZXZvIE0zIHByb2Nlc29zLCBlc3RlIHZhIHZhY2lvIHNpbiBuaXNpcXVpZXJhIE0zUEVuY0l0ZW1zLiBcclxuICAgICAqIFNlIHV0aWxpemEgcHJpbmNpcGFsbWVudGUgcGFyYSBsYXMgY3JlYWNpb24gZGVzZGUgMCB1biBNMyBQcm9jZXNvLiBRdWUgcGFzYSBkZSBlc3RhZG9zICcnIGFsIHByaW1lciBlc3RhZG9cclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2Vzb3MgXHJcbiAgICAgKiBAcGFyYW0gaWRwcm9jZXNvX2Rlc3Rpbm8gXHJcbiAgICAgKiBAcGFyYW0gdGRvYyBcclxuICAgICAqIEBwYXJhbSBuZG9jIFxyXG4gICAgICogQHBhcmFtIGVzdGFkb3NfZnV0dXJvcyBcclxuICAgICAqIEBwYXJhbSBpZEh1YiBcclxuICAgICAqIEBwYXJhbSBpZFViaWNhY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIENyZWF0ZU0zTmV3UHJvY2Vzb0VtcHR5KGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRwcm9jZXNvX2Rlc3Rpbm86IHN0cmluZywgdGRvYzogc3RyaW5nLCBuZG9jOiBzdHJpbmcsXHJcbiAgICAgICAgZXN0YWRvc19mdXR1cm9zOiBBcnJheTxhbnk+LCBpZEh1Yjogc3RyaW5nLCBpZFViaWNhY2lvbjogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IGlkcHJvY2Vzb19kZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBcIlwiO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBlc3RhZG9zX2Z1dHVyb3NbMF0uU0VfRGVzdGlubztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9ICtpZEh1YjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPSAraWRVYmljYWNpb247XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLklESHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5VYmljMSA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVERvYyA9IHRkb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk5Eb2MgPSBuZG9jO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMyID0gLTE7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuICAgIH1cclxuXHJcbiAgICAvL0N1YW5kbyBzZSBhZ3JlZ2EgcG9yIHByaW1lcmEgdmV6IGFsIGNhcnJpdG8gZGUgY29tcHJhLlxyXG4gICAgcHVibGljIExvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb0RhdGFVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICAvL3NJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OXHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5GZWNoYSA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5UaXBvVGVyY2VybyA9IDE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVERvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk5Eb2MgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQztcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMSA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICAvLy9BR1JFR0FSIE5VRVZBIEZVTkNJT05BTElEQUQgREUgSFVCUy4gRkxVSk8gREUgVFJBQkFKT1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLklESHViID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvTTNQcm9jZXNvcy5JREh1YjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLlViaWMxO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViUHJlID0gLTE7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWNQcmUgPSAtMTtcclxuXHJcbiAgICAgICAgLy8vRklOIEFHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcblxyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuRXN0YWRvQW50ID0gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gXCJBY3Rpdm9cIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX28gIT0gXCJcIiAmJiBvTTNQSXRlbXNXRUIuRXN0YWRvX28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXMgPSBvTTNQSXRlbXNXRUIuU3ViRXN0YWRvX287XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5Fc3RhZG9fbztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9PSBcIlwiICYmIGlvTTNQcm9jZXNvcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gXCJNM0VDQ1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBvTTNQSXRlbXNXRUIuSWRQcm9jZXNvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICAvL3RoaXMuUHJvY2VzYW1pZW50b1NlcnZpY2UoUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3MsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9DYXJnYXIgbnVldm9zIGFkaWNpb25hbGVzIGFkaWNpb25hbGVzXHJcbiAgICBwdWJsaWMgTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIHByb2R1Y3Q6IFR5cGVNM1ByZEdycCk6IE0zUEl0ZW1zV0VCIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVBST0RTRVJWXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuQ2xhdmVQcmRVbmlkYWQgPSBwcm9kdWN0LkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gXCJDTEFWRVVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLlVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIlVOSURBRFwiKS5WQUxPUjtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvTTNQSXRlbXNXRUI7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgcHJvY2Vzb3MsIHJldG9tYW5kbyBkZXNkZSBkYXRhXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vIG9NM1Byb2Nlc29zLlZhbG9yTmV0byA9IG9NM1Byb2Nlc29zLlZhbG9yO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9PSBcIlwiICYmIG9NM1BJdGVtc1dFQi5JZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLnB1c2godGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlcikpO1xyXG4gICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG51bGwsIHZhbG9yRGVzY3VlbnRvLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpXHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8gPSAwLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQ6IGFueSA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy9WYWxpZGFjaW9uIGRlIEludmVudGFyaW8uXHJcbiAgICAgICAgbGV0IGFkaVZlbnRhTmVnID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBcIlZFTlRBTkVHXCIpXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJNM0VDQ1wiICYmIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCAmJiBvTTNVYmljYWNpb24uTTNIVUJTWzBdLlRpcG8gPT0gXCJXRUJcIiAmJiAhKGFkaVZlbnRhTmVnICYmIGFkaVZlbnRhTmVnLlZBTE9SKSkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc1tcIkludmVudGFyaW9FcnJvclwiXSA9ICdObyBoYXkgaW52ZW50YXJpbyBwYXJhIGFncmVnYXIgJyArIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgKyAnIEl0ZW1zJztcclxuICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFO1xyXG4gICAgICAgIH0gLy9lbHNlIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1BFbmNJdGVtcyA9IHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvUGFkcmVNM1BFbmNJdGVtcywgdmFsb3JEZXNjdWVudG8pO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob1BhZHJlTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgLy9UaWVuZSB1biBlbmNhYmV6YWRvIHBhZHJlLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA9IG9QYWRyZU0zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgdmFyIG9sTTNQcmRQYWNrRGV0OiBBcnJheTxNM1ByZFBhY2tEZXQ+O1xyXG4gICAgICAgICAgICBvbE0zUHJkUGFja0RldCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0tcclxuICAgICAgICAgICAgaWYgKG9sTTNQcmRQYWNrRGV0ICYmIG9sTTNQcmRQYWNrRGV0Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2xldCB2YWxvckRlc2N1ZW50b1BhY2sgPSB0aGlzLmNhbGN1bGFyUG9yY2VudGFqZURlc2N1ZW50b0NvbWJvKHByb2RHUlBTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbE0zUHJkUGFja0RldC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQgPSBvbE0zUHJkUGFja0RldFtpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFja00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQiA9IG9NM1ByZFBhY2tEZXQub00zUEl0ZW1zV0VCO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gT2JqZWN0LmFzc2lnbih7fSwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9NM1ByZFBhY2tEZXQuQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUHJkUGFja0RldC5nc1BhdGhJbWFnZW47XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHBhY2tNM1BJdGVtc1dFQi5kQ2FudGlkYWQgKiBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5DYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2tNM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyBpICsgMjsgLy9Fc3RvIGZ1bmNpb25hIHNpIHRpZW5lIHNvbG8gMiBuaXZlbGVzXHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlc3RvIHNlIGN1bXBsZSBlc3RlIHByb2R1Y3RvIGVzIHVuIHBhY2sgeSB0aWVuZSBwcm9kdWN0b3MgYXNvY2lhZG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZEdlbmVyYWwgPSBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLk0zQ29kcy5maW5kKHggPT4geC5JZENvZGlnbyA9PSBcIlVQQ1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZEdlbmVyYWwgJiYgcHJkR2VuZXJhbC5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcyA9IHByZEdlbmVyYWwuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJubyBhw4PCsWFkaSBjb2RpZ28gZGUgYmFycmFzIGEgcHJvZHVjdG8gaGlqbzogXCIgKyBvTTNQcmRQYWNrRGV0LlNLVUhJSk8pXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybChvTTNQcm9jZXNvcywgb00zUHJkUGFja0RldC5NM0dSUCwgb00zUHJvY2Vzb3MuTTNFTkMsIHBhY2tNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyLCBvTTNQRW5jSXRlbXMsIDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyMywgZXN0byBlcyBjdWFuZG8gc2UgbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgcHJvZGN1dG9zIGV4aXN0ZW50ZXMuXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklEID0gb00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkgZW52aW8gZGUgcGFkcmUgZGVzZGUgaW5zdHJ1Y2Npb24gbWFzIGFycmliYVxyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklERW5jUGFkcmUgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb00zUEl0ZW1zV0VCLklERW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuVGlwb0FncnVwYWNpb24gPSBvTTNQSXRlbXNXRUIuVGlwb0FncnVwYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCAmJiBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLmZvckVhY2goZGluID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQRGluYW1CeUFjdGl2aWRhZC5wdXNoKHsuLi4gZGlufSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMucHVzaChvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiTWVuc2FqZUVycm9yXCJdID0gb00zUEVuY0l0ZW1zW1wiTWVuc2FqZUVycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQcm9jZXNhZG8gPSBvTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgLy99XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgdmFsb3JEZXNjdWVudG9QYWNrID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JJdGVtc0NvbWJvU3VtYSA9IDA7XHJcbiAgICAgICAgbGV0IHZhbG9yRmluYWxDb21ibyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPO1xyXG5cclxuICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTTNQQUNLLmZvckVhY2gocHJkUGFjayA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZCA9IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgPyBwcmRQYWNrLk0zR1JQLkNhbnRpZGFkIDogMTtcclxuICAgICAgICAgICAgbGV0IGluZk5pdmVsZXNQcmNpbyA9IHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByZFBhY2suTTNHUlAsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5JRExJU1RBKVxyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTylcclxuICAgICAgICAgICAgdmFsb3JJdGVtc0NvbWJvU3VtYSArPSAocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogY2FudGlkYWQpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodmFsb3JJdGVtc0NvbWJvU3VtYSA+IHZhbG9yRmluYWxDb21ibykge1xyXG4gICAgICAgICAgICB2YWxvckRlc2N1ZW50b1BhY2sgPSAxMDAgLSAodmFsb3JGaW5hbENvbWJvICogMTAwIC8gdmFsb3JJdGVtc0NvbWJvU3VtYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodmFsb3JEZXNjdWVudG9QYWNrKVxyXG4gICAgICAgIHJldHVybiB2YWxvckRlc2N1ZW50b1BhY2s7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxvIGRlIHByZWNpb3MgZGUgaGlqb3MgZGVsIHBhcXVldGVcclxuICAgICAqIEBwYXJhbSBvTTNQcmRQYWNrRGV0IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9zUENLRyhvTTNQcmRQYWNrRGV0OiBNM1ByZFBhY2tEZXQpIHtcclxuICAgICAgICBvTTNQcmRQYWNrRGV0Lk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2FkTTNQRW5jSXRlbXNGcm9tUHJvbW9jaW9uQ29tYm8ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29kaWdvOiBzdHJpbmcsIHZhbG9yLCBkQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b0NvbWJvID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLklkUHJvZHVjdG8gPSBjb2RpZ287XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Mb3RlID0gXCIxXCI7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zRU5DLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJPcmRlblwiKSArIDE7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5Ob21icmUgPSBcIkNvbWJvXCI7XHJcblxyXG5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzJyksIFwiRkVDSEFJTlwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9DT01CT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCJ0cnVlXCIsIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAvL0RldGFsbGVzIGRlIGZhY3R1cmEgZWxlY3Ryb25pY2FcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIkVOQ1BST01PXCIsIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgIC8qKkZJTiBJTkZPUk1BQ0lPTiBHRU5FUkFMICovXHJcblxyXG4gICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVRVNUT1NcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3Rvc1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVU5JVEZJREVMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVOSVRcIikpO1xyXG4gICAgICAgIC8vKiogRklOIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiRklERUxJWkFDSU9OXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTFBST01PXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJDVEJMRElNUFBSRFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJTVUJUT1RBTFwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrdmFsb3IgKiBkQ2FudGlkYWQpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIikpO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvQ29tYm8pO1xyXG4gICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8uZm9yRWFjaChwcm9kdWN0byA9PiB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklEID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIHByb2R1Y3RvLklkRW5jUGFkcmUgPSBwcm9kdWN0b0NvbWJvLklEO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKHByb2R1Y3RvKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9Db21ibztcclxuICAgIH1cclxuXHJcbiAgICByZWNhbGN1bGFyTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0FwbFN1bWFWYWxvciA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihvTTNFTkMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKTtcclxuICAgICAgICAgICAgbGV0IGRldEVzUHJkQ29tYm8gPSBvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJFU1BST0RQUk9NT0NPTUJPXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGV0Q2FudGlkYWQgJiYgK2RldENhbnRpZGFkLlZhbG9yID4gMCAmJiAhKGRldEVzUHJkQ29tYm8gJiYgZGV0RXNQcmRDb21iby5WYWxvciA9PSBcInRydWVcIilcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gMDtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciA9IDA7XHJcblxyXG4gICAgICAgIC8vZm9yIChjb25zdCBvTTNFTkMgb2YgdGhpcy5vTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICFlbmMuSWRFbmNQYWRyZSB8fCBlbmMuSWRFbmNQYWRyZSA8PSAwKSkge1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zRU5DIG9mIHByb2R1Y3Rvc0FwbFN1bWFWYWxvcikge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gKz0gK29NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvciArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiU1VCVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FyZ2FyIE0zUHJvY2VzbyBlbmNhYmV6YWRvIGl0ZW1zLCBkZXNkZSBwcm9kdWN0byBnZW5lcmFsXHJcbiAgICBwdWJsaWMgTG9hZE0zUEVuY0l0ZW1zRnJvbVByZEdybEl0ZW0ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9lbmNhYmV6YWRvSXRlbXM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQixcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvUGFkcmVNM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSB1bmRlZmluZWQsIHZhbG9yRGVzY3VlbnRvID0gMCk6IE0zUEVuY0l0ZW1zIHtcclxuXHJcbiAgICAgICAgdmFyIG9NM1BFbmNJdGVtcyA9IG5ldyBNM1BFbmNJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgdmFyIGRQUkVDSU9Vbml0QmFzZSA9IDA7XHJcbiAgICAgICAgdmFyIGluZk5pdmVsZXNQcmNpbztcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIHZhciBkVG90YWxJbXB1ZXN0b3NUb3RhbDogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvTW9uZWRlcm86IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRVbml0YXJpb1Byb21vOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICAvL1ZlcmlmaWNhciBlbCBwcmVjaW8gYSB1c2FyLCB1c2FuZG8gbGEgbG9naWNhIGRlIG5pdmVsZXMgZGUgcHJlY2lvcy5cclxuICAgICAgICBpbmZOaXZlbGVzUHJjaW8gPSB0aGlzLlZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG4gICAgICAgIGlmICh2YWxvckRlc2N1ZW50byA+IDApIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPICogdmFsb3JEZXNjdWVudG8gLyAxMDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAtIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gdGhpcy5DYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vVmFsaWRhIHNpIGVsIHByb2R1Y3RvIGVzdMODwqEgcmVzdGluZ2lkb1xyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGFyUHJvZHVjdG9SZXN0cmluZ2lkbyhvUHJvbW9jaW9uUHJvY2VzYWRhKSkge1xyXG4gICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGVsIHRvdGFsIGRlIHB1bnRvcyB5IGVsIHZhbG9yIHRvdGFsIGRlIGxhIHByb21vY2nDg8KzbiBwb3IgbGEgY3FhbnRpZGFkIGRlIHByb2R1Y3RvcyBkZSBsYSBtaXNtYSByZWZlcmVuY2lhXHJcbiAgICAgICAgICAgIGRVbml0YXJpb01vbmVkZXJvID0gb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm87IC8vVW5pdGFyaW8gTW9uZWRlcm9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybywgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7IC8vTm8gc2UgdXRpbGl6YSwgc2UgZGVqYSBwYXJhIHVzb3MgYWRlbGFudGVcclxuXHJcbiAgICAgICAgICAgIGRVbml0YXJpb1Byb21vID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjsgLy9Qcm9tb2Npb24gdW5pdGFyaW9cclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RldEN1cG9uZXMgPSB0aGlzLmdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhLCArb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhbGN1bG8gZGUgcHJlY2lvIHRvdGFsLCBkZXNwdWVzIGRlIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2FyZ2FyIHByb2R1Y3RvIFxyXG4gICAgICAgICAgICBvTTNQcmRHZW5lcmFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdO1xyXG5cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8gPSBvTTNQcmRHZW5lcmFsLlNLVTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkxvdGUgPSBvTTNQcmRHZW5lcmFsLkxPVEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JRCA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiSURcIikgKyAxOyAvL0pBR00sIGNhbWJpbyBkZSBJRCwgY2FzbyBjdWFuZG8gc2UgYWdyZWdhIHByZDoxLCBwcmQ6MiB5IGRlIG51ZXZvIHByZDoxLiBFbiBlc3RlIGNhc28gZW4gbMODwrNnaWNhIGFudGVyaW9yLCBzZSBoYWNlIHJlbW92ZSBkZSBpdGVtLiB5IGxvcyBJRCBxdWVkYWJhbiByZXBldGlkb3MuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5PcmRlbiA9ICt0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9lbmNhYmV6YWRvSXRlbXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTm9tYnJlID0gb00zUHJkR2VuZXJhbC5OT01CUkUxO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuRElTUE9OSUJMRSA9IG9NM1ByZEdlbmVyYWwuRElTUE9OSUJMRTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlBhdGhJbWFnZSA9IG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuQ29kaWdvQmFycmFzID0gb00zUEl0ZW1zV0VCLkNvZGlnb0JhcnJhcztcclxuICAgICAgICAgICAgbGV0IHBUb3RhbEJhc2UgPSB0aGlzLkNhbGN1bGF0ZVByZWNpb0Jhc2Uob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgdGhpcy5vTWF0aFRGLnJvdW5kKGJpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCksIDIpKTtcclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gcFRvdGFsQmFzZSAvIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkUFJFQ0lPVW5pdEJhc2UgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkVG90YWxJbXB1ZXN0b3NUb3RhbCA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwob00zUHJkR2VuZXJhbC5DVEJMRElNUFBSRCwgb00zUEVuY0l0ZW1zLCBwVG90YWxCYXNlLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiBJTklDSU8gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpby50b1N0cmluZygpLCBcIkVTT0JTRVFVSU9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuU0tQMSwgXCJQUkRfRVNUSUxPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIub2JzZXJ2YWNpb24udG9TdHJpbmcoKSwgXCJPQlNFUlZBQ0lPTlwiKSk7ICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiwgXCJQQVRISU1BR0VOXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5CaXNQcm9kdWN0b1Byb21vLnRvU3RyaW5nKCksIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAgICAgLy9EZXRhbGxlcyBkZSBmYWN0dXJhIGVsZWN0cm9uaWNhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocHJvZEdSUFNlbGVjdGVkLlRJUE8sIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5VbmlkYWQsIFwiVU5JREFEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYsIFwiQ0xBVkVQUk9EU0VSVlwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkLCBcIkNMQVZFVU5JREFEXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtcywgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgdGhpcy5jYW1wb3NBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIpXHJcbiAgICAgICAgICAgIHRoaXMuTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvLyBMaXN0YSBkZSBQcm9tb2Npb25lcyBcclxuICAgICAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFBSRUNJT1VuaXRCYXNlLnRvU3RyaW5nKCksIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFRvdGFsSW1wdWVzdG9zVG90YWwudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKHRoaXMub01hdGhURi5yb3VuZCh0aGlzLkdldFVuaXRhcmlvQnlUb3RhbChvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK29NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyAtICtkVG90YWxJbXB1ZXN0b3NVbml0YXJpbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrZFBSRUNJT1VuaXRCYXNlICsgZFVuaXRhcmlvUHJvbW8pLnRvU3RyaW5nKCksIFwiUFVOSVRTSU5JTVBVRVNUT1wiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvIFkgc2luIEltcHVlc3RvcyAvLy0tLS0tLSBOdW5jYSBDYW1iaWEgLy9GUyAyMDE5MDcyNSBDb3JyZWNjaW9uIGVuIGxhIGZvbXJhIGRlIGNhbGN1bGFybG9cclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8udG9TdHJpbmcoKSwgXCJQVU5JVFwiKSk7Ly9TaW4gZGVzY3VlbnRvIGluY2x1aWRvICAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbC50b1N0cmluZygpLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb01vbmVkZXJvLnRvU3RyaW5nKCksIFwiVU5JVEZJREVMXCIpKTsvL1VuaXRhcmlvIGZpZGVsaXphY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFVuaXRhcmlvUHJvbW8udG9TdHJpbmcoKSwgXCJWVU5JVFBST01PXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcblxyXG4gICAgICAgICAgICAvLyoqIEZJTiBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG5cclxuICAgICAgICAgICAgLy8gKioqIEluZm9ybWFjaW9uIGRlIGFjY2lvbmVzIGVuIGVsIGNsaWVudGUgKioqXHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuZW5jb250cmFkb0xvY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiTE9DQUxcIiwgXCJDT05TVUxUT0VOXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiU0VSVklET1JcIiwgXCJDT05TVUxUT0VOXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB0aGlzLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9pZiAoIW9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcikgLy8gKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gKCtvTTNQcm9jZXNvcy5WYWxvck5ldG8pICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyBkZWwgcHJvZHVjdG8gcXVlIHNlIGluZ3Jlc28gYWwgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMudHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGEpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0gPSBcIlByb2R1Y3RvIFJlc3RyaW5naWRvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUEVuY0l0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0cnVlIHNpIGVzdGUgcHJvZHVjdG8gc2UgZW5jdWVudHJhIHJlc3RyaW5naWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBsZXQgcHJvbW9SZXN0cmluZ2lkbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAgICAgaWYgKHByb21vUmVzdHJpbmdpZG8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgbcODwqF4aW1vIHZhbG9yIGRlIHVuIGF0cmlidXRvIGRlbnRybyBkZSBsYSBsaXN0YSBjdWFscXVpZXJhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEobGlzdGEsIGF0cmlidXRvKSB7XHJcbiAgICAgICAgaWYgKGxpc3RhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGxpc3RJRCA9IGxpc3RhLm1hcCh4ID0+IHhbYXRyaWJ1dG9dKTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIGxpc3RJRCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZXMgQ2FsY3VsYWRvcyBwb3IgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZENhbnRpZGFkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgLyoqIElOSUNJTyBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG4gICAgICAgIC8vIHZhciBkVG90YWxJbXB1ZXN0b3MgPSAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpXHJcbiAgICAgICAgLy8gdmFyIGRTdWJUb3RhbCA9IE1hdGgucm91bmQoKCtkUHJlY2lvVG90YWxTaW5EdG8gLSArZFRvdGFsSW1wdWVzdG9zKSAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgICAgIGxldCBzdWJUb3RhbCA9IDA7XHJcbiAgICAgICAgbGV0IHByZWNpb1RvdGFsU2luRHRvID0gMDtcclxuICAgICAgICBsZXQgdG90YWxJbXB1ZXN0b3NcclxuICAgICAgICAvL0FncmVnYXIgSW1wdWVzdG9zXHJcbiAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXMsIGRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgIC8vRlMgMjAxOTA3MjUgQXJyZWdsbyBlbiBlbCBjYWxjdWxvIGRlIHRvdGFsZXMgZW4gY2FzbyBkZSBoYWJlciBpbXB1ZXN0b3NcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vU3VidG90YWwgU3VtYXMgZGUgbGFzIGJhc2VzXHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpICsgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpKSksIDIpO1xyXG4gICAgICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEZyb21JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBcIlZhbG9yXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHN1YlRvdGFsICsgdG90YWxJbXB1ZXN0b3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL1NlIGFzdW1lIHF1ZSBubyBoYXkgaW1wdWVzdG9zIGVudG9uY2VzIGVsIHN1YlRvdGFsIGVzIGlndWFsIGFsIHByZWNpb1RvdGFsU2luRHRvXHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpLCAyKTtcclxuICAgICAgICAgICAgc3ViVG90YWwgPSBwcmVjaW9Ub3RhbFNpbkR0bztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIGRDYW50aWRhZC50b1N0cmluZygpLCBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQodG90YWxJbXB1ZXN0b3MsIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVUVTVE9TXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VW5pdGFyaW9CeVRvdGFsKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVUVTVE9TXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVOSVRcIik7XHJcblxyXG4gICAgICAgIC8vTGEgZmlkZWxpemFjaW9uIGVzIHVuIHBvcmNhbnRhamUgcG9yIGVuZGUgbm8gZGViZSBtdWx0aXBsaWNhcnNlIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlVOSVRGSURFTFwiKS50b1N0cmluZygpLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVU5JVEZJREVMXCIpLlZhbG9yLCBcIkZJREVMSVpBQ0lPTlwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxcIik7XHJcbiAgICAgICAgLy90aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUTkVUT1wiKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFJFQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgcHJlY2lvVG90YWxTaW5EdG8udG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFNJTkRUT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBzdWJUb3RhbC50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgXCJGVVRcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVlVOSVRQUk9NT1wiKSwgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpLnRvU3RyaW5nKCksIFwiUFJFQ0lPVE9UQUxCQVNFXCIpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zICAgICAgICBcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKChzdWJUb3RhbCArICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxJTVBVRVNUT1NcIikuVmFsb3IgLSArb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlRPVEFMUFJPTU9cIikuVmFsb3IpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuXHJcbiAgICAgICAgLyoqIEZJTiBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBzdW1hdG9yaWEgZGUgbG9zIHZhbG9yZXMgZGUgdW4gYXRyaWJ1dG8gZGFkbyBkZWwgYXJyZWdsbyBkZSBpbXB1ZXN0b3NcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gYXRyaWJ1dG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBhdHJpYnV0bzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3VtYXRvcmlhID0gMDtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgc3VtYXRvcmlhID0gc3VtYXRvcmlhICsgKCtpbXB1ZXN0b1thdHJpYnV0b10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VtYXRvcmlhO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWdyZWdhckltcHVlc3RvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZGV0X2N0YmxkX2ltcF9wcmQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ1RCTERJTVBQUkRcIik7XHJcbiAgICAgICAgbGV0IGRldF9wcmVjaW9fdW5pdF9iYXNlID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpO1xyXG4gICAgICAgIGxldCB2YWxvclRvdGFsSW1wdWVzdG9zOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmIChkZXRfY3RibGRfaW1wX3ByZCAmJiBkZXRfcHJlY2lvX3VuaXRfYmFzZSkge1xyXG4gICAgICAgICAgICB2YWxvclRvdGFsSW1wdWVzdG9zID0gdGhpcy5Mb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChkZXRfY3RibGRfaW1wX3ByZC5WYWxvciwgb00zUEVuY0l0ZW1zLCArYmlnRGVjaW1hbC5tdWx0aXBseShkZXRfcHJlY2lvX3VuaXRfYmFzZS5WYWxvciwgY2FudGlkYWQpLCBjYW50aWRhZCwgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JUb3RhbEltcHVlc3RvcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgdmFsb3I6IHN0cmluZywgc0NvbmNlcHRvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RldDogTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgICAgIG9EZXQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IHNDb25jZXB0byk7XHJcbiAgICAgICAgaWYgKG9EZXQpIHtcclxuICAgICAgICAgICAgLy8gRXhpc3RlIEFjdHVhbGl6YVxyXG4gICAgICAgICAgICBvRGV0LlZhbG9yID0gdmFsb3I7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9ObyBleGlzdGUgYWdyZWdhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IudG9TdHJpbmcoKSwgc0NvbmNlcHRvKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB0b3RhbFxyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIE51ZXZhIENhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVW5pdGFyaW8gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VG90YWxCeVVuaXRhcmlvKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NVbml0YXJpbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHVuaXRhcmlvID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBEZXNjVW5pdGFyaW8pLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK2JpZ0RlY2ltYWwubXVsdGlwbHkodW5pdGFyaW8sIGNhbnRpZGFkKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB2YWxvciB1bml0YXJpb1xyXG4gICAgICogQHBhcmFtIGNhbnRpZGFkIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBEZXNjVG90YWwgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0VW5pdGFyaW9CeVRvdGFsKGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIERlc2NUb3RhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCtjYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdG90YWwgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NUb3RhbCkuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArdG90YWwgLyArY2FudGlkYWQ7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBkZXRhbGxlcyByZWxhY2lvbmFkb3MgY29uIGxhIGluZm9ybWFjaW9uIGRlIHN3IGV4dGVybm8uXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw4PCoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDg8KhIGxhIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSXRlbXNJbnRlcmZheihvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9BZGljaW9uYWxlc0ZpbHRlcjogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz47XHJcbiAgICAgICAgICAgIG9BZGljaW9uYWxlc0ZpbHRlciA9IG9BZGljaW9uYWxlcy5maWx0ZXIoYSA9PiBhLkFUUklCVVRPLnN0YXJ0c1dpdGgoXCJDU0lBX1wiKSk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0FkaWNpb25hbGVzRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9BZGljaW9uYWxlc0ZpbHRlcltpXS5WQUxPUiwgb0FkaWNpb25hbGVzRmlsdGVyW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIFxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgZ3VhcmRhcsODwqEgbG9zIG51ZXZvcyBhdHJpYnV0b3MuXHJcbiAgICAgKiBAcGFyYW0gb0FkaWNpb25hbGVzIERlc2RlIGRvbmRlIHNlIHNhY2Fyw4PCoSBsYSBpbmZvcm1hY2nDg8Kzbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvQWRpY2lvbmFsZXM6IEFycmF5PE0zUHJkQWRpY2lvbmFsZXM+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkFEQ19cIiArIG9BZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNhbXBvc0FkaWNpb25hbGVzVG9EZXRhbGxlcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLlZBTE9SLCBcIkNBTUFEQ19cIiArIG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlc1tpXS5BVFJJQlVUTykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uZXMgTm9tYnJlLCBJRC4gYSBkZXRhbGxlIGRlbCBlbmNhYmV6YWRvIGRlIHByb2R1Y3RvIGFncmVnYWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBJbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIEVuY2FiZXphZG8gZGUgaXRlbXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkOiBudW1iZXIsIGFwbGljYWRhcyA9IHRydWUpIHtcclxuICAgICAgICB2YXIgc05vbWJyZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNJZHM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIHNWYWxvcmVzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICYmIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKGFwbGljYWRhcykge1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHggPT4geC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiAheC5BcGxpY2FkYSkuZmlsdGVyKHggPT4geC5Qcm9tb2Npb25Db21iaW5hZGEgPT0gbnVsbCkuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc05vbWJyZXMgPSBzTm9tYnJlcyArIHByb21vLk5vbWJyZSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNJZHMgPSBzSWRzICsgcHJvbW8uSURQcm9tb2Npb24gKyBcIixcIjtcclxuICAgICAgICAgICAgICAgICAgICBzVmFsb3JlcyA9IHNWYWxvcmVzICsgYmlnRGVjaW1hbC5tdWx0aXBseShwcm9tby5WYWxvciwgaUNhbnRpZGFkKSArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YSA9IHsgXCJOT01CUkVTXCI6IHNOb21icmVzLCBcIklEXCI6IHNJZHMsIFwiVkFMT1JFU1wiOiBzVmFsb3JlcyB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGUgZGUgcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gc05vbWJyZXMgXHJcbiAgICAgKiBAcGFyYW0gc0lkcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEluZm9Qcm9tb2Npb25lc0FEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NcIikpO1xyXG5cclxuICAgICAgICAgICAgLy9BaG9yYSBzZSBhZ3JlZ2EgdW5hIGRpbmFtaWNhIHBvciBhdHJpYnV0byBkZSBsYSBwcm9tbyBwYXJhIGZhY2lsaXRhciBsYSByZXRvbWEgZGUgZXN0YSBpbmZvcm1hY2nDg8KzblxyXG4gICAgICAgICAgICBsZXQgbGlzdE5vbWJyZSA9IGRhdGEuTk9NQlJFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RJZCA9IGRhdGEuSUQucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGxldCBsaXN0VmFsb3IgPSBkYXRhLlZBTE9SRVMucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST01PQ19cIiArIF9pKSk7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3RJZFtfaV0sIFwiSURfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdFZhbG9yW19pXSwgXCJWQUxfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YSA9IHRoaXMuR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYSwgaUNhbnRpZGFkLCBmYWxzZSlcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuTk9NQlJFUywgXCJOT01CX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5JRCwgXCJJRF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuVkFMT1JFUywgXCJWQUxfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGEgZGV0YWxsZSBpbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIGluZk5pdmVsZXNQcmNpbyBJbmZvcm1hY2lvbiBkZSBuaXZlbGVzIGRlIHByZWNpb1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBPYmpldG8gZG9uZGUgc2UgY2FyZ2Fyw4PCoSBsYSBpbmZvcm1hY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChpbmZOaXZlbGVzUHJjaW8gJiYgaW5mTml2ZWxlc1ByY2lvLk5JVkVMICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShpbmZOaXZlbGVzUHJjaW8uTklWRUwsIFwiTklWRUxQUkVDSU9cIikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjb24gcXVlIG5pdmVsIGRlIHByZWNpbyB2YSBhIHRyYWJhamFyXHJcbiAgICAgKiBAcGFyYW0gcHJvZEdSUFNlbGVjdGVkIEVsIHByb2R1Y3RvIGluZ3Jlc2Fkb1xyXG4gICAgICogQHBhcmFtIGlDYW50aWRhZCBMYSBjYW50aWRhZCBkZSBwcm9kdWN0b3MgcXVlIHZhIGEgaW5ncmVzYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlcyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCwgaUNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJlc2VudGFjaW9uZXM6IE0zUHJlc2VudGFjaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcE5pdmVsZXMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJlxyXG4gICAgICAgICAgICAgICAgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwTml2ZWxlcyA9IHsgXCJQUkVDSU9cIjogb00zUHJlc2VudGFjaW9uZXMuVkFMT1IsIFwiTklWRUxcIjogb00zUHJlc2VudGFjaW9uZXMuTklWRUxQUlMgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4galJlc3BOaXZlbGVzO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByZWNpb0J5Tml2ZWxlc0dlbmVyYWwob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcyAmJiBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcyA9IG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZmluZCh4ID0+IGlDYW50aWRhZCA+PSB4LlRPUEUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9NM1ByZXNlbnRhY2lvbmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbG9zIGN1cG9uZXMgZ2VuZXJhZG9zIGRlIGxhIGxpc3RhIGRlIHByb21vcHJvY2VzYWRhc1xyXG4gICAgICogQHBhcmFtIG9Qcm9tb2Npb25Qcm9jZXNhZGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBjYW50aWRhZDogbnVtYmVyKTogQXJyYXk8TTNQRGV0YWxsZUN1cG9uPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY3Vwb25lcyA9IEFycmF5PE0zUERldGFsbGVDdXBvbj4oKTtcclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcm9tb19hc29jaWFkYSA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzW19pXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9fYXNvY2lhZGEuSWRDdXBvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXBvbiA9IG5ldyBNM1BEZXRhbGxlQ3Vwb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5JZEN1cG9uID0gcHJvbW9fYXNvY2lhZGEuSWRDdXBvbjtcclxuICAgICAgICAgICAgICAgICAgICBjdXBvbi5DYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RfY3Vwb25lcy5wdXNoKGN1cG9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxpc3RfY3Vwb25lcztcclxuICAgIH1cclxuXHJcbiAgICAvL0FzaWduYXIgYSBwcm9tb2Npb25lcyBjb21iaWFuYXMgZGVzZGUgbG8gcXVlIHNlIGVuY29udHLDg8KzIGFsIGVuY2FiZXphZG8gaXRlbSwgZGVsIHByb2R1Y3RvIHNlbGVjY2lvbmFkb1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhICE9IG51bGwgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vQXNvID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vU2UgYWdyZWdhIHByb21vY2lvbiBjb21iaW5hZGEgYSBlbmNhYmV6YWRvIGRlIGl0ZW1zLlxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMucHVzaChwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vL0FncmVnYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIilcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKEpTT04uc3RyaW5naWZ5KG9NM1BFbmNJdGVtcy5Qcm9tb0NvbWJpbmFkYXMpLCBcIlBST01PQ09NQklcIikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zLCBwcm9tb0Fzby5Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBc2lnbmFyIHByb21vY2lvbmVzIGNvbWJpYW5kYXMgYSBNMyBQcm9jZXNvLCBlc3RlLCB2YWxpZGEgcXVlIG5vIGV4aXN0YSB1biBwcm9tb2Npb24gYW50ZXJpb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzQU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAgICAgaWYgKCFvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKSkge1xyXG4gICAgICAgICAgICAvLy8vLy8vIGV4aXN0ZVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vLy8vLyBObyBFeGlzdGVcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcy5wdXNoKG9Qcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcykge1xyXG4gICAgICAgICAgICB0aGlzLkFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0NhbGN1bG8gZGUgcHJvbW9jaW9uZXNcclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9EYXRhVXNlcjogYW55LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICB2YXIgbFRpcG9zID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkRJUkVDVEFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgbFRpcG9zLnB1c2goXCJNT05FREVST1wiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1BTlVBTFwiKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0VOQ1BST01PICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnJQcm9tbzogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJyUHJvbW8gPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIGxUaXBvcyk7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vY2lvbihhcnJQcm9tbywgcHJvZEdSUFNlbGVjdGVkLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhheSBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgeSBhZ3JlZ2FybG9zLlxyXG4gICAgcHVibGljIFZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5MaXN0T2JzU0tVICE9IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb21vLkxpc3RPYnNTS1UubGVuZ3RoKSBwcm9tby5MaXN0T2JzU0tVID0gW3Byb21vLkxpc3RPYnNTS1VdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tbywgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gcHJvbW8uSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vLCBvTTNQRW5jSXRlbXMsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLmxJZEFjdGl2YVByb21vICYmIHByb21vLmxJZEFjdGl2YVByb21vLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubElkQWN0aXZhUHJvbW8gPSB0aGlzLmxJZEFjdGl2YVByb21vLmNvbmNhdChwcm9tby5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGVzKHRoaXMubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEdXBsaWNhdGVzKGFycjogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciB1bmlxdWUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pcXVlLmluZGV4T2YoYXJyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHVuaXF1ZS5wdXNoKGFycltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY2FudGlkYWRSZWFsID0gTWF0aC5mbG9vcihjYW50aWRhZCAvIHByb21vLkNhbnRpZGFkT2JzZXEpO1xyXG4gICAgICAgIGlmIChwcm9tby5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZFJlYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZFJlYWwgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gcHJvbW8uTGlzdE9ic1NLVTtcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGNvbWJpLkFjY2lvbi5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8ob2JzZXF1aW9zLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ic2VxdWlvcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvcm5hIHRydWUgc2kgaGF5IG90cmEgcHJvbW8gYXBsaWNhZGEgZG9uZGUgbmkgbGEgcHJvbW8gZGUgb2JzZXF1aW8gbyBsYSBhcGxpY2FkYSBzb24gZmlqYXMgeSB1bmEgZGUgbGFzIGRvcyBlcyBFWENcclxuICAgIHZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW9PYnNlcXVpbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAocHJvbW9PYnNlcXVpby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgIGxldCBvUHJvbW9zTm9PYnNlcXVpb3MgPSBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LklEUHJvbW9jaW9uICE9IHByb21vT2JzZXF1aW8uSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9Qcm9tb3NOb09ic2VxdWlvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uQXBsaWNhZGEgJiYgKHByb21vLlJlZ2xhID09IFwiRVhDXCIgfHwgcHJvbW9PYnNlcXVpby5SZWdsYSA9PSBcIkVYQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9wcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvc1xyXG4gICAgcHVibGljIGFzeW5jIFByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IC0xO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3MgIT0gbnVsbCAmJiB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLlNLVSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA4MTAgdmFsaWRhLCBjdWFudG9zIHByb2R1Y3RvcyBzZSBhZ3JlZ2EgZW4gZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTExMiBzZSBhZ3JlZyBmdW5jaW9uYWxpZGFkIGRlIG9ic2VxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLmlkRW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbiA9IFwiT0JTUVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkd1YXJkYXJQcm9tb2Npb24odGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HdWFyZGFyIHByb21vY2lvbiBzZWd1biB1biBza3VcclxuICAgIC8vMS4gQnVzY2FyIGVsIHByb2R1Y3RvIHNlZ3VuIGVsIHNrdVxyXG4gICAgLy8yLiBBZ3JlZ2FyIGVsIHByb2R1Y3RvIGEgbTNwcm9jZXNvc1xyXG4gICAgLy8zLiBBZ3JlZ2FyIGFsIGNhcnJpdG8gZGUgY29tcHJhcy5cclxuICAgIHB1YmxpYyBhc3luYyBHdWFyZGFyUHJvbW9jaW9uKHByb21vLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIDIwMTgxMTIxICB2YXIgc0tleUNhcnJpdG87XHJcbiAgICAgICAgLy8gMjAxODExMjEgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBwcm9jZXNvUHJvbW87XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvLyAyMDE4MTEyMSBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG5cclxuICAgICAgICAvLyAyMDE4MTEyMSBvTTNQcm9jZXNvcyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHByb2Nlc29Qcm9tbyA9IGF3YWl0IHRoaXMuQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb0RhdGFVc2VyKTtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gcG91Y2ggREJcclxuICAgICAgICAvLyAyMDE4MTEyMSAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgcHJvY2Vzb1Byb21vKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbG9zIHByb2R1Y3RvIHNlZ3VuIHN1IFNLVSwgc2FjYW5kbyBsYSBpbmZvcm1hY2lvbiBkZXNkZSBwb3VjaERCLlxyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShwcm9tby5TS1UsIEVuTGluZWEsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcob1Byb2R1Y3RvKTtcclxuICAgICAgICBpZiAob1Byb2R1Y3RvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy9ZYSBubyBzZSBkZWphIHByZWNpbyBjZXJvIHNpbm8gcXVlIGNvbW8gZXMgb2JzZXF1aW8gc2ltdWxhIHVuIGRlc2N1ZW50byBkZWwgMTAwJSBcclxuICAgICAgICAgICAgLy9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGEgbTNwcm9jZXNvcyBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgLy9vTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBvUHJvZHVjdG8sIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgdGhpcy5nc0lka2F0aW9zLCBvTTNVYmljYWNpb24sIG51bGwsIG9NM1Byb2Nlc29zLCBudWxsLCAxMDApOy8vKlNlIG1hbmRhIHZhbG9yIGRlIGRlc2N1ZW5udG8gMTAwICVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBzZWd1biBlbCBTS1VcclxuICAgIHB1YmxpYyBhc3luYyBHZXRQcm9kdWN0b0J5U0tVKHNTS1UsIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSwgZGlzcG9uaWJsZU0zRW5jID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RvcztcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5HZW5lcmF0ZURhdGFWYWxpZGFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28pO1xyXG4gICAgICAgIGlmICghRW5MaW5lYSAmJiAhb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSB7XHJcbiAgICAgICAgICAgIHZhciBzSURQcm9kdWN0b3MgPSB0aGlzLmdzSWRrYXRpb3MgKyBcIj9QUkRcIjtcclxuICAgICAgICAgICAgcHJvZHVjdG9zID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb2R1Y3Rvcyk7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldE0zUHJkR3JwRnJvbUxpc3QocHJvZHVjdG9zLk0zTGlzdFByb2R1Y3Rvcy5NM0dSUCwgc1NLVSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmModGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcywgc1NLVSwgb0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDw9IDAgJiYgZGlzcG9uaWJsZU0zRW5jKSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFID0gZGlzcG9uaWJsZU0zRW5jO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCB0aGlzLkdvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLlZhbGlkYXJMaXN0YVByZWNpb3Mob1Byb2R1Y3RvLCB0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIHNpbiBpbXB1ZXN0b3MuIExhIGZvcm1hIGVzIGNhbGN1bGFyIHRvZG8gZWwgdmFsb3IgZGVsIGltcHVlc3RvLiBFSjogMTIwLjA5IC8gMS4xNi4gU2kgZWwgdmFsb3IgZGVsIGltcHVlc3RvIGVzOiAxNiVcclxuICAgIHB1YmxpYyBDYWxjdWxhdGVQcmVjaW9CYXNlKENUQkxESU1QUFJEOiBzdHJpbmcsIGRWYWxvck5ldG86IG51bWJlcikge1xyXG4gICAgICAgIC8vdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHZhciBkVmFsb3JCYXNlOiBudW1iZXIgPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAgMjAxOTA2MjYgQ2FtYmlvIGRlIGNhbGN1bG8gZGUgYmFzZSBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAvICgxICsgK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC0gKCtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvTTNQRW5jSXRlbXMuTTNJbXB1ZXN0b3MpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JldHVybiAoKCtkVmFsb3JOZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgICAgICByZXR1cm4gZFZhbG9yQmFzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBpbmZvcm1hY2nDg8KzbiBkZSBpbXB1ZXN0b3MsIGRlc2RlIGVsIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChDVEJMRElNUFBSRDogc3RyaW5nLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLFxyXG4gICAgICAgIGRWYWxvck5ldG86IG51bWJlciwgY2FudGlkYWQ6IG51bWJlciwgdmFsb3JUb3RhbFByb2R1Y3RvVW5pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgb00zUEltcHVlc3RvczogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JCYXNlVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoZFZhbG9yTmV0bywgMik7XHJcbiAgICAgICAgICAgIGxldCB2YWxvck5ldG9Ub3RhbCA9IHZhbG9yQmFzZVRvdGFsO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclRvdGFsUHJvZHVjdG9Vbml0LCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNiBDYW1iaW8gZW4gb3JkZW4gZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclJlYWxJbXAgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXAgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUT1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zID0gbmV3IE0zUEltcHVlc3RvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8gPSBpbXAuJC5Db2RJbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Qb3JjZW50YWplID0gaW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7Ly9QT1JDRU5UQUpFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KGltcC4kLlZhbG9yLCB2YWxvck5ldG9Ub3RhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ly9GSUpPXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBOdWV2byBjb25jZXB0byBkZSBiYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5CYXNlID0gdmFsb3JOZXRvVG90YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG8gPSAoK2RUb3RhbEltcHVlc3RvKSArICgrb00zUEltcHVlc3Rvcy5WYWxvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBTdW1hIGRlIFZhbG9yIE5ldG9cclxuICAgICAgICAgICAgICAgICAgICB2YWxvck5ldG9Ub3RhbCA9ICgrdmFsb3JOZXRvVG90YWwpICsgKCtvTTNQSW1wdWVzdG9zLlZhbG9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8vU29sbyBhZGljaW9uZSBhIGltcHVlc3RvcywgY3VhbmRvIGVzIHRvdGFsIGltcHVlc3Rvc1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXBFeGlzdGU6IE0zUEltcHVlc3RvcztcclxuICAgICAgICAgICAgICAgICAgICBpbXBFeGlzdGUgPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZpbmQoaW1wID0+IGltcC5Db2RJbXB1ZXN0byA9PSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wRXhpc3RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQm9ycmEgZW4gaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maWx0ZXIoaW1wID0+IGltcC5Db2RJbXB1ZXN0byAhPSBvTTNQSW1wdWVzdG9zLkNvZEltcHVlc3RvKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5wdXNoKG9NM1BJbXB1ZXN0b3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MjYgc2UgYWdyZWdhIHZhbGlkYWNpb24sIHlhIHF1ZSBlc3RhYmEgcXVlZGFuZG8gbGEgcmVzdGEsIGNvbiB2YWxvcmVzIGNvbW86IDAuMDAwMDAwMDAwMDEgPSAxLjE1NjQ1NjQ1NjRlODQ1IEVKXHJcbiAgICAgICAgICAgIGlmIChkVG90YWxJbXB1ZXN0byAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL0RpZmVyZW5jaWEgcmVkb25kZWFkYSBhIGRvcyBkZWNpbWFsZXNcclxuICAgICAgICAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gdGhpcy5vTWF0aFRGLnJvdW5kKGRUb3RhbEltcHVlc3RvLCAyKTtcclxuICAgICAgICAgICAgICAgIGxldCBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHZhbG9yQmFzZVRvdGFsIC0gZFRvdGFsSW1wdWVzdG8pLCAyKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlSW1wdWVzdG9zKG9NM1BFbmNJdGVtcywgZGlmZXJlbmNpYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gXCJUT1RBTElNUFVFU1RPU1wiXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKCh2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtIHZhbG9yQmFzZVRvdGFsKSwgMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDcyNVxyXG4gICAgICogQ29ycmlnZSBlbCB2YWxvciBxdWUgdG9tbyBlbCBpbXB1ZXN0byBkZXNwdWVzIGRlIGhhYmVyc2UgcmVkb25kZWFkb1xyXG4gICAgICogU2kgYWwgcmVjb3JyZXIgdG9kb3MgbG9zIGltcHVlc3RvcyBsYSBkaWZlcmVuY2lhIG5vIHNlIHphbmphLCBOSSBNT0RPUyBlbCBlcnJvciBlc3TDg8KhIGVuIG90cmEgcGFydGVcclxuICAgICAqIFNlIGNyZWEgZXN0YSBmdW5jacODwrNuIHBhcmEgcmVzb2x2ZXIgbG9zIGVycm9yZXMgZGUgdGltYnJhZG8gZGUgZmFjdHVyYSBlbGVjdHLDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIERpZmVyZW5jaWEgcXVlIHNlIGRlYmUgc2FsZGFyIHBhcmEgY29uc2VndWlyIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyByZXF1ZXJpZG9cclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZGlmZXJlbmNpYTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgcG9zaXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWVub3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGlmIChkaWZlcmVuY2lhID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhYmFqbyBxdWllcmUgZGVjaXIgcXVlIHNlIHB1ZG8gcmVkb25kZWFyIGhhY2lhIGFycmliYVxyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFycmliYVwiIHkgcmVzdGEgdW5hIGNlbnRlc2ltYSBhIGxhIGRpZmVyZW5jaWFcclxuICAgICAgICAgICAgICAgIGlmIChpbXB1ZXN0by5WYWxvciA8IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5WYWxvciA9IGltcHVlc3RvLkxpbWl0ZU9wdWVzdG87XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uQmFzZSA9IHRoaXMub01hdGhURi5yb3VuZChpbXB1ZXN0by5WYWxvciAvIGltcHVlc3RvLlBvcmNlbnRhamUsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGRpZmVyZW5jaWEgPSBkaWZlcmVuY2lhIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vU2kgVmFsb3I+VmFsb3JSZWFsIHF1aWVyZSBkZWNpciBxdWUgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9TaSBsYSBkaWZlcmVuY2lhIGVzIG5lZ2F0aXZhIHF1aWVyZSBkZWNpciBxdWUgbGEgc3VtYSBkZSBsb3MgaW1wdWVzdG9zIGVzIG1heW9yIGEgbGEgcmVhbFxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vU2kgZWwgaW1wdWVzdG8gc2UgcmVkb25kZW8gaGFjaWEgYXJyaWJhIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYWJham9cclxuICAgICAgICAgICAgICAgIC8vRW50b25jZXMgbG8gXCJyZWRvbmRlYSBoYWNpYSBhYmFqb1wiIHkgc3VtYSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yID4gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcjxWYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhYmFqbyB5IG5vIGRlYmUgbW9kaWZpY2FyIGVzZSB2YWxvclxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIHlhIHNlIHNhbGRvIGxhIGRpZmVyZW5jaWEgcm9tcGUgZWwgY2ljbG8gZGFuZG8gcG9yIGNvbmNsdWlkbyBlbCBhanVzdGVcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9Mb2FkIHBvciB1bmlkYWQgZGV0YWxsZSBkZWwgbTNwcm9jZXNvIGl0ZW1zLlxyXG4gICAgcHVibGljIExvYWRNM1BEZXRhbGxlKHNWYWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZyk6IE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtcy5Ob21icmVDb25jZXB0byA9IHNDb25jZXB0bztcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gc1ZhbG9yO1xyXG4gICAgICAgIHJldHVybiBvTTNQRGV0YWxsZUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0dlbmVyYXIgcHJvbW9jaW9uIGNvbWJpbmFkYVxyXG4gICAgcHVibGljIGFzeW5jIEdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgfHwgKG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMgJiYgIW9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMuZmluZCh4ID0+IHguTm9tYnJlID09IFwiUFVFTlRFX0RJQVJJT1wiKSkpIHtcclxuICAgICAgICAgICAgdmFyIG9wcm9tb2Npb25lc1NlcnZpY2UgPSBuZXcgcHJvbW9jaW9uZXNTZXJ2aWNlKG9EYXRhVXNlciwgbnVsbCk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhckNvbWJpbmFkYShvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9Db21wYXJlIE0zUHJvY2Vzb3MuIChGaXJzdDogQFBhcmFtOiBpbE0zUHJvY2Vzb3NTUUwgVlMgU2Vjb25kOiBHZXQgRnJvbSBDb3VjaERCL1BvdWNoREIpXHJcbiAgICBwdWJsaWMgYXN5bmMgQ29tcGFyZU0zUHJvY2VzbyhzSURLYXRpb3M6IHN0cmluZywgb00zRGF0YTogTTNEYXRhLCBvRGF0YVVzZXI6IGFueSwgaWxNM1Byb2Nlc29zU1FMOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9SZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIHZhciBQcm9wZXJ0eUNvbXBhcmUgPSBbXCJWYWxvck5ldG9cIiwgXCJWYWxvclwiXTtcclxuICAgICAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcm9jZXNvc0NPVUNIOiBNM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB2YXIgYlJlc3A6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICAvL0dldCBkYXRhLCBmcm9tIFBvdWNoREIvQ291Y2hEQlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNIID0gYXdhaXQgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0byk7XHJcblxyXG4gICAgICAgICAgICAvL1N0YXJ0IENvbXBhcmVcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQcm9wZXJ0eUNvbXBhcmUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpbE0zUHJvY2Vzb3NTUUxbUHJvcGVydHlDb21wYXJlW2ldXSAhPSBvTTNQcm9jZXNvc0NPVUNIW1Byb3BlcnR5Q29tcGFyZVtpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYlJlc3ApIHtcclxuICAgICAgICAgICAgICAgIC8vQ29tcGFyZTogSUQsIElkUHJvZHVjdG8geSBDQU5USURBRFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbE0zUHJvY2Vzb3NTUUwuTTNFTkMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JRCAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uSUQgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5JZFByb2R1Y3RvICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JZFByb2R1Y3RvIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0guTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciAhPSBpbE0zUHJvY2Vzb3NTUUwuTTNFTkNbal0uTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IGJSZXNwLCBcIk0zUHJvY2Vzb3NcIjogb00zUHJvY2Vzb3NDT1VDSCB9O1xyXG4gICAgICAgICAgICByZXR1cm4gb1Jlc3A7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciBDb21wYXJlTTNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIG9SZXNwID0geyBcImJSZXNwXCI6IHRydWUsIFwiTTNQcm9jZXNvc1wiOiBudWxsIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FkaWNpb25hciBjb21lcmNpYWwgYWwgcHJvY2VzbywgbG8gYWRpY2lvbmEgYWwgYXJyZWdsbyBkZSBkaW5hbWljb3MgYXNvY2lhZG8gYWwgcHJvY2Vzby5cclxuICAgIHB1YmxpYyBBZGRDb21lcmNpYWxUb00zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVGRvY0NvbWVyY2lhbDogc3RyaW5nLCBOZG9jQ29tZXJjaWFsOiBzdHJpbmcpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiVENPTUVSQ0lBTFwiLCBUZG9jQ29tZXJjaWFsKSk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5DT01FUkNJQUxcIiwgTmRvY0NvbWVyY2lhbCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3JlYWNpb24geSByZXRvcm5vIGRlIHR1cGxhIGRlIGRpbmFtaWNvcywgYXRhZG9zIGEgcHJvY2VzbyBtMy5cclxuICAgIHB1YmxpYyBDcmVhdGVUdXBsYURpbmFtaWNhKG5vbWJyZSwgdmFsb3IpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IG5vbWJyZTtcclxuICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gdmFsb3I7XHJcblxyXG4gICAgICAgIHJldHVybiBvTTNQRGluYW1pY2FzO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9BY3R1YWxpemEgbGEgY2FudGlkYWQgZGUgXHJcbiAgICBwdWJsaWMgc2V0Q2FudGlkYWRBTExZVVBEQ291Y2gob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM0RhdGE6IE0zRGF0YSxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlDYW50aWRhZCkge1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIFwiV0VCXCIsIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLkRlbGV0ZU0zUHJvY2VzbyhvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcykudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcyA9IG5ldyBNM1Byb2Nlc29zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vL1NlIGNhbnRpZGFkIGRlIHVuIHByb2R1Y3RvIGVzcGVjaWZpY29cclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbixcclxuICAgICAgICBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBpZFByb2R1Y3RvLCBMb3RlLCBpQ2FudGlkYWQsIHRpcG9VYmljYWNpb24sIElERW5jLFxyXG4gICAgICAgIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBmb3J6YXJCb3JyYWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAoKGlDYW50aWRhZCA9PSAwICYmIG9NM1Byb2Nlc29zLklERGlhcmlvID09PSB1bmRlZmluZWQgJiYgdGlwb1ViaWNhY2lvbiA9PSBcIldFQlwiKSB8fCBmb3J6YXJCb3JyYWQpIHtcclxuICAgICAgICAgICAgLy8vQXVuIG5vIGVzdGEgcmVnaXN0cmFkbyBlbCBwcm9jZXNvIGNvbW8gdGFsLCBzZSBwdWVkZSBib3JyYXIgZGUgcmFpelxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihwcm9kID0+ICEocHJvZC5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgcHJvZC5JRCA9PSBJREVuYykgJiYgIShwcm9kLklkRW5jUGFkcmUgPT0gSURFbmMpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gMDtcclxuICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEpBR00gMjAxOTEwMjEsIG5vIGhhY2VyIGzDg8KzZ2ljYSBkZSBwcm9tb2Npb25lcyB5IHZhcmlvcywgY3XDg8KhbmRvIHNlIGJvcnJhIGVsIGl0ZW0uXHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmluZChlbmMgPT4gZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhbnRpZGFkVjIob00zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8pLnRoZW4ocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24sIHJlc3AuTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYW1iaWFyIGNhbnRpZGFkIGRlIG0zcHJvY2Vzb1xyXG4gICAgLy9KQUdNIDIwMTkxMDE4IFNlIGFncmVnYSBudWV2YSBmdW5jaW9uYWxpZGFkIGEgbGEgY2FudGlkYWQ6IFxyXG4gICAgLy8xLlNlIGJvcnJhIGVsIHByb2R1Y3RvIGRlIGxhIGxpc3RhIGRlbCBwcm9jZXNvXHJcbiAgICAvLzIuIFNlIGFncmVnYSBkZSBudWV2byBlbCBwcm9kdWN0byBjb24gbGEgbnVldmEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyOiBhbnlcclxuICAgICAgICAsIHNJREthdGlvczogc3RyaW5nLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPikge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTE0LCBBZ3JlZ2FyIGltYWdlblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKTtcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUEVuY0l0ZW1zLlBhdGhJbWFnZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIShlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgKGVuYy5JRCA9PSBJREVuYyB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykpKTtcclxuXHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKGlkUHJvZHVjdG8sIHRydWUsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0byk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiB7IFwiTTNQcm9jZXNvXCI6IG9NM1Byb2Nlc29zLCBcIk0zUEl0ZW1zV0VCXCI6IG9NM1BJdGVtc1dFQiB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGNhbnRpZGFkIGRlIHVuIGVuY2FiZXphZG8sIHByb2R1Y3RvIGVzcGVjaWZpY28uXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9kdWN0bzogTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9Qcm9kdWN0by5TS1UgJiYgZW5jLkxvdGUgPT0gb1Byb2R1Y3RvLkxPVEUpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL1JFR0lPTiBERSBSRUNFUENJT05cclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgcmVjZXBjaW9uXHJcbiAgICBwdWJsaWMgTWVyZ2VSZWNlcFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUmVjZXBjaW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5maWx0ZXIocmVjZXAgPT4gcmVjZXAuSWRSZWNlcGNpb24gPT0gaWRSZWNlcGNpb24pLmZvckVhY2gocmVjID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JRCA9PSByZWMuSWRFbmMpLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShyZWMuQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDVVJDUkVDXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow4PCrSBtaXNtbyBhZ3JlZ2EgbcODwqFzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNSZWMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDUkVDXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL0ZJTiBSRUdJT04gREUgUkVDRVBDSU9OXHJcblxyXG4gICAgLy8vLy8vL1JFR0lPTiBFTlRSRUdBXHJcbiAgICAvL1NlIGFncmVnYSBhdHJpYnV0byBkZSBDdXJyZW50IGNhbnRpZGFkIGRlIGVudmlvXHJcbiAgICBwdWJsaWMgTWVyZ2VFbnRwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQRW52aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQRW52aW9zLmZvckVhY2goZW52ID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBsRW5jOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgICAgICBsRW5jID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiBlbmMuSWRFbnZpbyA9PSBlbnYuSWRFbnZpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxFbmMgIT09IHVuZGVmaW5lZCAmJiBsRW5jICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsRW5jLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IsIFwiQ1VSQ0VOVFwiKSk7Ly9DVVJSRU5UIENBTlRJREFEIFJFQ0VQQ0lPTlxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow4PCrSBtaXNtbyBhZ3JlZ2EgbcODwqFzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNFbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDRU5UXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgLy8vLy8vL0ZJTiBSRUdJT04gRU5UUkVHQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21vY2lvbmVzIHF1ZSBzZSBwcm9jZXNhbiBkZXNwdWVzIGRlIGFncmVnYXIgYWwgY2Fycml0b1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhVXNlciBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKiBAcGFyYW0gb00zVWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIEVuTGluZWEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBQcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbikge1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLlByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FyIHByb21vY2lvbmVzIGRlc3B1ZXMgZGUgZmluYWxpemFyIGVsIHJlZ2lzdHJvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jUHJvbW9BZnRlckZpbmFsaXphcihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG5cclxuICAgICAgICB0aGlzLkdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICB0aGlzLlByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgbFRpcG9zUHJvbW8gPSBuZXcgQXJyYXk8U3RyaW5nPigpO1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBsVGlwb3NQcm9tby5wdXNoKFwiQUZURVJcIik7XHJcbiAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgbnVsbCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zUHJvbW8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vQWZ0ZXIoYXJyUHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIGEgaW5mb3JtYWNpb24gZGluYW1pY2EgZGVsIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIDApO1xyXG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJWQUxfUFJPTU9DXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24udG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5PTUJfUFJPTU9DXCIsIGRhdGEuTk9NQlJFUylcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIklEX1BST01PQ1wiLCBkYXRhLklEKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBwcm9jZXNvIGFzb3NpYWRvIGEgdW4gaWRwcmVzdGFtb3NcclxuICAgIGFzeW5jIGdldF9tM19wcm9jZXNvX2J5X2lkX3ByZXN0YW1vX2FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9nZXRNM1Byb2Nlc29CeUlkUHJlc3RhbW8vJyArIGlkX2thdGlvcyArICcvJyArIGlkX3ByZXN0YW1vKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDb25jZXB0b00zU2FsZG9zSXRlbVViLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIG8gbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgZGVudHJvIGRlbGEgbGlzdGEgZGUgdW4gUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb2R1Y3RvVG9PdHJhc0NsYXMocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBjYW50aWRhZDogbnVtYmVyLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IHRoaXMudmFsaWRhckV4aXN0YU90cmFDbGFzaWYob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgcHJvZHVjdCk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvRXhpc3RlKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkID0gcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgKyBjYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzID0gbmV3IE0zT3RDbGFzaWZpY2FjaW9uZXMoKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5Ob21icmUgPSBwcm9kdWN0VW5pdFNlbGVjdGVkLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklEID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIklEXCIpICsgMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5wdXNoKG9NM090Q2xhc2lmaWNhY2lvbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIHBvbmllbmRvIHN1IHZhbG9yIHkgY2FudGlkYWQgZW4gY2Vyb1xyXG4gICAgICogQHBhcmFtIG9NM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZGVsZXRlUHJvZHVjdG9Gcm9tT3RyYXNDbGFzKG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9BY3R1YWwgPSBpb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5DYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLlZhbG9yID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGEgZWwgdmFsb3IgZGUgTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgYSBwYXJ0aXIgZGUgbGEgc3VtYXRvcmlhIGRlIGxvcyBvYmpldG9zIGRlbnRybyBkZWwgYXJyZWdsbyBNM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgPSBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnJlZHVjZShmdW5jdGlvbiAoc3VtYSwgb00zT3RDbGFzaWZpY2FjaW9uZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bWEgKyBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvcjtcclxuICAgICAgICB9LCAwKVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsYSBleGlzdGVuY2lhIGRlIHVuIHByb2R1Y3RvIGRlbnRybyBkZSB1biBsYSBsaXN0YSBkZSBNM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqL1xyXG4gICAgdmFsaWRhckV4aXN0YU90cmFDbGFzaWYobGlzdE0zT3RDbGFzaWZpY2FjaW9uZXM6IEFycmF5PE0zT3RDbGFzaWZpY2FjaW9uZXM+LCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSBsaXN0TTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uU0tVKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9FeGlzdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogTGltcGlhIGxvcyBkZXRhbGxlcyB5IGxvcyBpbXB1ZXN0b3MgZGUgdW4gcHJvZHVjdG8gZGFkbyBlbiB1biBwcm9jZXNvIGRlIGRldm9sdWNpb25cclxuICAgKiBAcGFyYW0gcHJvZHVjdG9Cb3JyYWRvIFxyXG4gICAqIEBwYXJhbSBwcm9jZXNvRGV2b2x1Y2lvbiBcclxuICAgKi9cclxuICAgIGRlbGV0ZVByZERldm9sdWNpb24ocHJvZHVjdG9Cb3JyYWRvLCBwcm9jZXNvRGV2b2x1Y2lvbjogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0byA9IHByb2Nlc29EZXZvbHVjaW9uLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdG9Cb3JyYWRvLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0bykge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5NM0RFVC5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKCtkZXQuVmFsb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFqdXN0YSBsb3MgVmFsb3JlcyBlbiBjYXNvIGRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBwYXJhIHBvZGVyIGdlbmVyYXIgRkVcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yVmFsb3Jlc0NGRElGcm9udChvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBkaWZlcmVuY2lhID0gMDtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3MpO1xyXG5cclxuICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKG9NM1Byb2Nlc29zLlZhbG9yTmV0byAtIChvTTNQcm9jZXNvcy5WYWxvciArIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyAtIHRvdGFsRGVzY3VlbnRvcyksIDMpO1xyXG4gICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBwcm9tb2Npb25lcyBhcGxpY2FkYXMgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDg8KzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0YWxsZVByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICAgICAgaWYgKGRldGFsbGVQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgdG90YWxEZXNjdWVudG9zICs9ICtkZXRhbGxlUHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsRGVzY3VlbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgaW1wdWVzdG9zIGNvYnJhZG9zIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw4PCs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgZW5jLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgKz0gK2ltcC5WYWxvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbEltcG9ydGVJbXB1ZXN0b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBpbXB1ZXN0byBlbiAwLjAxIHkgc3UgY29ycmVzcG9uZGllbnRlIGJhc2UgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgYWp1c3RvID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGltcCBvZiBlbmMuTTNQSW1wdWVzdG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gaW1wLlZhbG9yIC8gaW1wLlBvcmNlbnRhamU7XHJcbiAgICAgICAgICAgICAgICBhanVzdG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFqdXN0bykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBkZXNjdWVudG8gZW4gMC4wMSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgZGV0YWxsZVRvdGFsUHJvbW86IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVRvdGFsUHJvbW8gJiYgK2RldGFsbGVUb3RhbFByb21vLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yIC0gMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciArIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFByZHNHZW5lcmFsRnJvbU0zUHJvY2Vzby8nICsgc0lkS2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVHJ4IHtcclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGVsIGRpYXJpbyBkZSB0cmFuc2FjY2lvbmVzIGRlc2RlIHNlcnZpY2lvIHJlc3QgTTNUcnguIE1pY3Jvc2VydmljaW8gTTMuXHJcbiAgICBwdWJsaWMgTTNfR2V0RGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9NM19HZXREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YURpYXJpbztcclxuICAgICAgICAgICAgb0RhdGFEaWFyaW8gPSByZXNwO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhID0gbmV3IEFycmF5KG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGRpYXJpbyBkZSB0cmFuc2FjY2lvbmVzIGRldGFsbGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19nZXREaWFyaW9UcngoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9tM19nZXREaWFyaW9UcngvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFEaWFyaW87XHJcbiAgICAgICAgICAgIG9EYXRhRGlhcmlvID0gcmVzcDtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8gPSBuZXcgQXJyYXkob0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSB0cmFuc2FjY2lvbi5cclxuICAgIHB1YmxpYyBNM19HZXRJbmZvVFJYKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vbGV0IGRhdGEgPSB7ICdUb3AnOiB0b3AgfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L00zX0dldEluZm9UUlgvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YVRSWDtcclxuICAgICAgICAgICAgb0RhdGFUUlggPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TID0gbmV3IEFycmF5KG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUy5mb3JFYWNoKHRpcG8gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpcG8uVFJYLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlwby5UUlggPSBuZXcgQXJyYXkodGlwby5UUlgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9EYXRhVFJYKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9DYW1iaW8gZGUgZXN0YWRvIGRlIHViaWNhY2lvblxyXG4gICAgcHVibGljIENhbWJpb0VzdGFkb1ViaWNhY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb00zVWJpY2FjaW9uOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNUcngvQ2FtYmlvRXN0YWRvVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcblxyXG4gICAgLy9DYW1iaW8gZGUgZXN0YWRvIGRlIEhVQlxyXG4gICAgcHVibGljIENhbWJpb0VzdGFkb0h1YihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb00zVWJpY2FjaW9uOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNUcngvQ2FtYmlvRXN0YWRvSHViLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmVjTGlzdFByZWNpb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVjLWxpc3QtcHJlY2lvcy50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZUxpc3RhUHJlY2lvIHtcclxuXHJcbiAgICBwcml2YXRlIGdvRGF0YTogYW55O1xyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBhbnk7XHJcbiAgICBwcml2YXRlIGxQcmVjaW9zU2VsZWN0ZWQ6IHN0cmluZyA9IFwiLTFcIjtcclxuXHJcbiAgICAvL0dlbmVyYXIgSlNPTiBnZW7Dg8KpcmljbywgcGFyYSB2YWxpZGFyIGxhIGxpc3RhIGRlIHByZWNpb1xyXG4gICAgY29uc3RydWN0b3IobG9nZWRfdXNlcjogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBvRGF0YSA9IHsgXCJVU0VSXCI6IGxvZ2VkX3VzZXIsIFwiUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH1cclxuICAgICAgICB0aGlzLmdvRGF0YSA9IG9EYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TGlzdGFQcmVjaW9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBJZEthdGlvcztcclxuICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgdmFyIG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcztcclxuICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSB0aGlzLkdldExQcmVjaW9zSW5TdG9yYWdlKElkS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYoIW9MaXN0UHJlY0xQKXtcclxuICAgICAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MsIEpTT04uc3RyaW5naWZ5KGxQcmVjaW8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhsUHJlY2lvKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MsIGxQcmVjaW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKipcclxuICAgICAqIE9idGVuZXIgbGlzdGEgZGUgcHJlY2lvcyBkZXNkZSBzdG9yYWdlIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExQcmVjaW9zSW5TdG9yYWdlKGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIHNQcmVjaW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdMUFwiICsgZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgdmFyIG9QcmVjaW9zOmFueTtcclxuICAgICAgICBpZihzUHJlY2lvcyl7XHJcbiAgICAgICAgICAgIG9QcmVjaW9zID0gSlNPTi5wYXJzZShzUHJlY2lvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJlY2lvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9CdXN1Y2FyIGxhIGxpc3RhIGRlIHByZWNpbywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgRmluZExQcmVjaW8ob0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAgIT0gbnVsbCAmJiBvTGlzdFByZWNMUC5JRCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLklEICE9IG51bGwpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJlYyBvZiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFQTFJlZ2xhKHByZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhwcmVjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIHJlZ2xhcywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgVmFsaWRhckFQTFJlZ2xhKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcyk6IGJvb2xlYW57XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTGlzdFByZWNMUC5Qcm9waWVkYWQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRU1QUkVTQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdzSWRLYXRpb3MudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVCSUNBQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuUHJvY2Vzby50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhVQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLklESFVCLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hW29MaXN0UHJlY0xQLlByb3BpZWRhZC50b1VwcGVyQ2FzZSgpLnRyaW0oKV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2ggKGV4KXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogXCIgKyBleClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihiUmVzcCl7XHJcbiAgICAgICAgICAgIHRoaXMubFByZWNpb3NTZWxlY3RlZCA9IG9MaXN0UHJlY0xQLkxpc3RhUHJlY2lvcztcclxuICAgICAgICAgICAgdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIENvbXBhcmUodmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjb25maWd1cmFjaW9uL2VuY2FiZXphZG8gbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmZpZ0xpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMywgSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2Uob0xpc3RQcmVjTFAsSWRLYXRpb3MpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdFByZWNMUDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RpblByb2Nlc29ze1xyXG4gICAgcHVibGljIGlkX3Byb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIGlkX3N1Yl9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9kaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGlwb19kaW5hbTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0dWxvOnN0cmluZztcclxuICAgIHB1YmxpYyBlc3RydWN0dXJhX2Rlc3Rpbm86IHN0cmluZztcclxuICAgIHB1YmxpYyBWRGVmYXVsdDogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkUGFja0RldCB7XHJcbiAgICBwdWJsaWMgTE9URTogc3RyaW5nO1xyXG4gICAgcHVibGljIExPVEVISUpPOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgU0tVSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1BhY2s6IHN0cmluZztcclxuICAgIHB1YmxpYyBnc1BhdGhJbWFnZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgcHVibGljIE0zR1JQID0gbmV3IFR5cGVNM1ByZEdycCgpO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JBZGljaW9uYWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBJZEdycDogc3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1ViaUFkaWNpb25hbGVze1xyXG4gICAgcHVibGljIEF0cmlidXRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNVYmlBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zSHVicyB9IGZyb20gXCIuL20zLWh1YnMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9ue1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9VYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvY0FkbWluOnN0cmluZztcclxuICAgIHB1YmxpYyBKQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgU2VyaWU6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvSUQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zVWJpQWRpY2lvbmFsZXM6QXJyYXk8TTNVYmlBZGljaW9uYWxlcz47XHJcbiAgICBwdWJsaWMgTTNIVUJTID0gbmV3IEFycmF5PE0zSHVicz4oKTtcclxuICAgIHB1YmxpYyBGZWNoYVRyYWJham86RGF0ZTtcclxuICAgIHB1YmxpYyBBUExVYmljRXh0ZXJuYXM6Qm9vbGVhbjtcclxuICAgIFxyXG59IiwiaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSBcIi4vTTNDT05ESVBST01PLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNDT05ESUFHUlVQQUNJT057XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQWdydXBhY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgT3BlcmFkb3I6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBNM0NPTkRJUFJPTU86QXJyYXk8TTNDT05ESVBST01PPjtcclxufSIsImltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gXCIuL00zREVUQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmNlcHRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNERVRDT05ESVBST01POiBBcnJheTxNM0RFVENPTkRJUFJPTU8+O1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RFVENPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gXCIuL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNFTkNQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvMjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmlnZW5jaWE6RGF0ZTtcclxuICAgIHB1YmxpYyBJbmljaW86RGF0ZTtcclxuICAgIHB1YmxpYyBFc3RhZG86Ym9vbGVhbjtcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBFc3RhZG9NYW51YWxlczpib29sZWFuID1mYWxzZTtcclxuICAgIHB1YmxpYyBFc01hbnVhbDpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvQXBsQ3Vwb246Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNBcGxDdXBvbjpib29sZWFuPSBmYWxzZTtcclxuICAgIHB1YmxpYyBUb3BlOm51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESUFHUlVQQUNJT046QXJyYXk8TTNDT05ESUFHUlVQQUNJT04+O1xyXG59IiwiaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcInByb2plY3RzL3JlZ2xhbmVnb2Npb20zMS9zcmMvcHVibGljX2FwaVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9uU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbjtcclxuICAgIGNvbnN0cnVjdG9yKG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24pIHtcclxuICAgICAgICB0aGlzLmdvTTNVYmljYWNpb24gPSBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldERpcmVjY2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiRElSRUNDSU9OXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRUZWxlZm9ubygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiVEVMRUZPTk9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxPTkdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExhdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiTEFUXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEFkaWNpb25hckJ5QXRyaWJ1dGUoQXRyaWJ1dG86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsOiBNM1ViaUFkaWNpb25hbGVzID0gdGhpcy5nb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkF0cmlidXRvID09IEF0cmlidXRvKTtcclxuICAgICAgICAgICAgaWYgKG9BZGljaW9uYWwgIT09IHVuZGVmaW5lZCAmJiBvQWRpY2lvbmFsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvQWRpY2lvbmFsLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1jYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzb1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNSZWdNYXNpdm8ge1xyXG5cclxuICAgIHByaXZhdGUgZ3NJZEthdGlvczogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSByZWFkZXI6IEZpbGVSZWFkZXI7XHJcbiAgICBwcml2YXRlIHNlcGFyYWRvcjogc3RyaW5nID0gXCIsXCI7XHJcbiAgICBwcml2YXRlIG9NM1Byb2Nlc28gPSBuZXcgTTNQcm9jZXNvcygpO1xyXG4gICAgcHJpdmF0ZSBwcm9ncmVzczogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBDb25mTWFzaXZhOiBhbnk7XHJcbiAgICBwdWJsaWMgcm91bmRlZF9wcm9ncmVzczogbnVtYmVyO1xyXG4gICAgcHVibGljIGdiQmFyQ29kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoaXNJZEthdGlvczogc3RyaW5nLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgaUNvbmZNYXNpdmE6IGFueSwgaWJCYXJjb2RlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gaW9NM1Byb2Nlc287XHJcbiAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gaXNJZEthdGlvcztcclxuICAgICAgICB0aGlzLkNvbmZNYXNpdmEgPSBpQ29uZk1hc2l2YTtcclxuICAgICAgICB0aGlzLmdiQmFyQ29kZSA9IGliQmFyY29kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X3JvdW5kZWRfcHJvZ3Jlc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm91bmRlZF9wcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9BZGljaW9uYXIgcHJvZHVjdG9zIGVuIG1hc2l2b1xyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hck1hc2l2byhvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvRGF0VXNlcjogYW55LCBvRGF0YVByb2M6IGFueSkge1xyXG4gICAgICAgIHRoaXMuR2V0UmVhZGVyKG9EYXRhUHJvYyk7XHJcbiAgICAgICAgbGV0IGNzdjogc3RyaW5nO1xyXG4gICAgICAgIGlmICghdGhpcy5yZWFkZXIpIHtcclxuICAgICAgICAgICAgY3N2ID0gb0RhdGFQcm9jLlRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjc3YgPSB0aGlzLnJlYWRlci5yZXN1bHQudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFyckNTVjogQXJyYXk8c3RyaW5nPiA9IGNzdi5zcGxpdChcIlxcblwiKTtcclxuXHJcbiAgICAgICAgdmFyIHByb2Nlc28gPSBhd2FpdCB0aGlzLmFkaWNpb25hcl9tYXNpdm9fZnJvbV9hcnJheShvTTNDb3VjaE1hZXN0cm8sIFBvc3RTZXJ2aWNlTTMsIG9EYXRVc2VyLCBhcnJDU1YpO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlY29ycmUgeSBhZGljaW9uYSBsb3MgcHJvZHVjdG9zIGVuIHVuIGFycmF5IGEgdW4gcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIG9NM0NvdWNoTWFlc3RybyBcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIG9EYXRVc2VyIFxyXG4gICAgICogQHBhcmFtIGFyckNTViBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGFkaWNpb25hcl9tYXNpdm9fZnJvbV9hcnJheShvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvRGF0VXNlcjogYW55LCBhcnJDU1Y6IEFycmF5PHN0cmluZz4sIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsLCBhcGxFeGM6IHN0cmluZyA9IFwiMFwiKSB7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbCA9IGFyckNTVi5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgICB2YXIgcHJvZHVjdDogVHlwZU0zUHJkR3JwXHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2Uob00zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MpO1xyXG5cclxuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBsaW5lOiBzdHJpbmcgPSBhcnJDU1ZbaV07XHJcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1Y7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuU2V0RXN0cnVjdENTVihsaW5lKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdiQmFyQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0geyBcImlkX3ViaWNhY2lvblwiOiBvRGF0VXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIFwiQ29kaWdvXCI6IG9lc3RydWN0Q1NWLnNrdSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5HZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlQXN5bmMoUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zLCBkYXRhLCBvRGF0VXNlcik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uSURVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIFwiLTFcIiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQcmVjaW9TaUFQbGljYShwcm9kdWN0LCBvZXN0cnVjdENTVik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkFkZFByZFRvTTNQcm9jZXNvKHByb2R1Y3QsIG9lc3RydWN0Q1NWLCBvTTNSZWdTZXJ2aWNlLCBvRGF0VXNlciwgb00zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gY291bnQgKiAxMDAgLyB0b3RhbDtcclxuICAgICAgICAgICAgdGhpcy5yb3VuZGVkX3Byb2dyZXNzID0gTWF0aC5yb3VuZCh0aGlzLnByb2dyZXNzICogMTAwKSAvIDEwMFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTTNQcm9jZXNvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBwcmVjaW8gZGUgcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIGlmIChvZXN0cnVjdENTVi5wcmVjaW8gIT09IE5hTiAmJiBvZXN0cnVjdENTVi5wcmVjaW8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZm9yRWFjaChvTTNQcmVzZW50YWNpb25lcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiA9IG9lc3RydWN0Q1NWLnByZWNpbztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGEgbTNwcm9jZXNvLCBwcm9kdWN0byBlc3BlY2lmaWNvLCBzZSBlbnZpYSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBBZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWLCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UsIG9EYXRVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvZXN0cnVjdENTVi5jYW50aWRhZDtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9lc3RydWN0Q1NWLlBhdGhJbWFnZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IG9NM1JlZ1NlcnZpY2UuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgcHJvZHVjdCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9NM1Byb2Nlc28uTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8vUHJpbWVyYSB2ZXogXHJcbiAgICAgICAgICAgIC8vL05PIFNFIEVTVEEgRU5WSUFORE8gSU5GT1JNQUNJT04gREUgUFJPTU9DSU9ORVNcclxuICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZHVjdCwgb00zUEl0ZW1zV0VCLCBvRGF0VXNlciwgb00zVWJpY2FjaW9uLCBudWxsLCB0aGlzLm9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgZGluYW1pY2FzXHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hclBlcnNvbmFzQVByb2Nlc28ob2VzdHJ1Y3RDU1YpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YSh0aGlzLm9NM1Byb2Nlc28sIHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBvRGF0VXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRpY2lvbmFyRGV0YWxsZShvZXN0cnVjdENTVik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgY2FwdHVyYXMgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEaW5hbWljYShvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYXMgPSBvZXN0cnVjdENTVi5EaW5hbWljYXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW5hbWljYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gZGluYW1pY2FzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IGRpbmFtaWNhc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkaW5hbWljYVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgcGVyc29uYXMgYSBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBlcnNvbmFzID0gb2VzdHJ1Y3RDU1YuUGVyc29uYXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVyc29uYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQZXJYUHJvY2VzbyA9IG5ldyBNM1BlclhQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLlRkb2MgPSBwZXJzb25hc1tpXS5UZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uTmRvYyA9IHBlcnNvbmFzW2ldLk5kb2M7XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UaXBvUGVyc29uYSA9IHBlcnNvbmFzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28ucHVzaChvTTNQZXJYUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBwZXJzb25hc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBhbCB1bHRpbW8gZW5jYWJlemFkbyBhZ3JlZ2Fkby5cclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBkZSBsaW5lYSBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGV0YWxsZXMgPSBvZXN0cnVjdENTVi5NM0RldFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFsbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gZGV0YWxsZXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gZGV0YWxsZXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNFTkNbdGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCAtIDFdLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMub00zUHJvY2Vzby5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9lc3RydWN0Q1NWLilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIGRldGFsbGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIHkgc2V0ZWFyIGxhIGluZm9ybWFjaW9uIGRlIGFyY2hpdm8gQ1NWIHkgc2VwYXJhZG9yLlxyXG4gICAgcHVibGljIEdldFJlYWRlcihvRGF0YVByb2M6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVhZGVyID0gb0RhdGFQcm9jLkNTVjtcclxuICAgICAgICB0aGlzLnNlcGFyYWRvciA9IG9EYXRhUHJvYy5TZXBhcmFkb3I7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9TZXRlYXIgZXN0cnVjdXRhciBkZSBDU1ZcclxuICAgIHB1YmxpYyBTZXRFc3RydWN0Q1NWKGxpbmU6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAgICAgdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZNYXNpdmEgJiYgdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzKSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdER5bmFtaWMob0FyckNTVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdERlZmF1bHQob0FyckNTVik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGNyZWFuZG8gZXN0cnVjdHVyYS4gUmV2aXNhciBsaW5lYXNcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXN0cnVjdHVyYSBkaW5hbWljYSBkZSBjYXJndWUgbWFzaXZhXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBhcnJlZ2xvIGNvbiBpbmZvcm1hY2lvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEVzdHJ1Y3REeW5hbWljKG9BcnJDU1Y6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB2YXIgY29sdW1uYXM6IEFycmF5PGFueT4gPSB0aGlzLkNvbmZNYXNpdmEuQ29sdW1uYXM7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uYXNbaV0uRXN0cnVjdHVyYSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUHJlY2lvXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YucHJlY2lvID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlNLVVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRJTkFNSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpbiA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJWYWxvclwiOiBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLkRpbmFtaWNhcy5wdXNoKGRpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTTNERVRcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNEZXQgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5NM0RldC5wdXNoKG0zRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJUSVBPUEVSU09OQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWxvciA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZG9jOiBzdHJpbmcgPSBcIjVcIjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmRvYzogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsb3Iuc3BsaXQoXCItXCIpLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkb2MgPSB2YWxvci5zcGxpdChcIi1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5kb2MgPSB2YWxvci5zcGxpdChcIi1cIilbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmRvYyA9IHZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcnNvbmEgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVGRvY1wiOiB0ZG9jLCBcIk5kb2NcIjogbmRvYyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLlBlcnNvbmFzLnB1c2gocGVyc29uYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVzdHJ1Y3R1cmEgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSBvQXJyQ1NWIEFycmVnbG8gY29uIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFc3RydWN0RGVmYXVsdChvQXJyQ1NWOiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG4gICAgICAgIC8vdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDEpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1Yuc2t1ID0gb0FyckNTVlswXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9BcnJDU1YubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVlsxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvQXJyQ1NWLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgICAgIG9lc3RydWN0Q1NWLnByZWNpbyA9ICtvQXJyQ1NWWzJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob0FyckNTVi5sZW5ndGggPj0gNCkge1xyXG4gICAgICAgICAgICBvZXN0cnVjdENTVi5QYXRoSW1hZ2VuID0gb0FyckNTVlszXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9lc3RydWN0Q1NWO1xyXG4gICAgfVxyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIGVzdHJ1Y3RDU1Yge1xyXG4gICAgc2t1OiBzdHJpbmc7XHJcbiAgICBjYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHJlY2lvOiBudW1iZXI7XHJcbiAgICBQYXRoSW1hZ2VuOiBzdHJpbmc7XHJcbiAgICBEaW5hbWljYXM6IEFycmF5PGFueT47XHJcbiAgICBQZXJzb25hczogQXJyYXk8YW55PjtcclxuICAgIE0zRGV0OiBBcnJheTxhbnk+O1xyXG59IiwiaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gXCIuL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUEl0ZW1zV0VCIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGFzeW5jIH0gZnJvbSBcInFcIjtcclxuXHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvQUtaU2VydmljZSB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIHVuIEVuY0l0ZW0geSBwdWVkZSBxdWUgdW5hIGRpbmFtaWNhIGNvbiBlbCBpZHByZXN0YW1vIGEgdW4gcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkX3ByZXN0YW1vIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfZGluYW1pY2FfaWRwcmVzdGFtb190b19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkLCB1c2VyLCBvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgcmVzcDtcclxuICAgICAgICB2YXIgcGRpbmFtaWNhID0gbmV3IE0zUERpbmFtaWNhc1xyXG4gICAgICAgIHBkaW5hbWljYS5Ob21icmUgPSBcIklkUHJlc3RhbW9cIjtcclxuICAgICAgICBwZGluYW1pY2EuVmFsb3IgPSBpZF9wcmVzdGFtbztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VfcHJvY2Vzb19tMzogTTNQcm9jZXNvc1xyXG4gICAgICAgICAgICB2YXIgbTNfcmVnX3NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlkX2thdGlvcyk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMgPSBhd2FpdCBtM19yZWdfc2VydmljZS5nZXRfbTNfcHJvY2Vzb19ieV9pZF9wcmVzdGFtb19hc3luYyhQb3N0U2VydmljZU0zLCBpZF9rYXRpb3MsIGlkX3ByZXN0YW1vKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2UgZGVqYW4gcGVnYWRvcyBsb3MgZXN0YWRvcyBkZSBkZXN0aW5vXHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMuRXN0YWRvRGVzID0gcmVzcG9uc2VfcHJvY2Vzb19tMy5Fc3RhZG9BbnQ7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlX3Byb2Nlc29fbTMuU3ViRXN0YWRvRGVzID0gcmVzcG9uc2VfcHJvY2Vzb19tMy5TdWJFc3RhZG9BbnQ7XHJcblxyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgdGhpcy5hZGRfcGRpbmFtaWNhX3RvX2V4aXN0aW5nX3Byb2Nlc28oUG9zdFNlcnZpY2VNMywgcmVzcG9uc2VfcHJvY2Vzb19tMywgaWRfa2F0aW9zLCBtM1ByZCwgdXNlciwgcGRpbmFtaWNhLCBvdHJvc1BhcmFtZXRyb3MpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIHJlc3AgPSBhd2FpdCB0aGlzLmFkZF9wZGluYW1pY2FfdG9fbmV3X3Byb2Nlc28oUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zLCBtM1ByZCwgdXNlciwgcGRpbmFtaWNhLCBvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIHkgZGluYW1pY2EgY29uIGVsIGlkcHJlc3RhbW8gYSB1biBwcm9jZXNvIG51ZXZvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gbTNQcmQgXHJcbiAgICAgKiBAcGFyYW0gdXNlciBcclxuICAgICAqIEBwYXJhbSBwZGluYW1pY2EgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfcGRpbmFtaWNhX3RvX25ld19wcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG0zUHJkOiBhbnksIHVzZXI6IGFueSwgcGRpbmFtaWNhOiBNM1BEaW5hbWljYXMsIG90cm9zUGFyYW1ldHJvczogQXJyYXk8YW55Pikge1xyXG5cclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IHRoaXMuR2V0TTNQSXRlbXNXRUIob3Ryb3NQYXJhbWV0cm9zKTtcclxuICAgICAgICB2YXIgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgaWRfa2F0aW9zKTtcclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihtM1ByZCwgb00zUEl0ZW1zV0VCLCB1c2VyLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICByZXNwb25zZS5sTTNQRGluYW1pY2FzLnB1c2gocGRpbmFtaWNhKTtcclxuXHJcbiAgICAgICAgLy9TZSBkZWphbiBwZWdhZG9zIGxvcyBlc3RhZG9zIGRlIGRlc3Rpbm9cclxuICAgICAgICByZXNwb25zZS5Fc3RhZG9EZXMgPSBcIkFjdGl2b1wiO1xyXG4gICAgICAgIHJlc3BvbnNlLlN1YkVzdGFkb0RlcyA9IFwiUmVnaXN0cm9cIjtcclxuXHJcbiAgICAgICAgdmFyIG0zX3Byb2Nlc28gPSBhd2FpdCBvTTNSZWdTZXJ2aWNlLnByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhpZF9rYXRpb3MsIFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlLCB1c2VyKTtcclxuICAgICAgICByZXR1cm4gbTNfcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFncmVnYSB1biBFbmNJdGVtIGEgdW4gcHJvY2VzbyBleGlzdGVudGVcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIG0zX3Byb2Nlc28gXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG0zUHJkIFxyXG4gICAgICogQHBhcmFtIHVzZXIgXHJcbiAgICAgKiBAcGFyYW0gcGRpbmFtaWNhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGRfcGRpbmFtaWNhX3RvX2V4aXN0aW5nX3Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgbTNfcHJvY2VzbzogTTNQcm9jZXNvcywgaWRfa2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgbTNQcmQ6IGFueSwgdXNlcjogYW55LCBwZGluYW1pY2E6IE0zUERpbmFtaWNhcywgb3Ryb3NQYXJhbWV0cm9zOiBBcnJheTxhbnk+KSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCID0gdGhpcy5HZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3MpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZF9rYXRpb3MpO1xyXG5cclxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShtM19wcm9jZXNvLCBtM1ByZCwgb00zUEl0ZW1zV0VCLCBudWxsLCBudWxsLCB1c2VyKTtcclxuICAgICAgICByZXNwb25zZS5sTTNQRGluYW1pY2FzLnB1c2gocGRpbmFtaWNhKTtcclxuXHJcbiAgICAgICAgdmFyIG0zX3Byb2Nlc28gPSBhd2FpdCBvTTNSZWdTZXJ2aWNlLnByb2Nlc2FtaWVudG9fc2VydmljZV9hc3luYyhpZF9rYXRpb3MsIFBvc3RTZXJ2aWNlTTMsIHJlc3BvbnNlLCB1c2VyKTtcclxuICAgICAgICByZXR1cm4gbTNfcHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBHZXRNM1BJdGVtc1dFQihvdHJvc1BhcmFtZXRyb3M6IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDE7XHJcbiAgICAgICAgb00zUEl0ZW1zV0VCLklkUHJvY2VzbyA9IFwiTTNWRU5UQVwiO1xyXG4gICAgICAgIG90cm9zUGFyYW1ldHJvcy5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUJbeC5Ob21icmVdID0geC5WYWxvclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIG9NM1BJdGVtc1dFQjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JldmVyc29TZXJ2e1xyXG5cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBQcm9jZXNhclJldmVyc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxzSURLYXRpb3M6IHN0cmluZywgdGRvY0FjdGl2bzpzdHJpbmcsIG5kb2NBY3Rpdm86c3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zUmV2ZXJzby9SZXZlcnNhci9cIiArIHNJREthdGlvcyArIFwiL1wiICsgbmRvY0FjdGl2byArIFwiL1wiICsgdGRvY0FjdGl2bywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0sICk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE0zUERpbmFtQnlBY3RpdmlkYWR7XHJcbiAgICBwdWJsaWMgSWREaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNEaW5CeUFjdGl2aWRhZHtcclxuICAgIHB1YmxpYyBJREFjdGl2aWRhZDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQWN0aXZpZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBJRERpbmFtaWNhOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvRGluYW1pY2E6c3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVxdWVyaWRvOmJvb2xlYW47XHJcblxyXG4gICAgLy9Tb2xvIFByZXNlbnRhY2lvblxyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNTYWxkb3NYQ3VlbnRhe1xyXG4gICAgcHVibGljIERvY3VtZW50bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVERvY1RpdHVsYXI6bnVtYmVyO1xyXG4gICAgcHVibGljIE5Eb2NUaXR1bGFyOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21DdWVudGE6c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbEN1ZW50YTpudW1iZXI7XHJcbn0iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ2lzdHJvVHJ4IHtcclxuXHJcbiAgICBwdWJsaWMgQWN0aXZpZGFkOnN0cmluZztcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgTTNQRGluYW1CeUFjdGl2aWRhZCA9IG5ldyBBcnJheTxNM1BEaW5hbUJ5QWN0aXZpZGFkPigpO1xyXG5cclxuICAgIC8vQXRyaWJ1dG9zIHVuaWNvIGRlbCBGcm9udFxyXG4gICAgcHVibGljIEFjdHVhbDpzdHJpbmcgPSB1bmRlZmluZWRcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIGN1cG9uZXNTZXJ2aWNlIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGllbmUgdG9kb3MgbG9zIGN1cG9uZXMgZ2VuZXJhZG9zIHBvciB1biBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19nZXRfY3Vwb25lc19nZW5lcmFkb3NfYnlfcHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7IFwiaWRfbTNcIjogaWRtMywgXCJpZF9wcm9jZXNvXCI6IHByb2Nlc28gfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy9tM19nZXRfY3Vwb25lc19nZW5lcmFkb3NfYnlfcHJvY2Vzby9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICB2YXIgY3Vwb25lcyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgIHZhciByZXNwX2N1cG9uZXM6QXJyYXk8YW55PjtcclxuICAgICAgICAgIGlmKCFjdXBvbmVzLkNVUE9ORVMuQ1VQT04ubGVuZ3RoKXtcclxuICAgICAgICAgICAgcmVzcF9jdXBvbmVzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgcmVzcF9jdXBvbmVzLnB1c2goY3Vwb25lcy5DVVBPTkVTLkNVUE9OKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXNwX2N1cG9uZXMgPSBjdXBvbmVzLkNVUE9ORVMuQ1VQT047XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGZ1bmNpb25PSyhyZXNwX2N1cG9uZXMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHB1YmxpYyBnZXRDdXBvbkJ5SWREZXQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgIFxyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7IFwiaWREZXRDdXBvblwiOiBpZERldEN1cG9ufTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy9nZXRDdXBvbkJ5SWREZXQvXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5pbXBvcnQgeyBmYWtlQXN5bmMgfSBmcm9tICdAYW5ndWxhci9jb3JlL3Rlc3RpbmcnO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VydmljZU9mZkxpbmUge1xyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZVwiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkRG9jdW1lbnQoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFkZERvY3VtZW50XCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFkZERvY3VtZW50IGVuY29ucnRybyBkb2N1bWVudFwiKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5wdXQoZG9jdW1lbnQpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3Iuc3RhdHVzKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgZG9jdW1lbnRbXCJfcmV2XCJdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIERlc3Ryb3koKSB7XHJcbiAgICAvLyAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgIC8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lXCIpO1xyXG4gICAgLy8gICAgICAgICB9LCAyMDAwKTtcclxuICAgIC8vICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIERlc3Ryb3lUb3RhbCgpe1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlLCBkZWxldGVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NPZmZMaW5lU2luRG9jcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJveShmdW5jaW9uUmVwOkZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5kZXN0cm95KCkudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIk9mZmxpbmVMb2dcIiArIGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIk9LXCJ9KTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVwKHtcIlJlc3BcIjpcIkVycm9yXCIsIFwiRGVzY1wiOmVycn0pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MuZmlsdGVyKHJvdyA9PiAhcm93LmlkLnN0YXJ0c1dpdGgoXCJDVElWT1NcIikpLm1hcChmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpc0tleSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgcG91Y2hkYnNpemUgZnJvbSAncG91Y2hkYi1zaXplJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5pbXBvcnQgeyBNM0RldmljZXNTZXJ2aWNlIH0gZnJvbSAnc2YtcmVnbGFuZWdvY2lvLWdybCc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBiZE9mZkxpbmVMb2cge1xyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgXHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIG9NM0RldmljZXNTZXJ2aWNlOk0zRGV2aWNlc1NlcnZpY2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaC5cclxuICAgIHB1YmxpYyBBZGREb2N1bWVudChpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCwgeyBmb3JjZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3Ryb3koZnVuY2lvblJlcDpGdW5jdGlvbikge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJPZmZsaW5lTG9nXCIgKyBrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvblJlcCh7XCJSZXNwXCI6XCJPS1wifSk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgZnVuY2lvblJlcCh7XCJSZXNwXCI6XCJFcnJvclwiLCBcIkRlc2NcIjplcnJ9KTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2VJbnN0YW5jZSgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEluc3RhbmNlQWdhaW4oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiT2ZmbGluZUxvZ1wiICsga2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlLCBkZWxldGVkOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBbGxEb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MuZmlsdGVyKHJvdyA9PiAhcm93LmlkLnN0YXJ0c1dpdGgoXCJDVElWT1NcIikpLm1hcChmdW5jdGlvbiAocm93KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsaW1pbmEgZGVsIExvZyBsb3MgZG9jcyBjb24gZmVjaGEgYW50ZXJpb3IgbyBpZ3VhbCBhIHt7bWF4RGlhc319IGRlIGxhIGZlY2hhIGFjdHVhbFxyXG4gICAgICogU2UgY29uY2F0ZW5hIFwiICAwMDowMFwiIGEgbGEgZmVjaGEgcG9yIHVuIGVycm9yIGVuIGxhIGZ1bmNpb25hbGlkYWQgZGUgXCJuZXcgRGF0ZSgpXCJcclxuICAgICAqIFNlIHV0aWxpemEgKDEwMDAgKiAzNjAwICogMjQpIHBhcmEgY2FsY3VsYXIgZWwgbnVtZXJvIGRlIG1pbGlzZWd1bmRvcyBlbiB1biBkw4PCrWFcclxuICAgICAqL1xyXG4gICAgcHVibGljIERlbGV0ZU9sZERvY3MobWF4RGlhczpudW1iZXIpIHtcclxuICAgICAgICAvL2xldCBtYXhEaWFzID0gMztcclxuXHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkRlbGV0ZU9sZERvY3NcIilcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhhbGxEb2NzKVxyXG4gICAgICAgICAgICB0aGlzLkFkZExvZ1NvY2tldChhbGxEb2NzKTtcclxuICAgICAgICAgICAgYWxsRG9jcy5yb3dzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGVsZW1lbnQuZG9jLkZlY2hhKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoZWxlbWVudC5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhuZXcgRGF0ZShlbGVtZW50LmRvYy5GZWNoYS5zdWJzdHJpbmcoMCwgMTApICsgXCIgIDAwOjAwXCIpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhEYXRlLm5vdygpIC0gbmV3IERhdGUoZWxlbWVudC5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKS5nZXRUaW1lKCkpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKChEYXRlLm5vdygpIC0gbmV3IERhdGUoZWxlbWVudC5kb2MuRmVjaGEuc3Vic3RyaW5nKDAsIDEwKSArIFwiICAwMDowMFwiKS5nZXRUaW1lKCkpIC8gKDEwMDAgKiAzNjAwICogMjQpKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5maWx0ZXIocm93ID0+IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSBuZXcgRGF0ZShyb3cuZG9jLkZlY2hhLnN1YnN0cmluZygwLCAxMCkgKyBcIiAgMDA6MDBcIikuZ2V0VGltZSgpKSAvICgxMDAwICogMzYwMCAqIDI0KSkgPj0gbWF4RGlhcylcclxuICAgICAgICAgICAgLm1hcCggcm93ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vTGxhbWFyIHNvY2tldC4gXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYnVsa0RvY3MoZGVsZXRlRG9jcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBBZGRMb2dTb2NrZXQob2xNM1Byb2Nlc29zOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcGFyYW1zOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBwYXJhbXMgPSBbeyBcIm5vbWJyZVwiOiBcIk0zUHJvY2Vzb1wiLCBcInZhbG9yXCI6IEpTT04uc3RyaW5naWZ5KG9sTTNQcm9jZXNvcykgfV07XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9NM0RldmljZXNTZXJ2aWNlLkRldmljZV9NUG9zKHRoaXMuQWRkTG9nU29ja2V0T0ssIHBhcmFtcywgXCJMT0dNM1Byb2Nlc29zXCIsIG51bGwpXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQWRkTG9nU29ja2V0T0sgPSgpPT57XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpc0tleSkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIlxyXG5pbXBvcnQgeyB2YXJpYWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvb3V0cHV0L291dHB1dF9hc3RcIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuLi9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBBbnlBUmVjb3JkIH0gZnJvbSBcImRuc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM01hZXN0cm9PZmZsaW5lIHtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybykge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZm9ybWFzIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBpZEthdGlvcyBJZCBkZSBsYSBFbXByZXNhIFxyXG4gICAgICogQHBhcmFtIHJlc3BPa19nZXRfZm9ybWFzX3BhZ28gRnVuY2lvbiBjb24gcmVzcHVlc3RhIE9LXHJcbiAgICAgKiBAcGFyYW0gcmVzcEVycm9yX2dldF9mb3JtYXNfcGFnbyBGdW5jaW9uIGNvbiByZXNwdWVzdGEgRVJST1JcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEZvcm1hc1BhZ28oaWRLYXRpb3MsIGlkUHJvY2Vzbzogc3RyaW5nLCByZXNwT2tfZ2V0X2Zvcm1hc19wYWdvOiBGdW5jdGlvbiwgcmVzcEVycm9yX2dldF9mb3JtYXNfcGFnbzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoXCJGb3JtYXNQYWdvXCIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpO1xyXG5cclxuICAgICAgICAgICAgcmVzcE9rX2dldF9mb3JtYXNfcGFnbyh0aGlzLkZpbHRyYXJCeVByb2Nlc28oaWRQcm9jZXNvLCB4LkZvcm1hc1BhZ28pKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHJlc3BFcnJvcl9nZXRfZm9ybWFzX3BhZ28oZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWx0cmFyIGxhcyBmb3JtYXMgZGUgcGFnbywgZGVwZW5kaWVuZG8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGZvcm1hc1BhZ28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGaWx0cmFyQnlQcm9jZXNvKGlkUHJvY2Vzbzogc3RyaW5nLCBmb3JtYXNQYWdvOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZm9ybWFzUGFnbyk7XHJcbiAgICAgICAgICAgIGlmIChpZFByb2Nlc28gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgZm9ybWFzUGFnbyA9IGZvcm1hc1BhZ28uZmlsdGVyKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh4LlBST0NFU09TKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgheC5QUk9DRVNPUy5sZW5ndGgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LlBST0NFU09TID0gbmV3IEFycmF5PGFueT4oeC5QUk9DRVNPUyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4LlBST0NFU09TLmZpbmQoeSA9PiB5LklkUHJvY2VzbyA9PSBpZFByb2Nlc28pICE9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmb3JtYXNQYWdvKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgRmlsdHJhckJ5UHJvY2Vzb1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybWFzUGFnbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtYXNQYWdvO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRFc3RydWN0dXJhKGVzdDpzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KGVzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGRpbsODwqFtaWNhcyBwb3IgYWN0aXZpZGFkXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgSWQgZGUgbGEgZW1wcmVzYVxyXG4gICAgICogQHBhcmFtIExvYWREaW5hbWljYXNPSyBGdW5jaW9uIGRlIHJlc3B1ZXN0YSBPS1xyXG4gICAgICogQHBhcmFtIExvYWREaW5hbWljYXNFcnJvciBGdW5jaW9uIGRlIHJlc3B1ZXN0YSBFUlJPUlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0RGluYW1pY2FzQnlBQ3RpdmlkYWQoaWRLYXRpb3MsIG9EYXRhLCBMb2FkRGluYW1pY2FzT0s6IEZ1bmN0aW9uLCBMb2FkRGluYW1pY2FzRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRpbmFtXHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KFwiRElOQllBQ1RcIikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGRpbmFtID0geC5NM0RpbkJ5QWN0aXZpZGFkO1xyXG4gICAgICAgICAgICAgICAgZGluYW0gPSBkaW5hbS5maWx0ZXIoeCA9PiB4LkFjdGl2aWRhZCA9PSBvRGF0YS5BY3RpdmlkYWQgJiYgeC5JREFjdGl2aWRhZCA9PSBvRGF0YS5pZEFjdGl2aWRhZCAmJiB4LklkUHJvY2VzbyA9PSBvRGF0YS5pZFByb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgTG9hZERpbmFtaWNhc09LKGRpbmFtKTtcclxuICAgICAgICAgICAgfSBjYXRjaHtcclxuICAgICAgICAgICAgICAgIGRpbmFtID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgIExvYWREaW5hbWljYXNPSyhkaW5hbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBMb2FkRGluYW1pY2FzRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHViaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gc0lkVWJpY2FjaW9uZXMgSWQgZGUgbGEgdWJpY2FjaW9uIGEgYnVzY2FyIGVuIGJhc2UgZGUgZGF0b3MgTm9TUUxcclxuICAgICAqIEBwYXJhbSBvU2VydmljZU0zTWFlc3RybyBTZXJ2aWNpbyBtYWVzdHJvLCBlc3RhIHRpZW5lIGZ1bmNpb25hbGlkYWQgcGFyYSBidXNjYXIgZXNwZWNpZmljYW1lbnRlIHVuIHViaWNhY2lvblxyXG4gICAgICogQHBhcmFtIEZ1bmNpb25PSyBGdW5jaW9uIHF1ZSByZXRvbWEgbGEgZnVuY2lvbmFsaWRhZCBjdWFuZG8gZXMgT0suXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRVYmljYWNpb25lcyhpZGthdGlvczogc3RyaW5nLCBzSWRVYmljYWNpb25lczogc3RyaW5nLCBvU2VydmljZU0zTWFlc3RybzogU2VydmljZU0zTWFlc3RybywgRnVuY2lvbk9LOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vQ2FyZ2FyIGluZm9ybWFjaW9uIGRlIHViaWNhY2lvblxyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb247XHJcbiAgICAgICAgdmFyIHNJZFViaWNhY2lvbmVzQ291Y2ggPSBpZGthdGlvcy50cmltKCkudG9VcHBlckNhc2UoKSArIFwiP1VCSUNcIjs7XHJcbiAgICAgICAgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJZFViaWNhY2lvbmVzQ291Y2gpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgb00zVWJpY2FjaW9uID0gb1NlcnZpY2VNM01hZXN0cm8uR2V0VWJpY2FjaW9uRnJvbUxpc3QocmVzdWx0Lkxpc3RVYmljYWNpb25lcy5NM1VCSUNBQ0lPTiwgc0lkVWJpY2FjaW9uZXMpO1xyXG4gICAgICAgICAgICBGdW5jaW9uT0sob00zVWJpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgXHJcblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBwcm9tb2Npb25lc1xyXG4gICAgLy8gICogQHBhcmFtIHNJRFByb21vIElkIGRlIGxhIHByb21vY2lvbiBhIGJ1c2NhciBlbiBiYXNlIGRlIGRhdG9zIE5vU1FMXHJcbiAgICAvLyAgKiBAcGFyYW0gRnVuY2lvbk9LIEZ1bmNpb24gcXVlIHJldG9tYSBsYSBmdW5jaW9uYWxpZGFkIGN1YW5kbyBlcyBPSy5cclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIEdldFByb21vY2lvbmVzKGlka2F0aW9zOiBzdHJpbmcsIEZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgIC8vICAgICB2YXIgTGlzdFByb21vO1xyXG4gICAgLy8gICAgIHZhciBzSURQcm9tbyA9IGlka2F0aW9zLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgXCI/UHJvbW9jaW9uZXNcIjtcclxuICAgIC8vICAgICB0aGlzLm9NM0NvdWNoTWFlc3Ryby5nZXQoc0lEUHJvbW8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgIC8vICAgICAgICAgaWYocmVzdWx0Lk0zRU5DUFJPTU8pe1xyXG4gICAgLy8gICAgICAgICAgICAgTGlzdFByb21vID0gcmVzdWx0Lk0zRU5DUFJPTU87XHJcbiAgICAvLyAgICAgICAgIH1lbHNlIGlmKHJlc3VsdC5NM0xpc3RFTkNQUk9NTy5NM0VOQ1BST01PKXtcclxuICAgIC8vICAgICAgICAgICAgIExpc3RQcm9tbyA9IHJlc3VsdC5NM0xpc3RFTkNQUk9NTy5NM0VOQ1BST01PO1xyXG4gICAgLy8gICAgICAgICB9ZWxzZXtcclxuICAgIC8vICAgICAgICAgICAgIExpc3RQcm9tbyA9IHVuZGVmaW5lZDtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgRnVuY2lvbk9LKExpc3RQcm9tbyk7XHJcbiAgICAvLyAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIHNpbmNyw4PCs25pY2FtZW50ZSBkZSB0ZW1wbGF0ZS4gc2VndW4gZWwgcmVwb3J0ZSBlbnRyYW50ZSBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEFzeW5jZ2V0X3RlbXBsYXRlX3JlcG9ydGUoaWRrYXRpb3M6IHN0cmluZywgaWRyZXApIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdGVtcGxhdGU7XHJcbiAgICAgICAgICAgIC8vdmFyIHNJRCA9IGlka2F0aW9zLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgXCI/VGVtcGxhdGVzXCI7XHJcbiAgICAgICAgICAgIHZhciBzSUQgPSBcIlRFTVBMQVRFU1wiO1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMub00zQ291Y2hNYWVzdHJvLmdldChzSUQpO1xyXG4gICAgICAgICAgICBpZiAodGVtcGxhdGUuUkVTUFVFU1RBLlJQVGVtcGxhdGUubGVuZ3RoID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBuZXcgQXJyYXk8YW55Pih0ZW1wbGF0ZS5SRVNQVUVTVEEuUlBUZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLlJFU1BVRVNUQS5SUFRlbXBsYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vL1NlIGNyZWFuIGxvcyBub2RvcyBwYWRyZSBSRVNQVUVTVEEgeSBSUFRlbXBsYXRlLCBwYXJhIHNpbXVsYXIgaWd1YWwsIGNvbW8gbG8gcmVzcG9uZGUgc2Vydmlkb3IuXHJcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVVubyA9IHsgXCJSRVNQVUVTVEFcIjogeyBcIlJQVGVtcGxhdGVcIjogdGVtcGxhdGUuZmluZCh0ID0+IHQuSWRSZXAgPT0gaWRyZXApIH0gfTtcclxuICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlVW5vO1xyXG4gICAgICAgIH0gY2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxufSAgICIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlT2ZmTGluZSB9IGZyb20gXCIuL1NlcnZpY2UvYmQtb2ZmbGluZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgTTNSZWdTZXJ2aWNlIH0gZnJvbSBcIi4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTZXJ2aWNlTTNNYWVzdHJvIH0gZnJvbSBcIi4uL1NlcnZpY2VzL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGJkT2ZmTGluZUxvZyB9IGZyb20gXCIuL1NlcnZpY2UvYmQtb2ZmbGluZS1sb2cuc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zUHJvY2Vzb3NPZmZsaW5lIHtcclxuXHJcbiAgICAvL3ByaXZhdGUgc0tleUN0aXZvczogc3RyaW5nID0gXCJDVElWT1NcIjtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgb1NlcnZpY2VPZmZMaW5lOiBTZXJ2aWNlT2ZmTGluZSwgcHJpdmF0ZSBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxcclxuICAgICAgICBwcml2YXRlIG9iZE9mZkxpbmVMb2c6IGJkT2ZmTGluZUxvZykge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgTTNQcm9jZXNvcywgc2VndW4gZWwgSUQgTTNcclxuICAgICAqIEBwYXJhbSBpZCBJZCBkZWwgTW90b3IgM1xyXG4gICAgICogQHBhcmFtIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyBSZXNwdWVzdGEgT0sgZGUgZ2V0IGRlIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zIFJlc3B1ZXN0YSBFcnJvciBkZSBnZXQgZGUgTTMgcHJvY2Vzb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldFByb2Nlc29CeUlkKGlkLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBSZXNwb25zZUVycm9yTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTA4IGNhbWJpbyBkZSBkb25kZSB0cmFlciBlbCBwcm9jZXNvIGxvIHRyYWUgZGVzZGUgb2ZmbGluZVxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICAgICAgLy90aGlzLm9iZE9mZkxpbmVMb2cuZ2V0KGlkKS50aGVuKHByb2Nlc28gPT4ge1xyXG4gICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MocHJvY2Vzbyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAvL1Jlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvcyhlcnJvcik7XHJcbiAgICAgICAgICAgIHRoaXMuR2V0UHJvY2Vzb0J5SWRGcm9tTG9nKGlkLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRQcm9jZXNvQnlJZEZyb21Mb2coaWQsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIFJlc3BvbnNlRXJyb3JMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0pBR00gMjAxOTExMDggY2FtYmlvIGRlIGRvbmRlIHRyYWVyIGVsIHByb2Nlc28gbG8gdHJhZSBkZXNkZSBvZmZsaW5lXHJcbiAgICAgICAgLy90aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQoaWQpLnRoZW4ocHJvY2VzbyA9PiB7XHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLmdldChpZCkudGhlbihwcm9jZXNvID0+IHtcclxuICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHByb2Nlc28pO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgUmVzcG9uc2VFcnJvckxvYWRNM1Byb2Nlc29zKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBNMyBQcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBNMyBQcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb2xNM1Byb2Nlc29zIE9iamV0byBNMyBQcm9jZXNvcyBhIGFncmVnYXJcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MgRnVuY2lvbiBPSyByZXNwdWVzdGEgcXVlIGF0cmFwYXLDg8KhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkUHJvY2VzbyhpZGthdGlvczogc3RyaW5nLCBvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgaWYgKG9sTTNQcm9jZXNvcy5JZE0zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkdldElkTTNPZmZsaW5lKGlka2F0aW9zLCBvbE0zUHJvY2Vzb3MuVE1JZFByb2Nlc28sIG9sTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MuSURIdWIudG9TdHJpbmcoKSkudGhlbihpZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvbE0zUHJvY2Vzb3MuSWRNMyA9IGlkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRUb0RvY09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZFRvRG9jT2ZmbGluZShvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvczogRnVuY3Rpb24sIGludGVudG8gPSAwKSB7XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuQWRkRG9jdW1lbnQob2xNM1Byb2Nlc29zLklkTTMudG9TdHJpbmcoKSwgb2xNM1Byb2Nlc29zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICB0aGlzLlNhdmVJZE0zKG9sTTNQcm9jZXNvcy5JZE0zLCBvbE0zUHJvY2Vzb3MuVE1JZFByb2Nlc28sIG9sTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MuSURIdWIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLlNhdmVJZE0zKG9sTTNQcm9jZXNvcy5JZE0zLCBvbE0zUHJvY2Vzb3MuVE1JZFByb2Nlc28sIG9sTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MuSURIdWIudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIC8vICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3Mob2xNM1Byb2Nlc29zLklkTTMpO1xyXG4gICAgICAgICAgICAvLyB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MpO1xyXG5cclxuICAgICAgICAgICAgLy9SZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3Mob2xNM1Byb2Nlc29zLklkTTMpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJlcnJvclwiOiBlcnJvciwgXCJvbE0zUHJvY2Vzb3NcIjogb2xNM1Byb2Nlc29zLCBcIkludGVudG9cIjogaW50ZW50bywgXCJmdW5jdGlvblwiOiBcIkFkZFRvRG9jT2ZmbGluZVwiIH0pKTtcclxuICAgICAgICAgICAgaWYgKGludGVudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLkluc3RhbmNlQWdhaW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkVG9Eb2NPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyh7IFwiRXJyb3JcIjogXCJFcnJvciBlbiBndWFyZGFyIGVuIGJhc2UgZGUgZGF0b3MgcGNwYWwuXCIgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGxvZyBvZmZsaW5lIGRlIHByb2Nlc29zLlxyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZExvZ09mZmxpbmUob2xNM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBpbnRlbnRvOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgLy9BZ3JlZ2FyIGEgTG9nIFNvY2tldFxyXG4gICAgICAgIC8vdGhpcy5BZGRMb2dTb2NrZXQob2xNM1Byb2Nlc29zKVxyXG4gICAgICAgIC8vcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5BZGREb2N1bWVudChvbE0zUHJvY2Vzb3MuSWRNMy50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpXHJcbiAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLkFkZERvY3VtZW50KG9sTTNQcm9jZXNvcy5JZE0zLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcykudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coeCk7XHJcbiAgICAgICAgICAgIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcyhvbE0zUHJvY2Vzb3MuSWRNMyk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIm9sTTNQcm9jZXNvc1wiOiBvbE0zUHJvY2Vzb3MsIFwiSW50ZW50b1wiOiBpbnRlbnRvLCBcImZ1bmN0aW9uXCI6IFwiQWRkTG9nT2ZmbGluZVwiIH0pKTtcclxuICAgICAgICAgICAgaWYgKGludGVudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLkluc3RhbmNlQWdhaW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuQWRkTG9nT2ZmbGluZShvbE0zUHJvY2Vzb3MsIFJlc3BvbnNlT0tMb2FkTTNQcm9jZXNvcywgMSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MoeyBcIkVycm9yXCI6IFwiRXJyb3IgZW4gZ3VhcmRhciBlbiBiYXNlIGRlIGRhdG9zIGxvY2FsLlwiIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgQWRkTG9nU29ja2V0T0sgPSAoKSA9PiB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZUluc3RhbmNlTG9nT2ZmKCkge1xyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5jbG9zZUluc3RhbmNlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRPZmZMaW5lTG9nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9iZE9mZkxpbmVMb2cuR2V0QWxsRG9jcygpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0MURvY09mZkxpbmVMb2coaWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vYmRPZmZMaW5lTG9nLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXZlcnNhciBtMyBwcm9jZXNvLCBlbiBlbCBsb2cgbG9jYWwuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZXZlcnNhckVuTG9nKGlkKSB7XHJcbiAgICAgICAgdGhpcy5HZXQxRG9jT2ZmTGluZUxvZyhpZCkudGhlbihvTTNQID0+IHtcclxuICAgICAgICAgICAgdmFyIG9SZXN1bHQ6IE0zUHJvY2Vzb3MgPSBvTTNQO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9SZXN1bHQubE0zUEVuY0ZQLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvUmVzdWx0LmxNM1BFbmNGUFtpXS5WYWxDYW1iaW8gPSAwO1xyXG4gICAgICAgICAgICAgICAgb1Jlc3VsdC5sTTNQRW5jRlBbaV0uVmFsb3IgPSAwO1xyXG4gICAgICAgICAgICAgICAgb1Jlc3VsdC5sTTNQRW5jRlBbaV0uVmFsT3RyYUNsYXNpID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUmVzdWx0LklkRXN0YWRvID0gXCJSVlwiO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvZ09mZmxpbmUob1Jlc3VsdCwgbnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlc3RydWlyQkRMb2coZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2JkT2ZmTGluZUxvZy5EZXN0cm95KGZ1bmNpb25SZXNwKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVzdHJ1aXJCRE9mZihmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuRGVzdHJveShmdW5jaW9uUmVzcCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFN1bWFyQ3Rpdm8oaWRtMzogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gdmFyIHNQYXJ0MTtcclxuICAgICAgICAvLyB2YXIgc1BhcnQyO1xyXG5cclxuICAgICAgICAvLyBzUGFydDEgPSBpZG0zLnN1YnN0cmluZygwLCA4KTtcclxuICAgICAgICAvLyBzUGFydDIgPSBpZG0zLnN1YnN0cmluZyg4LCBpZG0zLmxlbmd0aCk7XHJcbiAgICAgICAgLy8gc1BhcnQyID0gK3NQYXJ0MiArIDE7XHJcbiAgICAgICAgLy8gaWRtMyA9IHNQYXJ0MSArIHNQYXJ0MjtcclxuICAgICAgICAvLyByZXR1cm4gaWRtMztcclxuICAgICAgICB2YXIgc1BhcnQxO1xyXG4gICAgICAgIHZhciBzUGFydDI7XHJcbiAgICAgICAgc1BhcnQxID0gaWRtMy5zdWJzdHJpbmcoMCwgOSk7XHJcbiAgICAgICAgc1BhcnQyID0gaWRtMy5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgc1BhcnQyID0gK3NQYXJ0MiArIDE7XHJcbiAgICAgICAgaWRtMyA9IHNQYXJ0MSArIFwiXCIgKyBzUGFydDI7XHJcbiAgICAgICAgcmV0dXJuIGlkbTM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemFyIGVsIE0zIFByb2Nlc29zLCB0ZW5pZW5kbyBlbCBJZCBkZWwgZG9jdW1lbnRvIGd1YXJkYWRvIGVuIGxhIEJEIE5vU1FMXHJcbiAgICAgKiBAcGFyYW0gaWQgSWQgZGVsIGRvY3VtZW50byBCZCBOb1NRTFxyXG4gICAgICogQHBhcmFtIG9sTTNQcm9jZXNvcyBNMyBQcm9jZXNvcyBhIGFsbWFjZW5hciAvIEFjdHVhbGl6YXJcclxuICAgICAqIEBwYXJhbSBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MgUmVzcHVlc3RhIGRlIE9LLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkUHJvY2VzbyhpZCwgb2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3M6IEZ1bmN0aW9uLCBpbnRlbnRvID0gMCkge1xyXG5cclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudChpZC50b1N0cmluZygpLCBvbE0zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIC8vUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKGlkKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIm9sTTNQcm9jZXNvc1wiOiBvbE0zUHJvY2Vzb3MsIFwiSW50ZW50b1wiOiBpbnRlbnRvLCBcImZ1bmN0aW9uXCI6IFwidXBkUHJvY2Vzb1wiIH0pKTtcclxuICAgICAgICAgICAgaWYgKGludGVudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vYmRPZmZMaW5lTG9nLkluc3RhbmNlQWdhaW4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkUHJvY2VzbyhpZCwgb2xNM1Byb2Nlc29zLCBSZXNwb25zZU9LTG9hZE0zUHJvY2Vzb3MsIDEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgUmVzcG9uc2VPS0xvYWRNM1Byb2Nlc29zKHsgXCJFcnJvclwiOiBcIkVycm9yIGVuIGd1YXJkYXIgZW4gYmFzZSBkZSBkYXRvcyBwY3BhbC5cIiB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphciBlbCBNMyBQcm9jZXNvcywgdGVuaWVuZG8gZWwgSWQgZGVsIGRvY3VtZW50byBndWFyZGFkbyBlbiBsYSBCRCBOb1NRTFxyXG4gICAgICogQHBhcmFtIGlkIElkIGRlbCBkb2N1bWVudG8gQmQgTm9TUUxcclxuICAgICAqIEBwYXJhbSBvbE0zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgYSBhbG1hY2VuYXIgLyBBY3R1YWxpemFyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyB1cGRQcm9jZXNvQXN5bmMoaWQsIG9sTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KGlkLnRvU3RyaW5nKCksIG9sTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgdGhpcy5BZGRMb2dPZmZsaW5lKG9sTTNQcm9jZXNvcywgbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEFsbERvY3NPZmZMaW5lU2luRG9jcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jc09mZkxpbmVTaW5Eb2NzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2VzYXJUaWNrZXRPZmZsaW5lKGlka2F0aW9zLCBwcm9jZXNvLCBvRGF0YVVzZXI6IGFueSwgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGxNM1Byb2Nlc29zID0gbmV3IEFycmF5PE0zUHJvY2Vzb3M+KCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIGlka2F0aW9zKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVmFsaWRhclRpY2tldENlcnJhZG8ocHJvY2VzbykpIHtcclxuICAgICAgICAgICAgbE0zUHJvY2Vzb3MucHVzaChwcm9jZXNvKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuUmVnaXN0cm9FdmVudG9NM09mZkxpbmUoaWRrYXRpb3MsIHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGxNM1Byb2Nlc29zLCBvRGF0YVVzZXIpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHRydWUsIFwiT0tcIik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBwcm9jZXNvcyBxdWUgc2UgcHJvY2VzYXJvbiBtaWVudHJhcyBzZSBlc3RhYmEgZnVlcmEgZGUgbGluZWFcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJQcm9jZXNvc0FncmVnYWRvc09mZkxpbmUoaWRrYXRpb3MsIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiRW50cm8gVmFsaWRhclByb2Nlc29zQWdyZWdhZG9zT2ZmTGluZVwiKVxyXG4gICAgICAgIHZhciBsTTNQcm9jZXNvcyA9IG5ldyBBcnJheTxNM1Byb2Nlc29zPigpO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlID0gbmV3IE0zUmVnU2VydmljZShudWxsLCBudWxsLCBpZGthdGlvcyk7XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jcygpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIHJlc3VsdFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5yb3dzW2ldLmlkLnN0YXJ0c1dpdGgoXCJDVElWT1NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNQcm9jZXNvOiBNM1Byb2Nlc29zID0gcmVzdWx0LnJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJUaWNrZXRDZXJyYWRvKG0zUHJvY2VzbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbE0zUHJvY2Vzb3MucHVzaChyZXN1bHQucm93c1tpXS5kb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiQW50ZXMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmVcIilcclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShpZGthdGlvcywgdGhpcy5vUG9zdFNlcnZpY2VNMywgbE0zUHJvY2Vzb3MsIG9EYXRhVXNlcikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRGlvIFJlc3B1ZXN0YSBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZVwiKVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImlmIDFcIilcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGVBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AodHJ1ZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImlmIDJcIilcclxuICAgICAgICAgICAgICAgICAgICAvL1Jlc3B1ZXN0YSBjb24gZXJyb3Jlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlQWxsRG9jcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgcXVlIGVsIHRpY2tldCBlc3RhIGNlcnJhZG8uXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclRpY2tldENlcnJhZG8obTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIGJDZXJyYWRvOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBpZiAobTNQcm9jZXNvICYmIG0zUHJvY2Vzby5TdWJFc3RhZG9BbnQgIT0gXCJEZWNsaW5hZG9cIiAmJiBtM1Byb2Nlc28uTTNFTkMubGVuZ3RoID4gMCAmJiBtM1Byb2Nlc28ubE0zUEVuY0ZQLmxlbmd0aCA9PSAwICYmXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FudGlkYWRUb3RhbEJ5TTNQcm9jZXNvKG0zUHJvY2VzbykgPiAwKSB7XHJcbiAgICAgICAgICAgIGJDZXJyYWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiQ2VycmFkbztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldENhbnRpZGFkVG90YWxCeU0zUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcyAmJiBvTTNQcm9jZXNvcy5NM0VOQykge1xyXG4gICAgICAgICAgICB2YXIgZENhbnRpZGFkID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgPiAwKS5cclxuICAgICAgICAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLCAwKTtcclxuICAgICAgICAgICAgaWYgKGRDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdG9kb3MgbG9zIGRvY3VtZW50b3MgT2ZmIGxpbmUgcXVlIHNlIGhhbiBndWFyZGFkbyBjb21vIG9mZmxpbmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBHZXRBbGxEb2NzT2ZmbGluZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgbE0zUHJvY2Vzb3MgPSBuZXcgQXJyYXk8TTNQcm9jZXNvcz4oKTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLkdldEFsbERvY3MoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yb3dzW2ldLmlkICE9IFwiQ1RJVk9TXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsTTNQcm9jZXNvcy5wdXNoKHJlc3VsdC5yb3dzW2ldLmRvYyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGxNM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB0b2RvcyBsb3MgZG9jdW1lbnRvcyBPZmYgbGluZSBxdWUgc2UgaGFuIGd1YXJkYWRvIGNvbW8gb2ZmbGluZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEFsbERvY3NPZmZsaW5lRGVsZXRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jc0RlbGV0ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlQ3Rpdm9zKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlKHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSlcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWxsQ3Rpdm9zKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsb3MgY29uc2VjdXRpdm9zIHF1ZSBlc3RhbiBsb2NhbG1lbnRlIHZzIGxvcyBxdWUgZXN0YW4gZW4gZWwgc2Vydmlkb3IuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFjaW9uQ3Rpdm9zVlNTZXJ2ZXIoaWthdGlvczogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaWRIdWI6IHN0cmluZywgZnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5nZXRBbGxDdGl2b3ModWJpY2FjaW9uLCBpZEh1YikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgaWYgKHgpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgICAgICBvU2VydmljZU0zTWFlc3Ryby5WYWxpZGFyQ3Rpdm9zVlNMb2NhbCh0aGlzLm9Qb3N0U2VydmljZU0zLCBpa2F0aW9zLCBKU09OLnN0cmluZ2lmeSh4KSwgdWJpY2FjaW9uLCBpZEh1YiwgZnVuY2lvblJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgZWwgY29uc2VjdXRpdm8gZW4gZWwgcXVlIHZhLCBlbCBwcm9jZXNvIG9mZmxpbmUgcXVlIHJlY2liZSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIHViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldEN0aXZvT2ZmTGluZSh1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZykge1xyXG4gICAgICAgIHZhciBjdGl2bzogc3RyaW5nID0gXCIwXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YS5DdGl2b3MuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IHNJZFByb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkLkN0aXZvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3Rpdm8gPSBvRGF0YUZpbmRlZC5DdGl2by5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHsgfVxyXG4gICAgICAgIHJldHVybiBjdGl2bztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgaWQgbTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFNhdmVJZE0zKHNJZE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSkudGhlbihkYXRhID0+IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhOiBBcnJheTxhbnk+ID0gZGF0YS5DdGl2b3M7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGEuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IHNJZFByb2Nlc28pO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBjdGl2b0FudCA9ICtvRGF0YUZpbmRlZC5DdGl2by5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY3Rpdm9BY3QgPSArc0lkTTMuc3Vic3RyaW5nKDkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN0aXZvQWN0ID4gY3Rpdm9BbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBvRGF0YUZpbmRlZC5DdGl2byA9IHNJZE0zO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGEucHVzaCh7IFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28sIFwiQ3Rpdm9cIjogc0lkTTMgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNhdmVDdGl2b3Mob0RhdGEsIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgaWYgKHNJZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiLCBzSWRNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgICAgIG9EYXRhLnB1c2goeyBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvLCBcIkN0aXZvXCI6IHNJZE0zIH0pXHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICBpZiAoc0lkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIsIHNJZE0zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBjdGl2b3MsIElkbTMuXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgU2F2ZUN0aXZvcyhvRGF0YTogQXJyYXk8YW55PiwgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBpbnRlbnRvID0gMCkge1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQgPSB7IFwiQ3Rpdm9zXCI6IG9EYXRhIH1cclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5BZGREb2N1bWVudCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YiksIG9EYXRhU2VuZCkudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPS1wiKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dDdGl2b3NcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImVycm9yXCI6IGVycm9yLCBcIkN0aXZvc1wiOiBvRGF0YVNlbmQsIFwiZnVuY3Rpb25cIjogXCJTYXZlQ3Rpdm9zXCIgfSkpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIGlmIChpbnRlbnRvID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIsIDEpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlT2xkRG9jcyhtYXhEaWFzOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLm9iZE9mZkxpbmVMb2cuRGVsZXRlT2xkRG9jcyhtYXhEaWFzKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgSWQgbTMsIGN1YW5kbyBlc3RhIGZ1ZXJhIGRlIGxpbmVhXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXN5bmMgR2V0SWRNM09mZmxpbmUoaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGF0YUlkTTM7XHJcbiAgICAgICAgdmFyIGlkTTM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgb0RhdGFJZE0zID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuZ2V0KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSk7XHJcbiAgICAgICAgICAgIHZhciBvRGF0YUZpbmRlZDogYW55ID0gb0RhdGFJZE0zLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gaWRwcm9jZXNvKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gb0RhdGFGaW5kZWQuQ3Rpdm87XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMudmFsaWRhckF1bWVudG9DdGl2byhpZE0zLCBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gaWRNMyA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkYXRlLmdldE1vbnRoKCkgKyBcIlwiICsgZGF0ZS5nZXREYXkoKSArIFwiXCIgKyBkYXRlLmdldEhvdXJzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCkgKyBcIlwiICsgZGF0ZS5nZXRTZWNvbmRzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG4gICAgICAgICAgICBpZE0zID0gdGhpcy5HZXRDdGl2byhpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbykge1xyXG4gICAgICAgIGlmIChpZHByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIlRJQ0tFVFZFTlRBXCIpIHtcclxuICAgICAgICAgICAgbGV0IHVsdGltb0lkTTMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIik7XHJcbiAgICAgICAgICAgIGlmICh1bHRpbW9JZE0zID09IGlkTTMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBzRmVjaGFOb3c6IHN0cmluZyA9IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVlNTUREVEhIbW1zcycpXHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy5TdW1hckN0aXZvKGlkTTMpO1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiaWRNM1wiOiBpZE0zLCBcImZ1bmN0aW9uXCI6IFwidmFsaWRhckF1bWVudG9DdGl2b1wiIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWRNMztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIEdldEN0aXZvKGlka2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VNM01hZXN0cm8gPSBuZXcgU2VydmljZU0zTWFlc3RybygpO1xyXG4gICAgICAgIHZhciBzQ3Rpdm87XHJcbiAgICAgICAgc0N0aXZvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0Q3Rpdm9CWVByb2Nlc28odGhpcy5vUG9zdFNlcnZpY2VNMywgaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgIHJldHVybiBzQ3Rpdm87XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsbGF2ZSBkZSBwb3VjaERCXHJcbiAgICAgKiBAcGFyYW0gdWJpYyBcclxuICAgICAqIEBwYXJhbSBodWIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRLZXkodWJpYywgaHViKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiQ1RJVk9TX1wiICsgdWJpYyArIGh1YjtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YlxyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBNM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3RXaXRoVGltZU91dChzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnksIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTNUaW1lT3V0KFwiTTNOb3RpZkNvbnRyb2xsZXIvTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdC9cIiArIHNJREthdGlvcywgb0RhdGFTZW5kLCB0aW1lT3V0KS50b1Byb21pc2UoKTtcclxuICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViIGRlIHVuIGlkUmVwIGRhZG9cclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAqIEBwYXJhbSBkYXRhIFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtM19nZXRfbm90aWZpY2FjaW9uX3hfaHViX29iamVjdChzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAvL3ZhciBkYXRhID0ge1wiaWRfcmVwXCI6XCJcIiwgXCJpZF91YmljYWNpb25cIjpcIlwiLCBcImlkX2h1YlwiOlwiXCJ9XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL20zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0L1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3ApKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSwgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvZ3VhcmRhckNhbWJpb3NDb25maWd1cmFjaW9uSW1wcmVzaW9uL1wiICsgc0lES2F0aW9zLnRyaW0oKSwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3JbXCJfYm9keVwiXSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgTW9kZWxNM05vdGlme1xyXG4gICAgcHVibGljIElkUmVwOnN0cmluZztcclxuICAgIHB1YmxpYyBJRFViaWNhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRIdWI6c3RyaW5nO1xyXG4gICAgcHVibGljIENvcnJlcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGlwbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgQ29uZGljaW9uZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIERhdGE6c3RyaW5nO1xyXG4gICAgcHVibGljIENvbmZJbXA6c3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIE0zUHJlc2VudGFjaW9uZXN7XHJcbiAgICBwdWJsaWMgTklWRUxQUlM6c3RyaW5nO1xyXG4gICAgcHVibGljIFZBTE9SOm51bWJlcjtcclxuICAgIHB1YmxpYyBUT1BFOm51bWJlcjtcclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgcmVzZXJ2ZVNsb3RzIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNM0NvbnN1bHRhcyB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIGludmVudGFyaW8sIHRlbmllbmRvIGVuIGN1ZW50YSBsb3MgcGFjayBhc29jaWFkb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgICAqIEBwYXJhbSBkYXRhIEpzb24gY29uIGluZm9ybWFjaW9uIGRlIFNLUDEgKE1vZGVsbykgeSBVYmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIE0zX0dFVElOVkVOVEFSSU9CWVBBQ0soc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRJTlZFTlRBUklPQllQQUNLL1wiICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNMy92YWxpZGFySW52ZW50YXJpb05lZ2F0aXZvUHJvZHVjdG8vXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyb3IuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBCdXNjYXJDb25jZXB0b0VuTTNTSVUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKXtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9NM19HRVRDb25jZXB0b0Zyb21TSVUvXCIgKyBpZEthdGlvcyArIFwiL1wiICsgZGF0YS5zVWJpY2FjaW9uICsgXCIvXCIgKyBkYXRhLnNDb25jZXB0bywge30pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbn0iLCJleHBvcnQgY2xhc3MgVEVDTEFTUkFQSURBU3tcclxuICAgIHB1YmxpYyBDb21wb25lbnRlOnN0cmluZztcclxuICAgIHB1YmxpYyBUZWNsYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRnVuY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFbGVtZW50bzpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQUkRTU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgYXBsUGFxdWV0ZXMgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAodGhpcy5pZGthdGlvcykgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiUFJEXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRVYmljYWNpb24oKSB7XHJcbiAgICAgICAgbGV0IHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgbGV0IG9TVWJpY2FjaW9uO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uSURVYmljYWNpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBLYXRpb3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0thdGlvc1wiICsgdGhpcy5pZGthdGlvcy50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoS2F0aW9zICE9PSB1bmRlZmluZWQgJiYgS2F0aW9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIGpLYXRpb3NNMyA9IEpTT04ucGFyc2UoS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYgKGpLYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zICYmIGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhcGwgPSBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zLmZpbmQoeCA9PiB4LkxsYXZlLnRvVXBwZXJDYXNlKCkgPT0gXCJBUExQQVFTXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFwbCAmJiBhcGwuVmFsb3IgPT0gXCIxXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwbFBhcXVldGVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveShpZGthdGlvcykge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXBsU3luY0NvdWNoQXV0byA9IHRoaXMuZ2V0RmxhZ1N5bmNDb3VjaCgpO1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdGhpcy5hcGxTeW5jQ291Y2hBdXRvLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW5mbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5pbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVQcmQoaWQpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hDb2RzUFJEU1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZsYWdTeW5jQ291Y2goKSB7XHJcbiAgICAgICAgdmFyIHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgdmFyIG9TVWJpY2FjaW9uO1xyXG4gICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBsZXQgY29uZmlnO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLk0zSFVCUyAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0gJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2Uob1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuU3luY0NvdWNoQXV0byAhPSBudWxsICYmIGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSBjb25maWcuU3luY0NvdWNoQXV0bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImNvZHNwcmRfXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvZHNwcmRfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvZHNwcmRfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIENPRFMgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBDT0RTIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFByb21vY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJwcm9tb2Npb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgICAgIC8vdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKHNJZGthdGlvcykpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoc0lka2F0aW9zKTogc3RyaW5nIHtcclxuICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vYXNzZXRzL0NvbmZpZy9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTMgKyBcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2U6IFBvdWNoREIpIHtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIHN5bmNBd2FpdChyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgICAgICB0aGlzLnN5bmNXaXRoREIocmVtb3RlRGF0YWJhc2UpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YWJhc2UuY29tcGFjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBjaGFuZ2VzKHJlbW90ZTogc3RyaW5nKXtcclxuICAgIC8vICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUpO1xyXG4gICAgLy8gICAgIHJlbW90ZURhdGFiYXNlLmNoYW5nZXMoe1xyXG4gICAgLy8gICAgICAgICBzaW5jZTogJ25vdycsXHJcbiAgICAvLyAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAvLyAgICAgICAgIGluY2x1ZGVfZG9jczogdHJ1ZVxyXG4gICAgLy8gICAgICAgfSkub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChjaGFuZ2UpIHtcclxuICAgIC8vICAgICAgICAgLy8gY2hhbmdlLmlkIGNvbnRhaW5zIHRoZSBkb2MgaWQsIGNoYW5nZS5kb2MgY29udGFpbnMgdGhlIGRvY1xyXG4gICAgLy8gICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgIC8vICAgICAgICAgICAvLyBkb2N1bWVudCB3YXMgZGVsZXRlZFxyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBhZGRlZC9tb2RpZmllZFxyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGhhbmRsZSBlcnJvcnNcclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGUoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKS50aGVuKGRvYyA9PntcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKGRvYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbGVtZW50UmVtb3ZlZCgpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmNoYW5nZXMoeyBsaXZlOiB0cnVlLCBzaW5jZTogJ25vdycsIGluY2x1ZGVfZG9jczogdHJ1ZSB9KVxyXG4gICAgICAgIC5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVtLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3JlbmRlckRvY3NTb21laG93KCk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlbW92ZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZW07XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCICBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG4gIH0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFViaWNhY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcz0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJ1YmljYWNpb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6c3RyaW5nO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6c3RyaW5ne1xyXG4gICAgICAgIC8vdmFyIGpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9hc3NldHMvQ29uZmlnL2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgdmFyIGpzb24gPSByZXF1aXJlKCdHOi9EZXNhcnJvbGxvL0JEL1dFOC9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKXtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKXtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICBcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENoYW5nZUl0ZW0oKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jaGFuZ2VzKHsgbGl2ZTogdHJ1ZSwgc2luY2U6ICdub3cnLCBpbmNsdWRlX2RvY3M6IHRydWUgfSlcclxuICAgICAgICAub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIC8vaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9yZW5kZXJEb2NzU29tZWhvdygpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmaWNhY2lvbmVzQVBQIHtcclxuICAgIHB1YmxpYyBvRGF0YU0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwibm90aWZpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCksIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwibm90aWZpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy92YXIganNvbiA9IHJlcXVpcmUoJy4uLy4uLy4uL2Fzc2V0cy9Db25maWcvY29uZmlnLmpzb24nKTtcclxuICAgICAgICB2YXIganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIGJhc2UgZGUgZGF0b3MuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0J5VGlwbyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXBhY2stYnktdGlwb1wiO1xyXG5pbXBvcnQgeyBNM1BhY2tCeVJlZ2xhcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXBhY2stYnktcmVnbGFzXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VNM1BhY2tCeWlwbyB7XHJcblxyXG5cclxuICAgIHByaXZhdGUgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthIDwgK2IgfSxcclxuICAgICAgICAnPic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA+ICtiIH0sXHJcbiAgICAgICAgJzw9JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthIDw9ICtiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthID49ICtiIH0sXHJcbiAgICAgICAgJ0lHVUFMJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT0gYiB9LFxyXG4gICAgICAgICdESUZGJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgIT0gYiB9LFxyXG4gICAgICAgICdFTic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09PSBiIH0sXHJcbiAgICAgICAgJ0FORCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICYmIGIgfSxcclxuICAgICAgICAnT1InOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSB8fCBiIH0sXHJcbiAgICAgICAgJyonOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gdHJ1ZSB9LFxyXG4gICAgICAgICdNT0QnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgJSArYiA9PSAwIH0sXHJcbiAgICAgICAgLy8gLi4uXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgc2kgZWwgcHJvZHVjdG8gcXVlIHNlcsODwqEgaGlqbywgY3VtcGxlIGNvbiBsYXMgY2FyYWN0ZXJpc3RpY2FzXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jUEtHIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpRXNUaXBvKG0zUHJvY1BLRzogVHlwZU0zUHJkR3JwLCBwcm9kdWN0bzogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG0zUHJvY1BLRy5NM1BBQ0tCWVRJUE8uZmluZCh4ID0+IHguREVTVElOTyA9PSBwcm9kdWN0by5USVBPKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcGxpY2FjaW9uIGRlIHJlZ2xhcyBkZSBwYXF1ZXRlcywgdGVuaWVuZG8gZW4gY3VlbnRhIGFsIGluZm9ybWFjacODwrNuIGRlbCBwcm9kdWN0byBpbmdyZXNhZG8uXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jUEtHIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICogQHBhcmFtIG9NM1BJdGVtc1dFQiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYVZhbGlkYWNpb25lcyhtM1Byb2NQS0c6IFR5cGVNM1ByZEdycCwgcHJvZHVjdG86IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBiUmVzcDpib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIG9NM1BBQ0tCWVRJUE86IE0zUHJkUGFja0J5VGlwbyA9IG0zUHJvY1BLRy5NM1BBQ0tCWVRJUE8uZmluZCh4ID0+IHguREVTVElOTyA9PSBwcm9kdWN0by5USVBPKTtcclxuICAgICAgICAgICAgaWYgKG9NM1BBQ0tCWVRJUE8pIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBvTTNQQUNLQllUSVBPLk0zUEFDS1JFR0xBUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQYWNrQnlSZWdsYXM6IE0zUGFja0J5UmVnbGFzID0gb00zUEFDS0JZVElQTy5NM1BBQ0tSRUdMQVNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBlc3RhIHZhbGlkYW5kbyBlbCBwYXBhIGRlbCBwYXF1ZXRlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3BlcmF0b3JzW29NM1BhY2tCeVJlZ2xhcy5PcGVyYWNpb25dKHRoaXMuR2V0UGFyYW1ldHJvcyhvTTNQYWNrQnlSZWdsYXMuUGFyYW0xLCBtM1Byb2NQS0cpICwgdGhpcy5HZXRQYXJhbWV0cm9zKG9NM1BhY2tCeVJlZ2xhcy5QYXJhbTIsIG0zUHJvY1BLRykpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFjaW9uQWNjaW9uKG9NM1BhY2tCeVJlZ2xhcy5BY2Npb24sIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw4PCs24gZGUgYWNjaW9uIGRlIHJlZ2xhcyBkZSBwYXF1ZXRlLlxyXG4gICAgICogQHBhcmFtIHNBY2Npb24gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgVmFsaWRhY2lvbkFjY2lvbihzQWNjaW9uOnN0cmluZywgb00zUEl0ZW1zV0VCOk0zUEl0ZW1zV0VCKXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGlmKHNBY2Npb24gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9BY2Npb246YW55ID0gSlNPTi5wYXJzZShzQWNjaW9uKTtcclxuICAgICAgICAgICAgICAgIGlmKG9BY2Npb24uQWNjaW9uKXtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob0FjY2lvbi5BY2Npb24pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ2FudGlkYWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWNhdGNoKGV4KXtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2nDg8KzbiBkZSBwYXJhbWV0cm9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHJlZ2xhcy5cclxuICAgICAqIEBwYXJhbSBwYXJhbWV0cm8gXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdG8gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0UGFyYW1ldHJvcyhwYXJhbWV0cm86IHN0cmluZywgcHJvZHVjdG86IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIHZhciBzUGFyYW06IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlZ2xhOiBzdHJpbmcgPSBwYXJhbWV0cm8uc3BsaXQoXCJfXCIpWzBdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHJlZ2xhLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBRElcIjpcclxuICAgICAgICAgICAgICAgICAgICBzUGFyYW0gPSBwcm9kdWN0by5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQVRSSUJVVE8gPT0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVsxXSkuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ09OU1RcIjpcclxuICAgICAgICAgICAgICAgICAgICBzUGFyYW0gPSBwYXJhbWV0cm8uc3BsaXQoXCJfXCIpWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZihyZWdsYS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJTS1BcIikgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF1bcmVnbGFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc1BhcmFtO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG59IiwiaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWx0cm9zRGlhcmlvT2ZmTGluZSB7XHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5RmVjaGFzT2ZmKERhdGEsIEFkZFRvRG9jOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByb3dzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICAvL3ZhciBuZXdSb3dzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgdmFyIGZlY2hhSSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJGZWNoYUl0Q09GRlwiKTtcclxuICAgICAgICAgICAgdmFyIGZlY2hhRiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJGZWNoYUZ0Q09GRlwiKTtcclxuICAgICAgICAgICAgcm93cyA9IERhdGEucm93cztcclxuXHJcbiAgICAgICAgICAgIGlmIChmZWNoYUYgJiYgZmVjaGFJKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaUZJbmljaW8gPSB0aGlzLkdldEZlY2hhTnVtYmVyKGZlY2hhSSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaUZGaW5hbCA9IHRoaXMuR2V0RmVjaGFOdW1iZXIoZmVjaGFGKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGlGSW5pY2lvKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coaUZGaW5hbClcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtM3A6IGFueSA9IHJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtM3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZlY2hhUHJvYyA9IHRoaXMuR2V0RmVjaGFOdW1iZXIobTNwLkZlY2hhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmZWNoYVByb2MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrZmVjaGFQcm9jID49ICtpRkluaWNpbyAmJiArZmVjaGFQcm9jIDw9ICtpRkZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25ld1Jvd3MucHVzaChyb3dzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFRvRG9jKG0zcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWx0cmFyQnlGZWNoYXNPZmZcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBGaWx0cmFyQnlUZXh0byhEYXRhLCBzVGV4dG86IHN0cmluZywgQWRkVG9Eb2M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJvd3M6IEFycmF5PGFueT47XHJcblxyXG4gICAgICAgICAgICByb3dzID0gRGF0YS5yb3dzO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBtM3A6IGFueSA9IHJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgaWYgKG0zcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtM3AuSWRNMy5pbmNsdWRlcyhzVGV4dG8pIHx8IChtM3AubmRvY1VBY3Rpdm8gJiYgbTNwLm5kb2NVQWN0aXZvLmluY2x1ZGVzKHNUZXh0bykpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV3Um93cy5wdXNoKHJvd3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0RvYyhtM3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpbHRyYXJCeUZlY2hhc09mZlwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBHZXRGZWNoYU51bWJlcihzZGF0ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy92YXIgZGF0ZSA9IG5ldyBEYXRlKHNkYXRlKTtcclxuICAgICAgICB2YXIgZCA9IG1vbWVudChzZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG5cclxuICAgICAgICByZXR1cm4gZDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbi8vIEBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvdWNoUGVyeGlwbyB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJwZXJ4dGlwb19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicGVyeHRpcG9fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vYXNzZXRzL0NvbmZpZy9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hEaW5hbUJ5UHJvY2Vzb3Mge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImRpbmFteHByb2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICBcclxufVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICAvL3ZhciBqc29uID0gcmVxdWlyZSgnLi4vLi4vLi4vYXNzZXRzL0NvbmZpZy9jb25maWcuanNvbicpO1xyXG4gICAgICAgIHZhciBqc29uID0gcmVxdWlyZSgnRzovRGVzYXJyb2xsby9CRC9XRTgvY29uZmlnLmpzb24nKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHtpbmNsdWRlX2RvY3M6IGZhbHNlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGE9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59Il0sIm5hbWVzIjpbIl8iLCJ0aW1lb3V0IiwiSGVhZGVycyIsIlJlcXVlc3RPcHRpb25zIiwiSW5qZWN0YWJsZSIsIkh0dHAiLCJIdHRwQ2xpZW50IiwiRXZlbnRFbWl0dGVyIiwibW9tZW50IiwidHNsaWJfMS5fX3ZhbHVlcyIsIl8uY2xvbmVEZWVwIiwiUG9zdFNlcnZpY2VNMyIsInRzbGliXzEuX19kZWNvcmF0ZSIsInRzbGliXzEuX19wYXJhbSIsIk9wdGlvbmFsIiwiTTNEZXZpY2VzU2VydmljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7SUFBQTs7Ozs7Ozs7Ozs7Ozs7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S0FBSyxDQUFDLENBQUM7d0JBQUMsS0FBSyxDQUFDOzRCQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUMsTUFBTTt3QkFDOUIsS0FBSyxDQUFDOzRCQUFFQSxJQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO3dCQUN4RCxLQUFLLENBQUM7NEJBQUVBLElBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUFDLFNBQVM7d0JBQ2pELEtBQUssQ0FBQzs0QkFBRSxFQUFFLEdBQUdBLElBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUNBLElBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQUMsU0FBUzt3QkFDakQ7NEJBQ0ksSUFBSSxFQUFFLENBQUMsR0FBR0EsSUFBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQ0FBRUEsSUFBQyxHQUFHLENBQUMsQ0FBQztnQ0FBQyxTQUFTOzZCQUFFOzRCQUM1RyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FBRUEsSUFBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQUMsTUFBTTs2QkFBRTs0QkFDdEYsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJQSxJQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FBRUEsSUFBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQ0FBQyxNQUFNOzZCQUFFOzRCQUNyRSxJQUFJLENBQUMsSUFBSUEsSUFBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQUVBLElBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUFDQSxJQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FBQyxNQUFNOzZCQUFFOzRCQUNuRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQUVBLElBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7NEJBQ3RCQSxJQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUFDLFNBQVM7cUJBQzlCO29CQUNELEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRUEsSUFBQyxDQUFDLENBQUM7aUJBQzlCO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUFFO3dCQUFTO29CQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUFFO1lBQzFELElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3BGO0lBQ0wsQ0FBQztBQUVELHNCQUl5QixDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE9BQU87WUFDSCxJQUFJLEVBQUU7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNO29CQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDM0M7U0FDSixDQUFDO0lBQ04sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQzFFTyx1QkFBb0IsSUFBVSxFQUFVLFVBQXNCO1lBQTFDLFNBQUksR0FBSixJQUFJLENBQU07WUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZOzs7Ozs7WUFNMUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFFO1NBRXhCOzs7O1FBRU0sb0NBQVk7Ozs7O2dCQUVmLElBQUksSUFBSSxHQUFFLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFFOztnQkFDdkQsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxXQUFXLEVBQUU7O29CQUNiLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQzFDLElBQUcsV0FBVyxDQUFDLGdCQUFnQixFQUFDO3dCQUM1QixJQUFJLEdBQUcsV0FBVyxDQUFDO3FCQUN0QjtpQkFDSjs7Z0JBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7OztRQUk3QixrREFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7O1FBR1YscUNBQWE7Ozs7WUFBbkIsVUFBb0IsUUFBZ0I7Ozs7Ozs7Z0NBRWpCLHFCQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUEvRixJQUFJLEdBQUcsU0FBd0Y7Z0NBQy9GLFNBQVMsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dDQUNqRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7Z0NBR3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBRyxDQUFDLENBQUM7Ozs7OzthQUV4Qjs7Ozs7UUFFRCw0Q0FBb0I7Ozs7WUFBcEIsVUFBcUIsSUFBSTtnQkFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQy9COzs7O1FBRUQsb0NBQVk7OztZQUFaO2dCQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN4Qjs7OztRQUVELHdDQUFnQjs7O1lBQWhCO2dCQUNJLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO2FBQ2xDOzs7Ozs7O1FBR0QsK0JBQU87Ozs7O1lBQVAsVUFBUSxNQUFjLEVBQUUsU0FBaUI7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7b0JBQzVDLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNyQixDQUFDLENBQUM7YUFDTjs7Ozs7Ozs7UUFJRCwwQ0FBa0I7Ozs7OztZQUFsQixVQUFtQixNQUFjLEVBQUUsU0FBaUIsRUFBRSxXQUFtQjtnQkFDckUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN6Q0MsaUJBQU8sQ0FBQyxXQUFXLENBQUMsQ0FDdkIsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO29CQUNMLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUNyQixDQUFDLENBQUM7YUFDTjs7Ozs7OztRQUVELHVDQUFlOzs7Ozs7WUFBZixVQUFnQixNQUFjLEVBQUUsU0FBaUIsRUFBRSxVQUFlOztnQkFDOUQsSUFBTSxPQUFPLEdBQUcsSUFBSUMsVUFBTyxFQUFFLENBQUM7Z0JBRTlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7O2dCQUtuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO29CQUNJLE1BQU0sRUFBRSxVQUFVO2lCQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztvQkFDTixPQUFPLEdBQUcsQ0FBQztpQkFDZCxDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7UUFFRCw4Q0FBc0I7Ozs7Ozs7WUFBdEIsVUFBdUIsTUFBYyxFQUFFLFNBQWlCLEVBQUUsVUFBZSxFQUFFLFdBQW1COztnQkFDMUYsSUFBTSxPQUFPLEdBQUcsSUFBSUEsVUFBTyxFQUFFLENBQUM7Z0JBRTlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7O2dCQUtuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO29CQUNJLE1BQU0sRUFBRSxVQUFVO2lCQUNyQixDQUFDO3FCQUNELElBQUksQ0FDREQsaUJBQU8sQ0FBQyxXQUFXLENBQUMsQ0FDdkI7cUJBQ0EsR0FBRyxDQUFDLFVBQUEsR0FBRztvQkFDSixPQUFPLEdBQUcsQ0FBQztpQkFDZCxDQUFDLENBQUM7YUFDVjs7Ozs7OztRQUVELHFDQUFhOzs7Ozs7WUFBYixVQUFjLE1BQWMsRUFBRSxTQUFpQixFQUFFLFVBQWU7O2dCQUM1RCxJQUFNLE9BQU8sR0FBRyxJQUFJQyxVQUFPLEVBQUUsQ0FBQzs7OztnQkFROUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUN6QztvQkFDSSxZQUFZLEVBQUUsTUFBTTtvQkFDcEIsTUFBTSxFQUFFLFVBQVU7aUJBQ3JCLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO29CQUNOLE9BQU8sR0FBRyxDQUFDO2lCQUNkLENBQUMsQ0FBQzthQUNWOzs7Ozs7O1FBRUQsNENBQW9COzs7Ozs7WUFBcEIsVUFBcUIsTUFBYyxFQUFFLFNBQWlCLEVBQUUsVUFBZTs7Z0JBQ25FLElBQU0sT0FBTyxHQUFHLElBQUlBLFVBQU8sRUFBRSxDQUFDOzs7O2dCQVE5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO29CQUNJLFlBQVksRUFBRSxhQUFhO29CQUMzQixNQUFNLEVBQUUsVUFBVTtpQkFDckIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7b0JBQ04sT0FBTyxHQUFHLENBQUM7aUJBQ2QsQ0FBQyxDQUFDO2FBQ1Y7Ozs7O1FBSUQsbUNBQVc7Ozs7WUFBWCxVQUFZLE1BQWM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDdEQ7Ozs7Ozs7UUFFTSw0Q0FBb0I7Ozs7OztzQkFBQyxNQUFjLEVBQUUsTUFBVyxFQUFFLFdBQW1CO2dCQUN4RSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7Ozs7Ozs7UUFHckYsMkNBQW1COzs7OztZQUFuQixVQUFvQixNQUFjLEVBQUUsTUFBVztnQkFDM0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDdEU7Ozs7OztRQUVNLHFDQUFhOzs7OztzQkFBQyxNQUFjLEVBQUUsTUFBVztnQkFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7Ozs7O1FBR2pFLDJDQUFtQjs7Ozs7WUFBbkIsVUFBb0IsTUFBYyxFQUFFLE1BQVc7Z0JBQzNDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFOzs7Ozs7UUFFRCw0Q0FBb0I7Ozs7O1lBQXBCLFVBQXFCLE1BQWMsRUFBRSxNQUFXO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN2RTs7Ozs7O1FBRUQsNENBQW9COzs7OztZQUFwQixVQUFxQixNQUFjLEVBQUUsTUFBVzs7Z0JBQzVDLElBQU0sT0FBTyxHQUFHLElBQUlBLFVBQU8sRUFBRSxDQUFDOztnQkFHOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsMEJBQTBCLENBQUMsQ0FBQzs7Z0JBSTNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sRUFDdkQ7b0JBQ0ksTUFBTSxFQUFFLE1BQU07aUJBQ2pCLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO29CQUNOLE9BQU8sR0FBRyxDQUFDO2lCQUNkLENBQUMsQ0FBQzthQUVWOzs7Ozs7UUFFRCwyQ0FBbUI7Ozs7O1lBQW5CLFVBQW9CLE1BQWMsRUFBRSxNQUFXO2dCQUMzQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN0RTs7Ozs7O1FBRUQsa0RBQTBCOzs7OztZQUExQixVQUEyQixNQUFjLEVBQUUsTUFBVztnQkFDbEQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUM3RTs7Ozs7UUFFRCxnQ0FBUTs7OztZQUFSLFVBQVMsTUFBYztnQkFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUM7Ozs7O1FBRUQsbUNBQVc7Ozs7WUFBWCxVQUFZLE1BQWM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDdEQ7Ozs7O1FBRUQsb0NBQVk7Ozs7WUFBWixVQUFhLE1BQWM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDdkQ7Ozs7O1FBRUQsNkJBQUs7Ozs7WUFBTCxVQUFNLE1BQWM7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2hEOzs7Ozs7UUFFRCx3Q0FBZ0I7Ozs7O1lBQWhCLFVBQWlCLE1BQWMsRUFBRSxPQUFlO2dCQUM1QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNwRTs7Ozs7UUFLRCxxQ0FBYTs7OztZQUFiLFVBQWMsTUFBYztnQkFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUN4RDs7Ozs7UUFHRCxtQ0FBVzs7OztZQUFYLFVBQVksTUFBYztnQkFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUN0RDs7Ozs7O1FBR0QsMkNBQW1COzs7O1lBQW5CLFVBQW9CLE1BQWM7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO29CQUNoRCxPQUFPLEdBQUcsQ0FBQztpQkFDZCxDQUFDLENBQUM7YUFDTjs7Ozs7O1FBR0QsdUNBQWU7Ozs7O1lBQWYsVUFBZ0IsTUFBYyxFQUFFLE1BQU07Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUNyRCxVQUFBLEdBQUc7b0JBQ0MsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDO2lCQUN6QixDQUNKLENBQUM7YUFDTDs7Ozs7OztRQUVELCtDQUF1Qjs7Ozs7WUFBdkIsVUFBd0IsTUFBYyxFQUFFLE1BQU07Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztvQkFDekQsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3JCLENBQUMsQ0FBQzthQUNOOzs7Ozs7O1FBRUQsMERBQWtDOzs7Ozs7WUFBbEMsVUFBbUMsTUFBYyxFQUFFLE1BQU0sRUFBRSxTQUFTO2dCQUNoRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztvQkFDckQsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3JCLENBQUMsQ0FBQzthQUNOOzs7Ozs7UUFDRCx3REFBZ0M7Ozs7O1lBQWhDLFVBQWlDLE1BQWMsRUFBRSxNQUFNO2dCQUNuRCxPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ3pGOzs7Ozs7Ozs7O1FBS0QseURBQWlDOzs7Ozs7O1lBQWpDLFVBQWtDLE1BQWMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVM7O2dCQUN4RSxJQUFJLE9BQU8sR0FBRyxJQUFJQyxpQkFBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBRXZELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUMxRCxVQUFBLEdBQUc7b0JBQ0MsT0FBTyxHQUFHLENBQUM7aUJBQ2QsQ0FDSixDQUFDO2FBQ0w7Ozs7Ozs7UUFFRCw4Q0FBc0I7Ozs7OztZQUF0QixVQUF1QixNQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU87Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN6Rjs7Ozs7OztRQUVELGdEQUF3Qjs7Ozs7O1lBQXhCLFVBQXlCLE1BQWMsRUFBRSxNQUFNLEVBQUUsT0FBTztnQkFDcEQsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzNGOzs7Ozs7O1FBRUQsa0RBQTBCOzs7Ozs7WUFBMUIsVUFBMkIsTUFBYyxFQUFFLE1BQU0sRUFBRSxPQUFPO2dCQUN0RCxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNuRzs7Ozs7Ozs7O1FBS0QseURBQWlDOzs7Ozs7WUFBakMsVUFBa0MsTUFBYyxFQUFFLE1BQU0sRUFBRSxTQUFTO2dCQUMvRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUNqRCxVQUFBLEdBQUc7b0JBRUMsT0FBTyxHQUFHLENBQUM7aUJBQ2QsQ0FDSixDQUFDO2FBQ0w7Ozs7OztRQUVELDhDQUFzQjs7Ozs7WUFBdEIsVUFBdUIsTUFBYyxFQUFFLE1BQU07Z0JBQ3pDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hGOzs7Ozs7UUFJRCxzREFBOEI7Ozs7O1lBQTlCLFVBQStCLE1BQWMsRUFBRSxNQUFNO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ3hFOzs7Ozs7UUFFRCxnREFBd0I7Ozs7O1lBQXhCLFVBQXlCLE1BQWMsRUFBRSxNQUFNO2dCQUMzQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNsRTs7Ozs7O1FBRUQsa0RBQTBCOzs7OztZQUExQixVQUEyQixNQUFjLEVBQUUsTUFBTTtnQkFDN0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDcEU7Ozs7OztRQUVELHVEQUErQjs7Ozs7WUFBL0IsVUFBZ0MsTUFBYyxFQUFFLE1BQU07Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDekY7Ozs7OztRQUVELHVEQUErQjs7Ozs7WUFBL0IsVUFBZ0MsTUFBYyxFQUFFLE1BQU07Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDeEY7Ozs7Ozs7O1FBRUQseUNBQWlCOzs7Ozs7WUFBakIsVUFBa0IsTUFBYyxFQUFFLE1BQU0sRUFBRSxTQUFTOztnQkFDL0MsSUFBTSxPQUFPLEdBQUcsSUFBSUQsVUFBTyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7O2dCQUNuRCxJQUFNLE9BQU8sR0FBRyxJQUFJQyxpQkFBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBRXpELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUMxRCxVQUFBLEdBQUc7b0JBRUMsT0FBTyxHQUFHLENBQUM7aUJBQ2QsQ0FDSixDQUFDO2FBQ0w7O29CQWxZSkMsYUFBVSxTQUFDO3dCQUNSLFVBQVUsRUFBRSxNQUFNO3FCQUNyQjs7Ozs7d0JBVlFDLE9BQUk7d0JBQ0pDLGFBQVU7Ozs7NEJBRG5COzs7Ozs7O0FDQUEsUUFBQTs7Ozs7OztRQUVJLHNDQUFnQjs7OztZQUFoQixVQUFpQixRQUFROztnQkFFckIsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQzs7Z0JBQ2xELElBQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQzs7Z0JBQ3JCLElBQUksU0FBUyxDQUFDO2dCQUNkLFdBQVcsQ0FBQyxHQUFHLEVBQUUsVUFBQyxHQUFHLEVBQUUsTUFBTTtvQkFDekIsU0FBUyxHQUFFLE1BQU0sQ0FBQztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE9BQU8sU0FBUyxDQUFDO2FBQ3BCOzs7OztRQUVELG9DQUFjOzs7O1lBQWQsVUFBZSxRQUFROztnQkFDbkIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDOztnQkFDbEIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDOztnQkFDbEIsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDOztnQkFDdEIsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pDLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV4QyxPQUFPLFNBQVMsQ0FBQzthQUNwQjswQkF0Qkw7UUF1QkM7Ozs7OztBQ3ZCRDtRQWVJOzRCQUZzQyxJQUFJQyxlQUFZLEVBQUU7WUFHcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7O2dCQUN0QixJQUFJLFNBQVMsQ0FBUzs7Z0JBQ3RCLElBQUksUUFBUSxDQUFTO2dCQUNyQixTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQzlDLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxTQUFTLEVBQUU7b0JBQ1gsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRTt3QkFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3JHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtxQkFDaEM7eUJBQ0k7d0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFFBQVEsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDeEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7cUJBQzdCO2lCQUNKO2FBQ0o7U0FDSjs7OztRQUdNLDhDQUFxQjs7Ozs7Z0JBQ3hCLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7O2dCQUN2RCxJQUFJLFdBQVcsQ0FBQztnQkFDaEIsSUFBSSxXQUFXLEVBQUU7b0JBQ2IsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO3dCQUMzRSxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3FCQUNyQztpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7UUFJVCxtREFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7UUFHVCxrQ0FBUzs7Ozs7Z0JBRVosSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7O1FBR25CLDRCQUFHOzs7O3NCQUFDLEVBQVU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7OztRQUkxQix1Q0FBYzs7OztzQkFBQyxLQUFhO2dCQUMvQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztRQUk3QiwwQ0FBaUI7Ozs7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7O1FBR2xCLDZCQUFJOzs7O3NCQUFDLE1BQWM7OztnQkF3QnRCLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN6QyxJQUFJLEVBQUUsSUFBSTtvQkFDVixLQUFLLEVBQUUsSUFBSTtpQkFDZCxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFBLE1BQU07b0JBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEdBQTBHLENBQUMsQ0FBQTtpQkFDMUgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO29CQUNsQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3R0FBd0csQ0FBQyxDQUFBO2lCQUN4SCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUc7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7O2lCQUV2QixDQUFDLENBQUM7Ozs7Ozs7UUFJQSwwQ0FBaUI7Ozs7O3NCQUFDLFVBQWtCLEVBQUUsV0FBbUI7Z0JBQzVELE9BQU8sVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7OztvQkExSDdDSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7Ozs2QkFQRDs7Ozs7Ozs7UUNlSTs0QkFGc0MsSUFBSUcsZUFBWSxFQUFFO1lBR3BELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7OztnQkFHekUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7YUFDOUI7U0FDSjs7OztRQUVNLDBCQUFTOzs7OztnQkFFWixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDOzs7Ozs7UUFHbkIsb0JBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7OztRQUkxQiwyQ0FBMEI7Ozs7O3NCQUFDLEVBQVUsRUFBRSxRQUFhOztnQkFDdkQsUUFBUSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO29CQUMzQixRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQzVCLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3RDLEVBQUUsVUFBQSxLQUFLO29CQUNKLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUU7d0JBQ3ZCLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ3RDO3lCQUFNO3dCQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTs0QkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNqQixDQUFDLENBQUM7cUJBQ047aUJBQ0osQ0FBQyxDQUFDOzs7Ozs7O1FBS00sZ0RBQStCOzs7OztzQkFBQyxFQUFVLEVBQUUsUUFBYTs7Ozs7O2dDQUNsRSxRQUFRLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7OztnQ0FFRCxxQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFBOztnQ0FBM0IsTUFBTSxHQUFHLFNBQWtCO2dDQUMvQixRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0NBQzVCLHFCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFBOztnQ0FBakMsU0FBaUMsQ0FBQzs7OztzQ0FFOUIsT0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUE7b0NBQXJCLHdCQUFxQjtnQ0FDckIscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUE7O2dDQUFqQyxTQUFpQyxDQUFDOztvQ0FFbEMsc0JBQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtvQ0FDL0IsTUFBTSxDQUFDLE9BQUssQ0FBQyxDQUFDO2lDQUNqQixDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQW9CUiwrQkFBYzs7OztzQkFBQyxLQUFhO2dCQUMvQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7UUFJN0IsdUJBQU07Ozs7c0JBQUMsS0FBYTs7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07b0JBQ2hDLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDLENBQUMsQ0FBQzs7Ozs7UUFJQSxrQ0FBaUI7Ozs7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7O1FBR2xCLHFCQUFJOzs7O3NCQUFDLE1BQWM7OztnQkFDdEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7O2dCQUVwRSxJQUFJLE9BQU8sR0FBRztvQkFDVixLQUFLLEVBQUUsSUFBSTtpQkFDZCxDQUFDOztnQkFFRixJQUFJLFFBQVEsR0FBRztvQkFDWCxJQUFJLEVBQUUsSUFBSTtvQkFDVixLQUFLLEVBQUUsSUFBSTtpQkFDZCxDQUFDOztnQkFHRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQy9CLE9BQU8sU0FBQTtpQkFDVixDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFBLE1BQU07b0JBQ3BCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO29CQUNsQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBQSxLQUFLO29CQUNoQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ2hELENBQUMsQ0FBQzs7Ozs7Ozs7OztRQU9BLHFDQUFvQjs7Ozs7Ozs7c0JBQUMsVUFBa0IsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLFdBQW1CLEVBQUUsT0FBZTtnQkFDaEgsT0FBTyxLQUFLLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7Ozs7O1FBSXpGLHdCQUFPOzs7OztnQkFDVixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7b0JBQzFCLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDNUUsQ0FBQyxDQUFDOzs7b0JBcElWSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7OztxQkFQRDs7Ozs7OztBQ0FBLFFBQUE7UUFJSSxpQkFBWSxVQUFpQixFQUFFLE9BQWM7WUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7U0FDeEI7c0JBUEw7UUFRQzs7Ozs7O0FDUkQsUUFBQTs7OytCQUFBO1FBTUM7Ozs7OztBQ0pELFFBQUE7O29DQVU4QixJQUFJLEtBQUssRUFBb0I7O3lCQVozRDtRQWFDOzs7Ozs7QUNiRCxRQUlBOzswQkFnQmtDLElBQUk7Z0NBQ0ssSUFBSTttQ0FDekIsSUFBSSxLQUFLLEVBQWM7Z0NBQzFCLElBQUksVUFBVSxFQUFFOzBCQUN0QixJQUFJLEtBQUssRUFBYzs2QkFDcEIsSUFBSSxLQUFLLEVBQWtCOzsyQkF6QjNDO1FBMEJDLENBQUE7QUF0QkQsUUF3QkE7Ozs2QkE1QkE7UUFnQ0M7Ozs7OztBQzFCRCxRQUFBO1FBc0JJO2tDQVppQixJQUFJLEtBQUssRUFBZ0I7c0NBQ3JCLElBQUksS0FBSyxFQUFvQjtnQ0FDbkMsSUFBSSxLQUFLLEVBQW1CO29DQUNBLElBQUk7Z0NBRWhDLElBQUksS0FBSyxFQUFPOzZCQUNuQixJQUFJLEtBQUssRUFBb0I7bUNBR2QsSUFBSTtTQU05QjsyQkEvQkw7UUFrQ0MsQ0FBQTtBQTVCRCxRQThCQTs7OytCQXBDQTtRQXdDQzs7Ozs7O0FDeENELFFBQUE7OzsyQkFBQTtRQU1DOzs7Ozs7QUNORCxRQUFBOzs7OEJBQUE7UUFHQyxDQUFBO0FBSEQsUUFLQTs7b0NBR3VDLEtBQUs7K0JBQ1YsS0FBSzswQkFFWCxFQUFFOytCQUNHLEVBQUU7a0NBQ0MsRUFBRTs2QkFDUCxFQUFFOytCQUNBLEVBQUU7K0JBRUYsRUFBRTs0QkFDTCxFQUFFOzhCQUNBLEVBQUU7aUNBRUMsQ0FBQyxDQUFDO2tDQUNELENBQUMsQ0FBQzs4QkFDTixDQUFDLENBQUM7a0NBQ0UsRUFBRTtnQ0FDSixFQUFFO3FDQUNMLEVBQUU7OzBCQTFCakM7UUEyQkMsQ0FBQTtBQXRCRCxRQXdCQTs7OzhCQTdCQTtRQWdDQzs7Ozs7O0FDaENELFFBQUE7OzsyQkFBQTtRQUdDOzs7Ozs7QUNERCxRQUFBOztnQ0FPZ0MsQ0FBQzt1Q0FDQSxJQUFJLEtBQUssRUFBdUI7Z0NBTS9CLElBQUk7O3VCQWhCdEM7UUFrQkM7Ozs7OztBQ1pELFFBQUE7OzhCQVFnQyxDQUFDO3lCQUVkLElBQUksS0FBSyxFQUFtQjtnQ0FDckIsSUFBSSxLQUFLLEVBQW1CO2dDQUM1QixJQUFJLEtBQUssRUFBZ0I7dUNBQ2xCLElBQUksS0FBSyxFQUF1QjttQ0FHcEMsSUFBSSxLQUFLLEVBQXNCO2tDQUd6QixFQUFFOzs7OztRQUcxQixrQ0FBWTs7OztnQkFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxPQUFPLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7Ozs7UUFJaEUsc0NBQWdCOzs7O2dCQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7Ozs7O1FBS3BFLHNDQUFnQjs7OztzQkFBQyxNQUFNO2dCQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDOzs7OztRQUt0RSxtQ0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7OzBCQTlDakY7UUFnREM7Ozs7OztBQzlDRCxRQUFBOzt1Q0FPaUMsSUFBSSxLQUFLLEVBQXVCOzt3QkFUakU7UUFVQzs7Ozs7O0lDVkQsSUFBQTs7O3lCQUFBO1FBS0MsQ0FBQTs7Ozs7O0FDREQ7SUFTQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDdkIsUUFBQTs7UUErQ0k7NkJBdkN5QixDQUFDO3lCQUNMLENBQUM7Z0NBQ00sQ0FBQzt5QkFVZCxJQUFJLEtBQUssRUFBZTt1Q0FDVixJQUFJLEtBQUssRUFBdUI7aUNBQ3RDLElBQUksS0FBSyxFQUFnQjtpQ0FDekIsSUFBSSxLQUFLLEVBQWlCOzZCQUM5QixJQUFJLEtBQUssRUFBWTs4QkFDcEIsSUFBSSxVQUFVLEVBQUU7NkJBQ2pCLElBQUksS0FBSyxFQUFhO2dDQUNuQixJQUFJLEtBQUssRUFBZ0I7a0NBQ3ZCLElBQUksS0FBSyxFQUFpQjtvQ0FTeEIsSUFBSSxLQUFLLEVBQXNCO2tDQUV6QixLQUFLO2tDQUVMLEtBQUs7WUFPakMsSUFBSSxDQUFDLEtBQUssR0FBRSxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN2RDt5QkEvREw7UUFpRUM7Ozs7OztBQy9ERCxRQUFBOzt1Q0FLaUMsSUFBSSxLQUFLLEVBQXVCOzsyQkFQakU7UUFTQzs7Ozs7O0FDVEQsUUFBQTs7OzRCQUFBO1FBTUM7Ozs7OztBQ05ELFFBQUE7OztrQ0FBQTtRQU9DOzs7Ozs7UUNMRDs7Ozs7Ozs7Ozs7UUFFVywyQ0FBcUI7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDeEUsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7Z0JBQ3ZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBR25HLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFHSiwyQ0FBcUI7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDeEUsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7Z0JBQ3ZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBR25HLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7Ozs7Ozs7O1FBR0UsOENBQXdCOzs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVU7Ozs7d0JBSTdGLElBQUk7NEJBQ0EsSUFBSSxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQzVHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBOzRCQUN2QixzQkFBTyxJQUFJLEVBQUM7eUJBQ2Y7d0JBQ0QsV0FBSzs0QkFDRCxzQkFBTyxJQUFJLEVBQUM7eUJBQ2Y7Ozs7Ozs7Ozs7Ozs7O1FBR0UsdUNBQWlCOzs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVksRUFDbEYsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7Z0JBQ3ZELGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyx5QkFBeUIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFHOUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3BDLENBQUMsQ0FBQzs7Ozs7OztRQUdMLCtDQUF5Qjs7Ozs7WUFBL0IsVUFBZ0MsYUFBNEIsRUFBRSxTQUFpQjs7Ozs7O2dDQUV2RSxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0NBQ3JDLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUE1RixJQUFJLEdBQUcsU0FBcUYsQ0FBQTtnQ0FDNUYsc0JBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQTs7OzthQUMxQjs7Ozs7OztRQUVLLG1DQUFhOzs7Ozs7WUFBbkIsVUFBb0IsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVk7Ozs7OztnQ0FFeEUsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2dDQUNyQixxQkFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQTVGLElBQUksR0FBRyxTQUFxRixDQUFBO2dDQUU1RixzQkFBTyxJQUFJLEVBQUM7Ozs7YUFDZjs7Ozs7Ozs7O1FBRUssK0NBQXlCOzs7Ozs7OztZQUEvQixVQUFnQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsUUFBYSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7Ozs7OztnQ0FFMUgsSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dDQUN2RyxxQkFBTSxhQUFhLENBQUMsd0JBQXdCLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUF2RyxJQUFJLEdBQUcsU0FBZ0csQ0FBQTtnQ0FDdkcsc0JBQU8sSUFBSSxFQUFBOzs7O2FBQ2Q7Ozs7Ozs7OztRQUVNLHVDQUFpQjs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUNwRSxLQUFVLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjtnQkFDdkQsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFL0YsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDN0UsQ0FBQyxDQUFDOzswQkEzRmY7UUE2RkM7Ozs7OztRQzFGRDs7Ozs7Ozs7Ozs7UUFFVyx3Q0FBYTs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUNoRSxLQUFVLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjtnQkFDdkQsYUFBYSxDQUFDLHdCQUF3QixDQUFDLDJCQUEyQixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFHakcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3BDLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQUlYLG9EQUF5Qjs7Ozs7OztZQUF6QixVQUEwQixhQUE0QixFQUFFLFNBQWlCLEVBQ3JFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDLGFBQWEsQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEdBQUcsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRW5GLElBQUksVUFBVSxDQUFDO29CQUNmLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUU5QixJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7d0JBQzlDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7cUJBQ2hFO29CQUVELFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDMUIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNsQyxDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7O1FBS00scURBQTBCOzs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUN6RixVQUFvQixFQUFFLFdBQXFCO2dCQUUzQyxhQUFhLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFbkcsSUFBSSxVQUFVLENBQUM7b0JBQ2YsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O29CQUd6QyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7d0JBQ3ZELFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ2xGOztvQkFHRCxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxTQUFTO3dCQUM5QyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTs0QkFDN0UsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ3REO3FCQUNKLENBQUMsQ0FBQztvQkFFSCxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzFCLEVBQ0csVUFBQSxHQUFHO29CQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O29CQUVqQixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztRQU1KLHNEQUEyQjs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQUUsVUFBa0IsRUFDOUcsVUFBb0IsRUFBRSxXQUFxQjtnQkFFM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyx5Q0FBeUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFdkgsSUFBSSxZQUFZLENBQUM7b0JBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztvQkFHM0MsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO3dCQUN4RCxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNwRjs7b0JBR0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTt3QkFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7NEJBQ3ZFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUNoRDtxQkFDSixDQUFDLENBQUM7b0JBRUgsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUM1QixFQUNHLFVBQUEsR0FBRzs7O29CQUdDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUMsQ0FBQyxDQUFDOzs7Ozs7OztRQU1FLGtEQUF1Qjs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQjs7Ozs7O2dDQUduRyxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0NBRXJCLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMscUNBQXFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBcEgsVUFBVSxHQUFHLFNBQXVHLENBQUM7Z0NBRXJILHNCQUFPLFVBQVUsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFJZixpREFBc0I7Ozs7Ozs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUFFLFVBQWtCLEVBQUUsVUFBa0IsRUFDaEksVUFBb0IsRUFBRSxXQUFxQixFQUFFLFdBQW1CLEVBQUUsV0FBbUI7Z0JBQXhDLDRCQUFBO29CQUFBLG1CQUFtQjs7Z0JBQUUsNEJBQUE7b0JBQUEsbUJBQW1COzs7Z0JBRXJGLElBQUksS0FBSyxDQUFDO2dCQUNWLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLFdBQVcsRUFBRTtvQkFDYixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDNUI7Z0JBRUQsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBQzNGLElBQUksV0FBVyxDQUFNO29CQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDOzs7O29CQUtuQixJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQzVILElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ2QsV0FBVyxHQUFHLElBQUksQ0FBQzt5QkFDdEI7cUJBQ0o7b0JBQ0QsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUMzQixFQUNHLFVBQUEsR0FBRztvQkFDQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztRQVdKLHNEQUEyQjs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFhLEVBQzdGLFVBQW9CLEVBQUUsV0FBcUI7O2dCQUUzQyxJQUFJLEtBQUssQ0FBQztnQkFDVixLQUFLLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBRWxDLGFBQWEsQ0FBQyxhQUFhLENBQUMseUNBQXlDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBRXBHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O1FBY0Usc0RBQTJCOzs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFhLEVBQ25HLFVBQWtCLEVBQUUsVUFBa0IsRUFBRSxXQUE0QjtnQkFBNUIsNEJBQUE7b0JBQUEsbUJBQTRCOzs7Ozs7O2dDQUdwRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztnQ0FFbkQsSUFBSSxXQUFXLEVBQUU7b0NBQ2IsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7aUNBQzVCO2dDQUNNLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBekcsSUFBSSxHQUFHLFNBQWtHLENBQUM7Z0NBQzFHLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7O1FBVUgseURBQThCOzs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxRQUFnQjs7Ozs7O2dDQUV6RyxLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0NBQ2pCLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMsdUNBQXVDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBckgsSUFBSSxHQUFRLFNBQXlHO2dDQUN6SCxzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7Ozs7UUFLVCxpREFBc0I7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQ3JGLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsb0NBQW9DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQy9GLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O1FBZ0NKLGdEQUFxQjs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQ3BGLFVBQW9CLEVBQUUsV0FBcUI7Z0JBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQzlGLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFLSix1REFBNEI7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQzNGLFVBQW9CLEVBQUUsV0FBcUI7Z0JBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsMENBQTBDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQ3JHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O1FBY0osK0NBQW9COzs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDbkYsVUFBb0IsRUFBRSxXQUFxQjtnQkFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQ0FBa0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtvQkFDN0YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsR0FBRztvQkFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzlDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7UUFXSixxREFBMEI7Ozs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUN6RixVQUFvQixFQUFFLFdBQXFCO2dCQUMzQyxhQUFhLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUMzRixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzdELEVBQ0csVUFBQSxHQUFHO29CQUNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBR0osbURBQXdCOzs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUNyRixVQUFvQixFQUFFLFdBQXFCO2dCQUMzQyxhQUFhLENBQUMsYUFBYSxDQUFDLDhCQUE4QixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFDdkYsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDakQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUN6QixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QyxDQUFDLENBQUM7OytCQWhVZjtRQWtVQzs7Ozs7O0FDbFVELFFBQUE7O3NDQUd3QyxDQUFDOzRDQUNILElBQUksS0FBSyxFQUF3Qjs7aUNBSnZFO1FBS0MsQ0FBQTtBQUxELFFBT0E7O21DQUk2QixDQUFDOzhCQUNOLElBQUksS0FBSyxFQUFPO3NDQUNZLElBQUk7aUNBQ3JCLENBQUM7MkJBQ1AsSUFBSTt5QkFNZCxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7O21DQXJCdkM7UUF1QkMsQ0FBQTtBQWhCRCxRQWtCQTs7O2lDQXpCQTtRQWdDQzs7Ozs7O0FDaENELFFBQUE7UUFDSTtTQUVDOzs7Ozs7UUFFTSxzQkFBSzs7Ozs7c0JBQUMsQ0FBTSxFQUFFLFFBQWdCOztnQkFDakMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUM7O3FCQVA1RDtRQVNDOzs7Ozs7O0lDY0QsSUFBTUksUUFBTSxHQUFHLE9BQU8sQ0FBQztBQUN2QixRQUFBO1FBTUksNEJBQVksU0FBYyxFQUFFLGNBQTJCOzJCQUw5QixJQUFJLE1BQU0sRUFBRTs2QkFVbEI7Z0JBQ2YsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtnQkFDckMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtnQkFDckMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtnQkFDdkMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtnQkFDdkMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtnQkFDMUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtnQkFDekMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUEsRUFBRTtnQkFDeEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtnQkFDeEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtnQkFDdkMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQSxFQUFFO2dCQUNwQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTthQUUvQztZQWpCRyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztTQUN6Qzs7Ozs7Ozs7O1FBb0JNLGlEQUFvQjs7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxhQUEyQixFQUFFLFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxXQUF1Qjs7O2dCQUNoSyxJQUFJLEtBQUssQ0FBQzs7Z0JBQ1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQzs7Z0JBQzlCLElBQUksWUFBWSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7O2dCQUNwQyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztnQkFDaEMsSUFBSSxXQUFXLEVBQUU7b0JBQ2IsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBQSxDQUFDLEdBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLGVBQWU7O3dCQUN2RixJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7O3dCQUNuRCxJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7O3dCQUcvQyxJQUFJLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxlQUFlLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFOzRCQUVoSCxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQzs0QkFDMUIsZUFBZSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxVQUFBLFVBQVU7Z0NBQ2hELEtBQUssR0FBRyxLQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dDQUM3RyxJQUFJLEtBQUssRUFBRTtvQ0FDUCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lDQUN0Qjs2QkFDSixDQUFDLENBQUM7NEJBRUgsS0FBSyxHQUFHLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3BGLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTs7O2dDQUVwQixLQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7Z0NBQ3hELEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0NBQ3JELFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQzVCO3lCQUNKO3FCQUVKLENBQUMsQ0FBQztvQkFDSCxPQUFPLFlBQVksQ0FBQztpQkFDdkI7cUJBQU07b0JBQ0gsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Ozs7OztRQUlMLG1EQUFzQjs7OztZQUF0QixVQUF1QixlQUEyQjs7Z0JBQzlDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztnQkFFbEIsSUFBSSxlQUFlLENBQUMsUUFBUSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRTtvQkFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztpQkFDbEI7Z0JBRUQsSUFBSSxlQUFlLENBQUMsVUFBVSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRTtvQkFDL0QsTUFBTSxHQUFHLEtBQUssQ0FBQztpQkFDbEI7Z0JBRUQsT0FBTyxNQUFNLENBQUM7YUFDakI7Ozs7Ozs7OztRQUdNLHFEQUF3Qjs7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxhQUEyQixFQUFFLFlBQXlCLEVBQUUsVUFBNkIsRUFBRSxXQUF1Qjs7Z0JBQ25LLElBQUksS0FBSyxDQUFDOztnQkFDVixJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO2dCQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUNyRCxJQUFJLFNBQVMsQ0FBZTs7b0JBQzVCLElBQUksWUFBWSxDQUFDO29CQUNqQixTQUFTLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksVUFBVSxFQUFFO3dCQUMzRSxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUU1RixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7NEJBQzNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3RCOzZCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFOzs0QkFFakYsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDcEMsT0FBTyxLQUFLLENBQUM7eUJBQ2hCOzZCQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTs7NEJBRS9FLE9BQU8sS0FBSyxDQUFDO3lCQUNoQjs2QkFBTTs7NEJBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdEI7cUJBQ0o7eUJBQU07d0JBQ0gsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFNeEUsc0RBQXlCOzs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsYUFBMkIsRUFBRSxZQUF5QixFQUFFLFNBQXVCOztnQkFDckksSUFBSSxXQUFXLENBQUM7O2dCQUNoQixJQUFJLEtBQUssQ0FBQztnQkFDVixXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2pELEtBQUssR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM1RyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzFDLE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztRQVFWLCtDQUFrQjs7Ozs7O3NCQUFDLEtBQUssRUFBRSxTQUF1QjtnQkFDcEQsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO29CQUNwQixLQUFLLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7aUJBQzdDOzs7Ozs7Ozs7O1FBS0UseURBQTRCOzs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLGFBQTJCLEVBQUUsWUFBeUIsRUFBRSxTQUF1QixFQUFFLFlBQVk7OztnQkFDdEosSUFBSSxZQUFZLENBQUM7O2dCQUNqQixJQUFJLEtBQUssQ0FBQztnQkFDVixJQUFJO29CQUVBLFFBQVEsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRzs7d0JBRXBDLEtBQUssb0JBQW9COzRCQUNyQixZQUFZLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFBLENBQUMsQ0FBQTs0QkFDcE4sWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUN6RCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUM1QyxNQUFNO3dCQUNWLEtBQUssT0FBTzs0QkFDUixLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUM3RixNQUFNO3dCQUNWLEtBQUssUUFBUTs0QkFDVCxLQUFLLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQ2pGLE1BQU07d0JBQ1YsS0FBSyxpQkFBaUI7NEJBQ2xCLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUNuSixNQUFNO3dCQUNWLEtBQUssU0FBUzs0QkFDVixLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQ3hFLE1BQU07d0JBQ1YsS0FBSyxTQUFTOzRCQUNWLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQzs0QkFDN0UsTUFBTTt3QkFDVixLQUFLLFdBQVc7NEJBQ1osS0FBSyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQ2hILE1BQU07d0JBQ1YsS0FBSyxNQUFNOzRCQUNQLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFBOzRCQUMzRCxNQUFNO3dCQUNWLEtBQUssV0FBVzs0QkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQTs0QkFDNUQsTUFBTTs7Ozs0QkFLTixNQUFNO3dCQUNWOzRCQUNJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQzs0QkFDckMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7NEJBQzNDLE1BQU07cUJBQ2I7aUJBQ0o7Z0JBQUMsV0FBTTtvQkFDSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O1FBSVYsOENBQWlCOzs7Ozs7c0JBQUMsTUFBa0IsRUFBRSxJQUFJLEVBQUUsS0FBSzs7Z0JBQ3BELElBQUksYUFBYSxDQUFDOztnQkFDbEIsSUFBSSxLQUFLLENBQUM7Z0JBQ1YsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7OztvQkFJbkIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsWUFBWSxHQUFBLENBQUMsQ0FBQztvQkFDekQsSUFBSSxDQUFDLGFBQWEsRUFBRTt3QkFDaEIsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkM7eUJBQU07d0JBQ0gsSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLEtBQUssSUFBSSxPQUFPLEVBQUU7OzRCQUN6QyxJQUFJLG9CQUFrQixHQUFHLEVBQUUsQ0FBQzs0QkFDNUIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFBLFNBQVM7Z0NBQzNCLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO29DQUNuQyxTQUFTLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUs7d0NBQy9CLElBQUksQ0FBQyxvQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLElBQUksS0FBSyxHQUFBLENBQUM7NENBQUUsb0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FDQUNqRixDQUFDLENBQUM7aUNBQ047cUNBQ0k7b0NBQ0QsSUFBSSxDQUFDLG9CQUFrQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsSUFBSSxTQUFTLENBQUMsV0FBVyxHQUFBLENBQUM7d0NBQUUsb0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDakg7NkJBQ0osQ0FBQyxDQUFDOzRCQUNILE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLG9CQUFrQixFQUFFLENBQUM7eUJBQ2hGOzZCQUNJOzs0QkFDRCxJQUFJLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDOzs0QkFFaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksR0FBQSxDQUFDLENBQUM7NEJBQ3RELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O2dDQUVyQixLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7NkJBQ3pDO2lDQUFNO2dDQUNILEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs2QkFDckM7eUJBQ0o7cUJBRUo7O29CQUdELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxTQUFTLEdBQUEsQ0FBQyxFQUFFO3dCQUMvQixLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO3FCQUM3QjtpQkFDSjtxQkFDSTtvQkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN2QztnQkFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7OztRQUlWLDZDQUFnQjs7Ozs7c0JBQUMsU0FBa0IsRUFBRSxZQUFZOztnQkFDcEQsSUFBSSxLQUFLLENBQUM7Z0JBQ1YsS0FBSyxHQUFHLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQ3RELElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7b0JBQ2hFLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQzNDO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7O1FBVVYsNERBQStCOzs7Ozs7OztzQkFBQyxVQUE4QixFQUFFLEtBQXlCLEVBQUUsUUFBb0IsRUFBRSxhQUFzQjs7Z0JBQzFJLElBQUksS0FBSyxHQUFRLElBQUksQ0FBQztnQkFDdEIsSUFBSTs7b0JBQ0EsSUFBSSxPQUFPLEdBQWUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7b0JBRy9DLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7b0JBRXZHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFL0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLEdBQUEsQ0FBQyxFQUFFO3dCQUMvRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUN2RjtpQkFFSjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO29CQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQjtnQkFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7OztRQVNWLDBEQUE2Qjs7Ozs7Ozs7c0JBQUMsVUFBOEIsRUFBRSxLQUF5QixFQUFFLFFBQW9CLEVBQUUsYUFBc0I7O2dCQUN4SSxJQUFJLEtBQUssR0FBUSxJQUFJLENBQUM7Z0JBQ3RCLElBQUk7O29CQUNBLElBQUksT0FBTyxHQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUMvQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUEsQ0FBQyxDQUFDO29CQUMxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ3RDLElBQUksVUFBVSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO3dCQUMxRCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3BHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3FCQUMvQjtvQkFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksR0FBQSxDQUFDLEVBQUU7d0JBQy9ELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7cUJBQ3ZGO2lCQUVKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7b0JBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztRQUlULGtEQUFxQjs7Ozs7O3NCQUFDLE9BQW1CLEVBQUUsUUFBb0IsRUFBRSxlQUF1Qjs7Z0JBQzVGLElBQUksYUFBYSxHQUFXLGVBQWUsQ0FBQztnQkFFNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUNyQyxJQUFJLGNBQWMsR0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDOztvQkFDakQsSUFBSSxVQUFVLEdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDMUMsSUFBSSxhQUFhLElBQUksY0FBYyxFQUFFOzt3QkFDakMsSUFBSSxPQUFPLEdBQVcsQ0FBQyxDQUFDO3dCQUN4QixJQUFJLGFBQWEsR0FBRyxjQUFjLElBQUksQ0FBQyxFQUFFLENBQ3hDOzZCQUFNOzRCQUNILE9BQU8sR0FBRyxhQUFhLEdBQUcsY0FBYyxDQUFDOzRCQUN6QyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs0QkFDdkQsYUFBYSxHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUM7eUJBQzNDO3dCQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3BGLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDcEcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7eUJBQy9CO3dCQUNELE1BQU07cUJBQ1Q7aUJBQ0o7Ozs7Ozs7O1FBU0Usd0RBQTJCOzs7Ozs7c0JBQUMsUUFBb0IsRUFBRSxPQUFPOztnQkFDNUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztnQkFDdkMsSUFBSTtvQkFFQSxLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ2hELGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3JDO2lCQUNKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbkI7Z0JBRUQsT0FBTyxlQUFlLENBQUM7Ozs7Ozs7OztRQVdwQixpREFBb0I7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxTQUF1QixFQUFFLFlBQVk7O2dCQUN0RixJQUFJLEtBQUssQ0FBTTtnQkFDZixJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtvQkFDcEosS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBRXJEO3FCQUFNO29CQUNILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUM5QztnQkFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7O1FBU1Ysc0RBQXlCOzs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsU0FBdUIsRUFBRSxZQUFZOztnQkFDM0YsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDMUIsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O1FBR2pCLHdEQUEyQjs7Ozs7O1lBQTNCLFVBQTRCLFlBQXdCLEVBQUUsU0FBdUIsRUFBRSxZQUFZO2dCQUN2RixJQUFJOztvQkFDQSxJQUFJLEtBQUssQ0FBTTtvQkFDZixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7d0JBQ2xILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUNyRDt5QkFBTTt3QkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDOUM7aUJBRUo7Z0JBQUMsV0FBTTtvQkFDSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7YUFDaEI7Ozs7Ozs7O1FBUU0sa0RBQXFCOzs7Ozs7O3NCQUFDLGFBQTJCLEVBQUUsU0FBdUIsRUFBRSxZQUFZO2dCQUMzRixJQUFJOztvQkFDQSxJQUFJLEtBQUssQ0FBTTtvQkFDZixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7d0JBQ25ILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUNyRDt5QkFBTTt3QkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDOUM7aUJBRUo7Z0JBQUMsV0FBTTtvQkFDSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7OztRQVdWLHdEQUEyQjs7Ozs7OztzQkFBQyxhQUEyQixFQUFFLFNBQXVCLEVBQUUsWUFBWTtnQkFDakcsSUFBSTs7b0JBQ0EsSUFBSSxLQUFLLENBQU07b0JBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO3dCQUNuSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztxQkFDckQ7eUJBQU07d0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzlDO2lCQUVKO2dCQUFDLFdBQU07b0JBQ0osS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzlDO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztRQVVWLG1EQUFzQjs7Ozs7O3NCQUFDLFNBQXVCLEVBQUUsWUFBWTs7Z0JBQy9ELElBQUksS0FBSyxDQUFNO2dCQUNmLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO29CQUNwTCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztpQkFDckQ7cUJBQU07b0JBQ0gsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO3dCQUNqSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztxQkFDckQ7eUJBQU07d0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzlDO2lCQUNKO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztRQVFWLGtEQUFxQjs7Ozs7O3NCQUFDLFNBQXVCLEVBQUUsWUFBWTs7O2dCQUM5RCxJQUFJLEtBQUssQ0FBTTtnQkFDZixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO29CQUN4TSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztpQkFFckQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTs7d0JBQy9ILEtBQXNCLElBQUEsS0FBQUMsU0FBQSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBLGdCQUFBLDRCQUFFOzRCQUFoRixJQUFNLE9BQU8sV0FBQTs0QkFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtnQ0FDekYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDOzZCQUNwRDt5QkFDSjs7Ozs7Ozs7Ozs7Ozs7O29CQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDN0M7cUJBQ0k7b0JBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzlDO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7OztRQUlWLDJEQUE4Qjs7Ozs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsYUFBMkIsRUFBRSxZQUF5QixFQUNqSCxjQUFzQyxFQUFFLGlCQUF5QixFQUFFLHFCQUFxQjs7O2dCQUN4RixJQUFJLEtBQUssQ0FBQzs7Z0JBQ1YsSUFBSSxxQkFBcUIsQ0FBQztnQkFDMUIsUUFBUSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7b0JBQzVCLEtBQUssVUFBVTt3QkFFWCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFDbkosS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO3dCQUNyRCxNQUFNO29CQUNWLEtBQUssWUFBWTt3QkFDYixxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFDMUwsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO3dCQUNyRCxNQUFNO29CQUNWLEtBQUssU0FBUzt3QkFDVixxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBQSxDQUFDLENBQUM7d0JBRTFMLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQzt3QkFDckQsTUFBTTtvQkFDVixLQUFLLFVBQVU7d0JBQ1gscUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO3dCQUVqTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ3JELE1BQU07b0JBQ1YsS0FBSyxVQUFVO3dCQUNYLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO3dCQUV6SyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBRXpELEtBQUssYUFBYTs7d0JBQ2QsSUFBSSxXQUFXLFVBQWdCO3dCQUMvQixxQkFBcUIsR0FBRyxTQUFTLENBQUM7d0JBQ2xDLFdBQVcsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBQSxDQUFDLENBQUE7d0JBQ3RHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLFdBQVcsRUFBRTs0QkFDeEUscUJBQXFCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM3Qzs2QkFBTSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDbEYscUJBQXFCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM3Qzt3QkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ3JELE1BQU07b0JBQ1YsS0FBSyxTQUFTO3dCQUNWLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO3dCQUMvSyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ3JELE1BQU07b0JBQ1YsS0FBSyxjQUFjOzt3QkFDZixJQUFJLFFBQVEsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNoQyxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO3dCQUMxSyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQ3JELE1BQU07b0JBQ1YsS0FBSyxvQkFBb0I7d0JBQ3JCLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFOzRCQUM5RCxJQUFJOztnQ0FDQSxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFBO2dDQUUvSCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFDO2dDQUM3SixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7NkJBQ3hEOzRCQUFDLFdBQU07Z0NBQ0osS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDdkM7eUJBQ0o7NkJBQU07NEJBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDdkM7d0JBQ0QsTUFBTTtvQkFDVjs7d0JBRUksUUFBUSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFOzRCQUMxQyxLQUFLLE1BQU07O2dDQUNQLElBQUksUUFBUSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQ0FDdEQscUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQ0FDdEosS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dDQUNyRCxNQUFNOzRCQUNWLEtBQUssTUFBTTs7Z0NBQ1AsSUFBSSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dDQUN0RCxxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7Z0NBQ3pLLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQ0FDckQsTUFBTTs0QkFDVjtnQ0FDSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0NBQ3JDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2dDQUMzQyxNQUFNO3lCQUNiO3dCQUNELE1BQU07aUJBRWI7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7OztRQU9WLDZDQUFnQjs7OztzQkFBQyxjQUFjOztnQkFDbEMsSUFBSSxLQUFLLENBQUM7O2dCQUNWLElBQUksWUFBWSxDQUFDO2dCQUNqQixJQUFJLGNBQWMsRUFBRTtvQkFDaEIsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDOztvQkFFdkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxDQUFBO29CQUN6RCxJQUFJLEtBQUssRUFBRTs7d0JBRVAsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7cUJBQ3JEO3lCQUFNO3dCQUNILEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUM5QztpQkFFSjtxQkFBTTtvQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7UUFPVix1REFBMEI7Ozs7O3NCQUFDLFlBQWlCOztnQkFDL0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJOzs7b0JBR0EsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7d0JBQ3ZFLFFBQVEsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSTs0QkFDdkMsS0FBSyxVQUFVO2dDQUNYLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDdkcsTUFBTTs0QkFDVjtnQ0FDSSxNQUFNO3lCQUNiO3FCQUNKO2lCQUNKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztvQkFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbkI7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7UUFHViw0Q0FBZTs7Ozs7c0JBQUMsSUFBVSxFQUFFLElBQVU7O2dCQUV6QyxJQUFJLFdBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDOztnQkFXN0IsSUFBSSxZQUFZLEdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxLQUFLLEdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDOztnQkFDL0MsSUFBSSxLQUFLLEdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM5QyxJQUFJLFlBQVksSUFBSSxLQUFLLElBQUksWUFBWSxJQUFJLEtBQUssRUFBRTtvQkFDaEQsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7cUJBQU07b0JBQ0gsT0FBTyxLQUFLLENBQUM7aUJBQ2hCOzs7Ozs7UUFJRSwyQ0FBYzs7OztzQkFBQyxJQUFVOztnQkFDNUIsSUFBSSxDQUFDLEdBQUdELFFBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxDQUFDOzs7Ozs7O1FBS04sMENBQWE7Ozs7O3NCQUFDLEtBQUssRUFBRSxZQUFZOztnQkFDcEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7b0JBQzVELEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ3ZDOzs7Ozs7O1FBSUUsb0RBQXVCOzs7OztzQkFBQyxXQUF1QixFQUFFLEtBQUs7Z0JBQ3pELEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO2dCQUM1QyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDOztnQkFFN0MsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtvQkFDdEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQzNFO3FCQUFNO29CQUVILElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTt3QkFDckIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztxQkFDMUM7b0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO3dCQUNwQixLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO3FCQUN4QztpQkFDSjs7Ozs7Ozs7UUFRRSw4Q0FBaUI7Ozs7OztzQkFBQyxZQUF3QixFQUFFLGFBQTJCLEVBQUUsV0FBOEI7O2dCQUMxRyxJQUFJLG1CQUFtQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztnQkFDdEYsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFRbkksK0NBQWtCOzs7Ozs7O3NCQUFDLFlBQXdCLEVBQUUsV0FBdUIsRUFBRSxXQUE4QjtnQkFDdkcsSUFBSTs7b0JBQ0EsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ25ELG1CQUFtQixDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO29CQUN4RCxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7b0JBQzdDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO2lCQUMzRztnQkFBQyxXQUFNO29CQUNKLE9BQU8sSUFBSSxDQUFDO2lCQUNmOzs7Ozs7Ozs7O1FBVUUsaURBQW9COzs7Ozs7OztzQkFBQyxZQUF3QixFQUFFLE9BQWUsRUFBRSxtQkFBdUMsRUFBRSxXQUE4Qjs7Z0JBQzFJLElBQUkscUJBQXFCLENBQXVCOztnQkFDaEQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBd0IsQ0FBQztnQkFFekQsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O29CQUU3QyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2pDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUN2RyxJQUFJLHFCQUFxQixFQUFFO3dCQUN2QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztxQkFDaEQ7aUJBRUo7Z0JBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDOzs7Ozs7O2dCQVMzRSxJQUFJLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQ3JDLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7aUJBQ3ZDOzs7O2dCQUlELE9BQU8sbUJBQW1CLENBQUM7Ozs7Ozs7OztRQVF4QixrREFBcUI7Ozs7Ozs7c0JBQUMsZ0JBQTZDLEVBQUUsbUJBQXVDLEVBQUUsTUFBYzs7O2dCQUMvSCxJQUFJLHdCQUF3QixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQzs7Z0JBRW5GLElBQUksQ0FBQyx3QkFBd0IsRUFBRTs7b0JBSTNCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUM7O29CQUNoRixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDOztvQkFHdEYsSUFBSSxZQUFZLEdBQUcsU0FBUyxFQUFFO3dCQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxDQUFDO3FCQUN6RTt5QkFDSTt3QkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7cUJBQy9FO29CQUNELG1CQUFtQixDQUFDLHdCQUF3QixHQUFHLGdCQUFnQixDQUFBOzs7d0JBSS9ELEtBQW9CLElBQUEsS0FBQUMsU0FBQSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFBLENBQUMsQ0FBQSxnQkFBQSw0QkFBRTs0QkFBMUcsSUFBTSxLQUFLLFdBQUE7NEJBQ1osS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7NEJBQ3RCLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUU7O2dDQUMzQixJQUFJLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsQ0FBQztnQ0FDN0YsbUJBQW1CLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksbUJBQW1CLENBQUM7Z0NBQzNGLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxtQkFBbUIsQ0FBQzs2QkFDaEg7aUNBQ0k7Z0NBQ0QsbUJBQW1CLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNyRixtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUMxRzs0QkFDRCxtQkFBbUIsQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDO3lCQUNqRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFzQko7cUJBQ0k7b0JBQ0QsbUJBQW1CLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxLQUFLLENBQXVCLHdCQUF3QixDQUFDLENBQUM7b0JBQ3pHLG1CQUFtQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztvQkFDN0MsbUJBQW1CLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO2lCQUM5QztnQkFHRCxPQUFPLG1CQUFtQixDQUFDOzs7Ozs7OztRQUcvQiwyQ0FBYzs7Ozs7O1lBQWQsVUFBZSxnQkFBNkMsRUFBRSxtQkFBdUMsRUFBRSxhQUFxQjs7Z0JBQ3hILElBQUksUUFBUSxDQUF1QjtnQkFDbkMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO29CQUNuQixRQUFRLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxhQUFhLElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDO29CQUNwRyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekIsbUJBQW1CLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4RixtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxRyxtQkFBbUIsQ0FBQyxrQkFBa0IsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDO2lCQUNwRTthQUNKOzs7Ozs7O1FBQ0QsOENBQWlCOzs7Ozs7WUFBakIsVUFBa0IsZ0JBQTZDLEVBQUUsbUJBQXVDLEVBQUUsZ0JBQXdCOztnQkFDOUgsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7O3dCQUN0QixLQUFrQixJQUFBLEtBQUFBLFNBQUEsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxRQUFRLEdBQUEsQ0FBQyxDQUFBLGdCQUFBLDRCQUFFOzRCQUFoRSxJQUFJLEtBQUssV0FBQTs0QkFDVixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs0QkFDdEIsbUJBQW1CLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQzt5QkFDakU7Ozs7Ozs7Ozs7Ozs7OztvQkFDRCxtQkFBbUIsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUMxRixtQkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLElBQUksZ0JBQWdCLENBQUMsQ0FBQztpQkFFL0c7YUFDSjs7Ozs7Ozs7UUFPTSx5Q0FBWTs7Ozs7OztzQkFBQyxnQkFBNkMsRUFBRSxNQUFjLEVBQUUsbUJBQXVDOzs7Z0JBQ3RILElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztnQkFDdkIsSUFBSTtvQkFDQSxRQUFRLE1BQU07Ozs7d0JBSVYsS0FBSyxRQUFROzs0QkFDVCxJQUFJLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7OzRCQUNuRCxJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQzs7Z0NBQzVCLEtBQW9CLElBQUEsS0FBQUEsU0FBQSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEdBQUEsQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO29DQUF2SSxJQUFNLEtBQUssV0FBQTtvQ0FDWixJQUFJLEtBQUssQ0FBQyxlQUFlLEdBQUcsQ0FBQyxFQUFFOzt3Q0FDM0IsSUFBSSxtQkFBbUIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsQ0FBQzt3Q0FDdkUsWUFBWSxJQUFJLG1CQUFtQixDQUFDO3dDQUNwQyxtQkFBbUIsSUFBSSxtQkFBbUIsQ0FBQztxQ0FDOUM7eUNBQ0k7d0NBQ0QsWUFBWSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7d0NBQzVCLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7cUNBQ3RDO2lDQUNKOzs7Ozs7Ozs7Ozs7Ozs7NEJBQ0QsTUFBTSxHQUFHLG1CQUFtQixDQUFDOzRCQUM3QixNQUFNO3dCQUNWLEtBQUssS0FBSzs0QkFDTixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsR0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBOzRCQUN2TyxNQUFNO3FCQUNiO2lCQUNKO2dCQUFDLFdBQU07aUJBQ1A7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7Ozs7Ozs7OztRQUtYLGdEQUFtQjs7Ozs7OztzQkFBQyxTQUFjLEVBQUUsTUFBYyxFQUFFLG1CQUF1QyxFQUFFLFdBQThCO2dCQUM5SCxJQUFJOztvQkFDQSxJQUFJLE1BQU0sQ0FBQzs7b0JBQ1gsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7b0JBQ3ZELElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksU0FBUyxDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUU7d0JBQzlELHFCQUFxQixDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0QscUJBQXFCLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO3dCQUMxRCxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQzt3QkFDMUIsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFOzRCQUNkLHFCQUFxQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO3lCQUM5Qzs2QkFBTTs0QkFDSCxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3lCQUN2Qzt3QkFFRCxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQzt3QkFFMUMsUUFBUSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTs0QkFDckMsS0FBSyxPQUFPO2dDQUNSLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0NBQ3hDLHFCQUFxQixDQUFDLGVBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUE7Z0NBQ3JELHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dDQUNsRSxNQUFNOzRCQUNWLEtBQUssV0FBVztnQ0FDWixxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dDQUN4QyxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztnQ0FDM0MsTUFBTTs0QkFDVixLQUFLLFdBQVc7Z0NBQ1oscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQ0FDeEMscUJBQXFCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQzFELE1BQU07NEJBQ1YsS0FBSyxPQUFPO2dDQUNSLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0NBQ2hDLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO2dDQUNwRCxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQ0FDckQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7O2dDQUVwRixNQUFNOzRCQUNWLEtBQUssVUFBVTtnQ0FDWCxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dDQUN4QyxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dDQUNoQyxxQkFBcUIsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztnQ0FFcEQsTUFBTTs0QkFDVixLQUFLLE9BQU87Z0NBQ1IscUJBQXFCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQ0FDaEMscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQ0FDeEMscUJBQXFCLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0NBQzdDLE1BQU07NEJBQ1YsS0FBSyxjQUFjO2dDQUNmLHFCQUFxQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0NBQ2hDLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0NBQ3hDLHFCQUFxQixDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDL0QsTUFBTTs0QkFDVixLQUFLLGtCQUFrQixDQUFDOzRCQUN4QixLQUFLLGFBQWE7Z0NBQ2QscUJBQXFCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQ0FDaEMscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQ0FDeEMscUJBQXFCLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQy9ELE1BQU07Ozs7NEJBSVY7Z0NBQ0ksSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRTtvQ0FDNUIscUJBQXFCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztvQ0FDaEMscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztvQ0FDeEMscUJBQXFCLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO29DQUNwRSxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7b0NBQ2xHLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO29DQUNuRixxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDO29DQUMvRSxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO29DQUV6RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO2lDQUNuRztxQ0FBTTtvQ0FDSCxxQkFBcUIsR0FBRyxJQUFJLENBQUM7aUNBQ2hDO2dDQUNELE1BQU07eUJBQ2I7d0JBRUQsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFOzRCQUNyQixxQkFBcUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzt5QkFDaEQ7cUJBQ0o7eUJBQU07d0JBQ0gsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7b0JBQ0QsT0FBTyxxQkFBcUIsQ0FBQztpQkFDaEM7Z0JBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEIsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Ozs7Ozs7O1FBR0UscURBQXdCOzs7Ozs7c0JBQUMsV0FBOEIsRUFDMUQsU0FBcUIsRUFBRSxxQkFBMkM7Z0JBQ2xFLElBQUk7O29CQUNBLElBQUksS0FBSyxDQUFhOztvQkFDdEIsSUFBSSxZQUFZLEdBQVcsQ0FBQyxDQUFDLENBQUM7O29CQUM5QixJQUFJLGdCQUFnQixHQUFXLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO29CQUM5RCxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUkscUJBQXFCLENBQUMsV0FBVyxHQUFBLENBQUMsQ0FBQztvQkFDbEYsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7d0JBQzdCLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQTtxQkFDNUUsQ0FBQyxDQUFDO29CQUNILHFCQUFxQixDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUE7aUJBQ3JEO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUJBQ2xCOzs7Ozs7Ozs7UUFTRSxxREFBd0I7Ozs7Ozs7c0JBQUMsV0FBOEIsRUFBRSxtQkFBdUMsRUFBRSxTQUFjO2dCQUNuSCxRQUFRLG1CQUFtQixDQUFDLEtBQUs7b0JBQzdCLEtBQUssY0FBYzs7d0JBRWYsSUFBSSxLQUFLLENBQWE7O3dCQUN0QixJQUFJLGNBQWMsR0FBVyxHQUFHLENBQUM7d0JBQ2pDLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBQSxDQUFDLENBQUM7d0JBQ3pGLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDOzRCQUM3QixjQUFjLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO3lCQUM5RSxDQUFDLENBQUM7d0JBQ0gsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUM7d0JBQ3pELE1BQU07b0JBQ1YsS0FBSyxpQkFBaUI7Ozs7O3dCQUtsQixNQUFNO29CQUNWLEtBQUssT0FBTzs7d0JBQ1IsSUFBSSxLQUFLLENBQWE7d0JBQ3RCLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBQSxDQUFDLENBQUM7d0JBQ3pGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFOzRCQUM1QyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO3lCQUM5Rjt3QkFDRCxJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUU7NEJBQ3ZCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQTt5QkFDakU7d0JBQ0QsTUFBTTtvQkFDVjt3QkFDSSxNQUFNO2lCQUNiOzs7Ozs7UUFTRSw4Q0FBaUI7Ozs7c0JBQUMsV0FBdUI7Z0JBQzVDLElBQUk7b0JBQ0EsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNwQyxPQUFPLFdBQVcsQ0FBQztpQkFDdEI7Z0JBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNoQixPQUFPLFdBQVcsQ0FBQztpQkFDdEI7Ozs7Ozs7UUFTRSw4Q0FBaUI7Ozs7O3NCQUFDLFdBQXVCOzs7Z0JBQzVDLElBQUksVUFBVSxDQUFxQjs7Z0JBQ25DLElBQUksd0JBQXdCLEdBQUdDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTlELElBQUksV0FBVyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtvQkFDNUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNoRDtnQkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDMUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxDQUFDOztvQkFDL0MsSUFBSSxLQUFLLEdBQXVCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ2hFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFFbkQsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQzNELFFBQVEsS0FBSyxDQUFDLEtBQUs7d0JBQ2YsS0FBSyxjQUFjOzs0QkFDZixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDOzs0QkFFMUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUN4RSxNQUFNO3dCQUNWLEtBQUssY0FBYzs7NEJBQ2YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQzs0QkFDMUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUN6RSxNQUFNO3dCQUNWLEtBQUssZ0JBQWdCOzRCQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQzs0QkFDM0QsTUFBTTt3QkFDVixLQUFLLGlCQUFpQjs7NEJBQ2xCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQzFFLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQzs0QkFDaEYsTUFBTTt3QkFDVixLQUFLLHdCQUF3Qjs0QkFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7OzRCQUMvQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUMxRSxJQUFJLENBQUMsNkJBQTZCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQzlFLE1BQU07d0JBQ1YsS0FBSyxPQUFPOzs0QkFDUixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7NEJBQ3BCLE9BQU8sUUFBUSxFQUFFOztnQ0FDYixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dDQUMxRSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQzs2QkFDbkc7NEJBQ0QsTUFBTTt3QkFDVixLQUFLLGdCQUFnQjs7NEJBQ2pCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7NEJBQzFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQzs0QkFDdkUsTUFBTTt3QkFDVixLQUFLLGNBQWM7NEJBQ2YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOzRCQUMzRSxNQUFNO3dCQUNWOzs0QkFFSSxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7Z0NBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0NBQzFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQzs2QkFDbEY7NEJBQ0QsTUFBTTtxQkFDYjtpQkFDSjt3Q0FFVSxpQkFBaUI7O29CQUN4QixJQUFJLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOztvQkFDL0YsSUFBSSxjQUFjLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLGlCQUFpQixDQUFDLEVBQUUsR0FBQSxDQUFDLENBQUM7b0JBQy9FLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQzs7OztvQkFINUYsS0FBZ0MsSUFBQSw2QkFBQUQsU0FBQSx3QkFBd0IsQ0FBQSxrRUFBQTt3QkFBbkQsSUFBTSxpQkFBaUIscUNBQUE7Z0NBQWpCLGlCQUFpQjtxQkFJM0I7Ozs7Ozs7Ozs7Ozs7OztnQkFFRCxPQUFPLFdBQVcsQ0FBQzs7Ozs7OztRQUdoQiw0Q0FBZTs7Ozs7c0JBQUMsU0FBd0IsRUFBRSxZQUFZO2dCQUN6RCxJQUFJLFlBQVk7b0JBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsQ0FBQyxDQUFDOztvQkFDakssU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLE9BQU8sR0FBQSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLE9BQU8sR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFJOUksbURBQXNCOzs7Ozs7O3NCQUFDLFFBQW9CLEVBQUUsVUFBOEIsRUFBRSxLQUF5QixFQUFFLGFBQXNCOztnQkFDakksSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7Z0JBQzFCLElBQUksaUJBQWlCLEdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztnQkFDOUMsSUFBSSxpQkFBaUIsR0FBVyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOztnQkFDakMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDOztnQkFDakIsSUFBSSxjQUFjLENBQUM7Z0JBRW5CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0QyxjQUFjLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLGlCQUFpQixJQUFJLGlCQUFpQixDQUFBO29CQUNoRixRQUFRLElBQUksY0FBYyxDQUFDO29CQUMzQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDNUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O2lCQWVsRTtnQkFFRCxJQUFJLGlCQUFpQixHQUFHLFFBQVEsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLEVBQUU7O29CQUU5RCxPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxHQUFHLGlCQUFpQixHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQztvQkFDcEcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsQ0FBQztpQkFDdEg7Z0JBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsR0FBQSxDQUFDLEVBQUU7b0JBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtvQkFDeEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFDdEY7Ozs7Ozs7O1FBSUUsa0RBQXFCOzs7Ozs7c0JBQUMsb0JBQW1DLEVBQUUsS0FBeUIsRUFBRSxXQUF1Qjs7O2dCQUNoSCxJQUFJLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztnQkFDckMsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7O2dCQUMzQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQzs7Z0JBQzFCLElBQUksc0JBQXNCLEdBQUcsQ0FBQyxDQUFDOztnQkFDL0IsSUFBSSxzQkFBc0IsR0FBdUIsRUFBRSxDQUFDOztnQkFDcEQsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7O2dCQUM1QixJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFDdkQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDOztnQkFDbkIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO3dDQUVWLE9BQU87b0JBQ1osc0JBQXNCLEdBQUcsQ0FBQyxDQUFDOztvQkFDM0IsSUFBSSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O29CQUM5RSxJQUFJLGNBQWMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDcEYsT0FBTyxzQkFBc0IsSUFBSSxjQUFjLEVBQUU7d0JBQzdDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQzt3QkFDbEMsc0JBQXNCLEVBQUUsQ0FBQzs7d0JBRXpCLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQzt3QkFDeEUsSUFBSSxnQkFBZ0IsRUFBRTs0QkFDbEIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7eUJBQy9COzZCQUNJOzRCQUNELGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3lCQUM1RDt3QkFDRCxJQUFJLGtCQUFrQixHQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUU7NEJBQy9DLFVBQVUsSUFBSSxrQkFBa0IsQ0FBQzs0QkFDakMsT0FBSyxzQ0FBc0MsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs0QkFDckcsaUJBQWlCLEVBQUUsQ0FBQzs0QkFDcEIsa0JBQWtCLEdBQUcsRUFBRSxDQUFDOzRCQUN4QixVQUFVLEdBQUcsa0JBQWtCLEdBQUcsVUFBVSxDQUFDOzRCQUM3QyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7eUJBQzFCO3FCQUNKOzs7O29CQXZCTCxLQUFvQixJQUFBLHlCQUFBQSxTQUFBLG9CQUFvQixDQUFBLDBEQUFBO3dCQUFuQyxJQUFJLE9BQU8saUNBQUE7Z0NBQVAsT0FBTztxQkF3QmY7Ozs7Ozs7Ozs7Ozs7OztnQkFDRCxJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O29CQUNuQyxJQUFJLGFBQWEsR0FBRyxhQUFhLENBQUMsaUNBQWlDLENBQUMsV0FBVyxFQUFFLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDN0ksYUFBYSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztvQkFDbkYsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQztpQkFDaEQ7Ozs7Ozs7O1FBR0wsbUVBQXNDOzs7Ozs7WUFBdEMsVUFBdUMsc0JBQTBDLEVBQUUsVUFBc0IsRUFBRSxrQkFBa0I7OztnQkFDekgsSUFBSSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7Z0JBQ3ZELElBQUksUUFBUSxDQUFjO3dDQUVqQixZQUFZO29CQUNqQixJQUFJLFlBQVksRUFBRTs7d0JBQ2QsSUFBSSxZQUFZLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFDO3dCQUN2RSxJQUFJLFlBQVksRUFBRTs0QkFFZCxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQzs0QkFDaEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0NBQzdCLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0NBRXRGLFFBQVEsR0FBR0MsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFBO2dDQUNwQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQ0FDeEUsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dDQUN0QyxPQUFLLDRCQUE0QixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzZCQUNsRjt5QkFDSjtxQkFDSjs7bUNBWFcsZ0JBQWdCOztvQkFKaEMsS0FBeUIsSUFBQSx1QkFBQUQsU0FBQSxrQkFBa0IsQ0FBQSxzREFBQTt3QkFBdEMsSUFBSSxZQUFZLCtCQUFBO2dDQUFaLFlBQVk7cUJBZ0JwQjs7Ozs7Ozs7Ozs7Ozs7O2FBQ0o7Ozs7OztRQUVELHlEQUE0Qjs7Ozs7WUFBNUIsVUFBNkIsb0JBQXdDLEVBQUUsd0JBQXdCOztnQkFDM0YsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSx3QkFBd0IsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFBO2dCQUN0RixJQUFJLFlBQVksRUFBRTs7b0JBQ2QsSUFBSSxnQkFBZ0IsQ0FBaUI7b0JBQ3JDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDO29CQUNoRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTt3QkFDN0IsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUNsRSxPQUFPQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQ3BDO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7Ozs7Ozs7UUFPTSw0Q0FBZTs7Ozs7O3NCQUFDLFFBQW9CLEVBQUUsVUFBOEI7O2dCQUN2RSxJQUFJLGNBQWMsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO2dCQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDeEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQzt3QkFDcEQsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDMUIsQ0FBQyxDQUFDO2lCQUVOO2dCQUNELE9BQU8sY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7UUFXbkIsb0RBQXVCOzs7Ozs7Ozs7O3NCQUFDLFFBQW9CLEVBQUUsVUFBOEIsRUFBRSxLQUF5QixFQUFFLGFBQXNCLEVBQUUsV0FBdUI7OztnQkFFM0osSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixJQUFJOztvQkFDQSxJQUFJLGtCQUFrQixHQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7O29CQUM5RCxJQUFJLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDOztvQkFDckMsSUFBSSxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQzs7b0JBQzlDLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQzs7b0JBQzVCLElBQUksaUJBQWUsR0FBRyxDQUFDLENBQUM7O29CQUN4QixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7b0JBQzNCLElBQUksd0JBQXNCLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQzs7b0JBQ3RELElBQUksYUFBYSxVQUFlO29CQUdoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O3dCQUUxQyxJQUFJLGNBQWMsR0FBdUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQ3JJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztxQkFDeEU7b0JBRUQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7d0JBRTVCLFdBQVcsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO3dCQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7NEJBQzdDLElBQUksWUFBWSxHQUFlLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBQ2xELElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7NEJBQ2pDLElBQUksTUFBTSxHQUFHLFdBQVcsRUFBRTtnQ0FDdEIsV0FBVyxHQUFHLE1BQU0sQ0FBQzs2QkFDeEI7eUJBQ0o7O3dCQUVELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTs0QkFDakIsV0FBVyxHQUFHLENBQUMsQ0FBQzt5QkFDbkI7O3dCQUdELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzs0QkFDN0MsSUFBSSxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFOztnQ0FDbEMsSUFBSSxHQUFHLEdBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUN4QixrQkFBa0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFBLENBQUMsQ0FBQyxTQUFTLENBQUM7NkJBQ2pHO3lCQUNKOzs7d0JBR0QsaUJBQWUsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFDLENBQUM7d0JBRWpFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzs0QkFDN0MsSUFBSSxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFOztnQ0FDbEMsSUFBSSxHQUFHLEdBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUN4QixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNO29DQUMvQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTt3Q0FDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7OzRDQUN2QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDOzs0Q0FHN0IsTUFBTSxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLGlCQUFlLEdBQUcsR0FBRyxDQUFDLENBQUM7NENBQzNELE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO3lDQUMvQjt3Q0FDRCxLQUFJLENBQUMsOEJBQThCLENBQUMsd0JBQXNCLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3FDQUNwRjt5Q0FDSTs7d0NBRUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7cUNBQ3hCO2lDQUNKLENBQUMsQ0FBQzs7Z0NBRUgsZUFBZSxHQUFHLElBQUksQ0FBQzs2QkFDMUI7eUJBQ0o7d0JBRUQsSUFBSSxlQUFlLEVBQUU7NEJBQ2pCLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOzs7NEJBR25ELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsd0JBQXNCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQzs7Ozs7NEJBSy9GLGFBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxXQUFXLEVBQUUsd0JBQXNCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7eUJBQ3BJO3FCQUVKO29CQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFFM0M7Z0JBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO29CQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2lCQUNsQjtnQkFDRCxPQUFPLGVBQWUsQ0FBQzs7Ozs7OztRQUkzQix5REFBNEI7Ozs7O1lBQTVCLFVBQTZCLGVBQTJCLEVBQUUsZ0JBQW9DOztnQkFDMUYsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O29CQUNoRCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7NENBQ2IsU0FBUzs7d0JBQ2hCLElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsR0FBQSxDQUFDLENBQUM7d0JBQy9ELElBQUksT0FBTyxFQUFFOzs0QkFDVCxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7NEJBQ2hGLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDcEUsSUFBSSxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dDQUNuQyxjQUFjLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FDN0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7OzZCQUV6Qjt5QkFDSjs7O3dCQVZMLEtBQXdCLElBQUEsS0FBQUQsU0FBQSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUEsZ0JBQUE7NEJBQXRDLElBQU0sU0FBUyxXQUFBO2tEQUFULFNBQVM7Ozt5QkFXbkI7Ozs7Ozs7Ozs7Ozs7OztvQkFDRCxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDO2lCQUN4QzthQUNKOzs7OztRQUVELG1EQUFzQjs7OztZQUF0QixVQUF1QixnQkFBb0M7Z0JBQ3ZELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87b0JBQzVCLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM5QixDQUFDLENBQUM7YUFDTjs7Ozs7OztRQUVELHlEQUE0Qjs7Ozs7O1lBQTVCLFVBQTZCLFVBQXNCLEVBQUUsWUFBeUIsRUFBRSxRQUFZO2dCQUFaLHlCQUFBO29CQUFBLFlBQVk7OztnQkFDeEYsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtvQkFDL0IsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUNyQztnQkFFRCxjQUFjLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxZQUFZLENBQUMsVUFBVSxHQUFBLENBQUMsQ0FBQztnQkFDekYsSUFBSSxjQUFjLEVBQUU7b0JBQ2hCLGNBQWMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7aUJBQzlDO3FCQUNJO29CQUNELFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7aUJBQ2hHO2FBQ0o7Ozs7Ozs7O1FBR0QsMkRBQThCOzs7Ozs7WUFBOUIsVUFBK0Isc0JBQTBDLEVBQUUsVUFBc0IsRUFBRSx3QkFBd0I7O2dCQUN2SCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLFlBQVksRUFBRTs7b0JBQ2QsSUFBSSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7b0JBRXZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3hELHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztpQkFDL0Q7YUFFSjs7Ozs7OztRQUdELGlEQUFvQjs7Ozs7WUFBcEIsVUFBcUIsb0JBQXdDLEVBQUUsd0JBQXdCOztnQkFFbkYsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSx3QkFBd0IsQ0FBQyxFQUFFLEdBQUEsQ0FBQyxDQUFBO2dCQUN0RixJQUFJLFlBQVksRUFBRTs7b0JBQ2QsSUFBSSxnQkFBZ0IsQ0FBaUI7b0JBQ3JDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDO29CQUNoRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTt3QkFDN0IsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUNsRSxPQUFPQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7cUJBQ3BDO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7Ozs7Ozs7UUFPTSwyQ0FBYzs7Ozs7O3NCQUFDLFVBQXNCLEVBQUUsRUFBVTs7Z0JBQ3BELElBQUksTUFBTSxHQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBQSxDQUFDLENBQUM7Z0JBQ25ELElBQUksTUFBTSxFQUFFO29CQUNSLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUN2QztxQkFBTTtvQkFDSCxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0I7Z0JBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7UUFZbEIsa0RBQXFCOzs7Ozs7O3NCQUFDLFVBQThCLEVBQUUsV0FBbUIsRUFBRSxhQUFxQjs7Z0JBQ25HLElBQUksVUFBVSxHQUFHLElBQUksS0FBSyxFQUFlLENBQUM7Z0JBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN4QyxJQUFJOzt3QkFDQSxJQUFJLFlBQVksR0FBZ0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQTt3QkFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLElBQUksRUFBRSxZQUFZLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFOzs0QkFDNUQsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUM7OzRCQUN6RSxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxHQUFHLElBQUksV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7O2dDQUM5QyxJQUFJLE1BQU0sR0FBZSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Z0NBQy9DLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsb0JBQW9CLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQTtnQ0FDM0UsSUFBSSxXQUFXLEVBQUU7O29DQUNiLElBQUksZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO29DQUNyRCxJQUFJLGVBQWUsRUFBRTt3Q0FDakIsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFOzRDQUN4QixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLElBQUksV0FBVyxHQUFBLENBQUMsRUFBRTtnREFDN0MsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs2Q0FDakM7eUNBQ0o7NkNBQ0k7NENBQ0QsSUFBSSxlQUFlLElBQUksV0FBVyxFQUFFO2dEQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDOzZDQUNqQzt5Q0FDSjtxQ0FDSjtpQ0FDSjs2QkFDSjt5QkFDSjtxQkFDSjtvQkFBQyxXQUFNLEdBQUc7aUJBQ2Q7Z0JBQ0QsT0FBTyxVQUFVLENBQUM7Ozs7Ozs7UUFRZixpREFBb0I7Ozs7O3NCQUFDLFNBQTZCO2dCQUNyRCxJQUFJO29CQUNBLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFO3dCQUMzRCxPQUFPLElBQUksQ0FBQztxQkFDZjtpQkFDSjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUE7b0JBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUJBQ2xCO2dCQUdELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7UUFHVixvREFBdUI7Ozs7Ozs7c0JBQUMsVUFBOEIsRUFBRSxLQUF5QixFQUFFLFdBQXVCLEVBQUUsWUFBcUI7O2dCQUNwSSxJQUFJLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDOztnQkFDaEMsSUFBSSxpQkFBaUIsR0FBdUIsRUFBRSxDQUFDOztnQkFDL0MsSUFBSSxnQkFBZ0IsR0FBZSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Z0JBQzNELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Z0JBQ2hELElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO2dCQUUxQixJQUFJOztvQkFFQSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUc7d0JBQzFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO3FCQUMvRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDOztvQkFHekIsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxZQUFZO3dCQUNsQyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLFVBQVUsR0FBQSxDQUFDLEVBQUU7NEJBQzlELGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzt5QkFDeEM7cUJBQ0osQ0FBQyxDQUFDOztvQkFHSCxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxDQUFDOztvQkFHN0UsT0FBTyxpQkFBaUIsR0FBRyxnQkFBZ0IsSUFBSSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFO3dCQUNoRixRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUM7d0JBQ2xILGlCQUFpQixFQUFFLENBQUM7cUJBQ3ZCOztvQkFHRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQzVGO2dCQUNELE9BQU8sS0FBSyxFQUFFO2lCQUViOzs7Ozs7Ozs7Ozs7Ozs7UUFjRSxvREFBdUI7Ozs7Ozs7Ozs7Ozs7c0JBQUMsVUFBc0IsRUFBRSxLQUF5QixFQUFFLFdBQXVCLEVBQUUsWUFBcUI7O2dCQUM1SCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUM7O2dCQUNuQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDOztnQkFDNUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOztnQkFDckIsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7O2dCQUMzQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQzs7Z0JBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQzs7Z0JBQ25CLElBQUksa0JBQWtCLEdBQUcsRUFBRSxDQUFDOztnQkFDNUIsSUFBSSxzQkFBc0IsR0FBdUIsRUFBRSxDQUFDOztnQkFDcEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEQsWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLFlBQVksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3RELFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUE7d0NBSXZCLFFBQVE7b0JBQ2Ysa0JBQWtCLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQztvQkFDekMsWUFBWSxFQUFFLENBQUM7O29CQUNmLElBQUksZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQztvQkFDekUsSUFBSSxnQkFBZ0IsRUFBRTt3QkFDbEIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7cUJBQy9CO3lCQUNJO3dCQUNELGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3FCQUM3RDtvQkFFRCxJQUFJLFlBQVksS0FBSyxVQUFVLEVBQUU7d0JBQzdCLFVBQVUsSUFBSSxrQkFBa0IsQ0FBQzt3QkFDakMsT0FBSyxzQ0FBc0MsQ0FBQyxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzt3QkFDckcsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDcEIsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO3dCQUN4QixZQUFZLEdBQUcsQ0FBQyxDQUFDO3FCQUNwQjs7Ozs7b0JBakJMLEtBQXVCLElBQUEsZUFBQUQsU0FBQSxVQUFVLENBQUEsc0NBQUE7d0JBQTVCLElBQU0sUUFBUSx1QkFBQTtnQ0FBUixRQUFRO3FCQWtCbEI7Ozs7Ozs7Ozs7Ozs7OztnQkFFRCxJQUFJLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O29CQUNuQyxJQUFJLGFBQWEsR0FBRyxZQUFZLENBQUMsaUNBQWlDLENBQUMsV0FBVyxFQUFFLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDNUksWUFBWSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztvQkFDbEYsV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLFlBQVksQ0FBQztpQkFDL0M7Ozs7Ozs7Ozs7UUFTRSxvREFBdUI7Ozs7Ozs7O3NCQUFDLFFBQW9CLEVBQUUsVUFBOEIsRUFBRSxLQUF5QixFQUFFLGFBQXNCOztnQkFDbEksSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7Z0JBRTFCLElBQUksY0FBYyxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUM7O2dCQUU3QyxJQUFJLGFBQWEsQ0FBUzs7Z0JBQzFCLElBQUksVUFBVSxHQUFXLE1BQU0sQ0FBQyxLQUFLLENBQUM7O2dCQUN0QyxJQUFJLGNBQWMsR0FBVyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7Z0JBQzlELGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUVoQyxJQUFJLGFBQWEsSUFBSSxjQUFjLEVBQUU7O29CQUNqQyxJQUFJLGFBQWEsR0FBRyxjQUFjLElBQUksQ0FBQyxFQUFFLENBRXhDO3lCQUFNOzt3QkFDSCxJQUFJLE9BQU8sR0FBVyxhQUFhLEdBQUcsY0FBYyxDQUFDO3dCQUNyRCxhQUFhLEdBQUcsYUFBYSxHQUFHLE9BQU8sQ0FBQzs7cUJBRTNDO29CQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3BDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxjQUFjLEVBQUU7NEJBQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDOzRCQUN2QyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt5QkFDL0I7cUJBQ0o7b0JBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsR0FBQSxDQUFDLEVBQUU7d0JBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTt3QkFDeEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDdEY7aUJBQ0o7Ozs7Ozs7UUFPRSx1REFBMEI7Ozs7O3NCQUFDLFdBQXVCO2dCQUNyRCxJQUFJOztvQkFDQSxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O29CQUNwRixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUV4QyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO2lCQUM3QztnQkFBQyxXQUFNO2lCQUVQOzs7Ozs7O1FBT0UseURBQTRCOzs7OztzQkFBQyxXQUF1Qjs7Z0JBQ3ZELElBQUksbUJBQW1CLENBQWU7Z0JBQ3RDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLG1CQUFtQixFQUFFOztvQkFDckIsSUFBSSxRQUFRLEdBQThCLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzt3QkFDdEMsSUFBSSxXQUFXLEdBQXVCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsb0JBQW9CLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixHQUFBLENBQUMsQ0FBQzt3QkFDekksSUFBSSxDQUFDLFdBQVcsRUFBRTs0QkFDZCxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNsRDtxQkFDSjtvQkFDRCxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztpQkFDNUU7cUJBQU07O29CQUNILElBQUksYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ3ZDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO29CQUNuQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBRW5FLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNqRDs7Ozs7Ozs7OztRQVVFLDJEQUE4Qjs7Ozs7Ozs7c0JBQUMsUUFBb0IsRUFBRSxVQUE4QixFQUFFLEtBQXlCLEVBQUUsYUFBc0I7O2dCQUN6SSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztnQkFDNUIsSUFBSSxFQUFFLEdBQVcsQ0FBQyxDQUFDOztnQkFDbkIsSUFBSSxFQUFFLEdBQVcsQ0FBQyxDQUFDOztnQkFDbkIsSUFBSSxDQUFDLEdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBOztnQkFDeEMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUNoRCxJQUFJLFFBQVEsR0FBVyxDQUFDLENBQUM7O2dCQUN6QixJQUFJLE1BQU0sR0FBWSxLQUFLLENBQUM7Z0JBRTVCLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNwQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuQzs7Z0JBS0QsSUFBSSxDQUFDLEdBQVcsQ0FBQyxDQUFDO2dCQUNsQixRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUEsQ0FBQyxDQUFBO2dCQUN0RyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztvQkFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDN0IsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUVsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUNQLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBRVAsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFOzRCQUVYLEVBQUUsRUFBRSxDQUFDOzRCQUNMLENBQUMsRUFBRSxDQUFDO3lCQUNQO3dCQUNELE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUVyQixJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7Z0NBQ2YsTUFBTSxHQUFHLElBQUksQ0FBQztnQ0FDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQzs2QkFDN0I7aUNBQU07Z0NBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQzs7Z0NBR2QsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUM7NkJBQ3JFOzRCQUNELEVBQUUsRUFBRSxDQUFDOzRCQUNMLENBQUMsRUFBRSxDQUFDO3lCQUNQO3FCQUVKOzs7O29CQUlELElBQUksTUFBTSxFQUFFO3dCQUNSLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7cUJBQ3ZGOzs7Ozs7OztpQkFXSjs7Ozs7Ozs7Ozs7UUFRRSx3REFBMkI7Ozs7Ozs7OztzQkFBQyxRQUFvQixFQUFFLFVBQThCLEVBQUUsS0FBeUIsRUFBRSxVQUFtQixFQUFFLGFBQXNCOztnQkFHM0osSUFBSSxjQUFjLEdBQVcsQ0FBQyxDQUFDOztnQkFFL0IsSUFBSSxTQUFTLEdBQVcsQ0FBQyxDQUFDO2dCQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7b0JBQ3hDLElBQUksR0FBRyxHQUFnQixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUNyQyxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFBLENBQUM7d0JBQ25ELE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxHQUFHLElBQUssT0FBQSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUM7O29CQUN2RCxJQUFJLG1CQUFtQixDQUFDO29CQUN4QixtQkFBbUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O29CQUd2RixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDOzs7b0JBR2hGLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsYUFBYSxFQUFFO3dCQUN4RixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxFQUFFOzRCQUM1RCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO3lCQUN4RTt3QkFDRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxFQUFFOzRCQUMzRCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksWUFBWSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO3lCQUN2RTt3QkFDRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsR0FBQSxDQUFDLEVBQUU7NEJBQy9ELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTt5QkFDM0U7d0JBQ0QsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksZUFBZSxHQUFBLENBQUMsRUFBRTs0QkFDOUQsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGVBQWUsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTt5QkFDMUU7d0JBQ0QsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksY0FBYyxHQUFBLENBQUMsRUFBRTs0QkFDN0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGNBQWMsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTt5QkFDekU7d0JBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUM7Ozt3QkFHcEMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksbUJBQW1CLEdBQUEsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7cUJBQ2hLO3lCQUFNO3dCQUNILGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUMzRCxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDOzt3QkFFekcsSUFBSSxDQUFDLGFBQWEsRUFBRTs0QkFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDL0Y7NkJBQU07OzRCQUVILGNBQWMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxtQkFBbUIsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLG1CQUFtQixDQUFDLENBQUE7eUJBQ25IO3FCQUVKO29CQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDO29CQUMxRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7aUJBRXpEOzs7Ozs7UUFJRSxvREFBdUI7Ozs7c0JBQUMsR0FBZ0I7Z0JBQzNDLElBQUk7b0JBQ0EsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRzt3QkFDdkYsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7cUJBQ25CLENBQUMsQ0FBQztpQkFDTjtnQkFBQyxXQUFNO2lCQUVQOzs7Ozs7UUFHRSxzREFBeUI7Ozs7c0JBQUMsR0FBZ0I7Z0JBQzdDLElBQUk7b0JBQ0EsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO3dCQUMxRixHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztxQkFDbkIsQ0FBQyxDQUFDO2lCQUNOO2dCQUFDLFdBQU07aUJBRVA7Ozs7Ozs7O1FBUUUsMERBQTZCOzs7Ozs7c0JBQUMsR0FBZ0IsRUFBRSxRQUFnQjtnQkFDbkUsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7Ozs7Ozs7O1FBU3RKLDREQUErQjs7Ozs7O3NCQUFDLFFBQW9CLEVBQUUsR0FBZ0I7O2dCQUV6RSxJQUFJLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBQSxDQUFDLENBQUM7Z0JBQy9JLElBQUksY0FBYyxFQUFFO29CQUNoQixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU07b0JBQ0gsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Ozs7Ozs7O1FBUUUsa0RBQXFCOzs7Ozs7c0JBQUMsUUFBb0IsRUFBRSxHQUFnQjtnQkFDL0QsSUFBSTs7b0JBQ0EsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOztvQkFDeEUsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLE1BQU0sR0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDOztvQkFDdkYsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUM3RSxPQUFPLENBQUMsV0FBVyxHQUFHLENBQUMsVUFBVSxDQUFDO2lCQUNyQztnQkFBQyxXQUFNO29CQUNKLE9BQU8sQ0FBQyxDQUFDO2lCQUNaOzs7Ozs7Ozs7OztRQVNFLDZDQUFnQjs7Ozs7Ozs7O3NCQUFDLEdBQWdCLEVBQUUsYUFBcUIsRUFBRSxlQUF1QixFQUFFLGNBQXNCLEVBQUUsYUFBc0I7Z0JBQ3BJLElBQUk7O29CQUNBLElBQUksZ0JBQWdCLENBQVM7O29CQUM3QixJQUFJLGFBQWEsQ0FBUzs7b0JBRTFCLElBQUksYUFBYSxFQUFFO3dCQUNmLGdCQUFnQixHQUFHLGNBQWMsQ0FBQzt3QkFDbEMsYUFBYSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxlQUFlLENBQUM7cUJBQ3hEO3lCQUFNO3dCQUNILGdCQUFnQixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLG1CQUFtQixHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQzNGLGFBQWEsR0FBRyxDQUFDLGdCQUFnQixHQUFHLENBQUMsYUFBYSxHQUFHLENBQUMsZUFBZSxDQUFDO3FCQUN6RTtvQkFHRCxPQUFPLGFBQWEsQ0FBQztpQkFDeEI7Z0JBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO29CQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQjs7Ozs7Ozs7UUFhRSxnREFBbUI7Ozs7OztzQkFBQyxHQUFnQixFQUFFLFVBQWtCO2dCQUMzRCxJQUFJOzs7b0JBR0EsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztvQkFFbEgsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztpQkFDekw7Z0JBQUMsV0FBTTtpQkFDUDs7Ozs7Ozs7O1FBMEVFLDhDQUFpQjs7Ozs7OztzQkFBQyxHQUFnQixFQUFFLEtBQXlCLEVBQUUsZ0JBQXdCOztnQkFLMUYsSUFBSSxxQkFBcUIsQ0FBaUI7O2dCQUMxQyxJQUFJLG9CQUFvQixDQUFpQjs7Z0JBQ3pDLElBQUksbUJBQW1CLENBQWlCO2dCQUd4QyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksZ0JBQWdCLEdBQUEsQ0FBQyxDQUFDO2dCQUNsRixvQkFBb0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksZUFBZSxHQUFBLENBQUMsQ0FBQztnQkFDaEYsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLGNBQWMsR0FBQSxDQUFDLENBQUM7Z0JBRTlFLElBQUkscUJBQXFCLEVBQUUsQ0FFMUI7cUJBQU07b0JBQ0gscUJBQXFCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDOUMsb0JBQW9CLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDN0MsbUJBQW1CLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDNUMscUJBQXFCLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFBO29CQUN2RCxvQkFBb0IsQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFBO29CQUNyRCxtQkFBbUIsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO29CQUVuRCxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO29CQUNoQyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO29CQUMvQixtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFBO29CQUU5QixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO29CQUNyQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO29CQUNwQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2lCQUV0QztnQkFHRCxxQkFBcUIsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUMvRSxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7Z0JBQ3pGLG9CQUFvQixDQUFDLEtBQUssR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsR0FBRyxDQUFDOztnQkFHNUYsSUFBSSxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztnQkFDMUUsSUFBSSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztnQkFDcEUsSUFBSSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV4RSxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNsRixJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNoRixJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDLENBQUM7aUJBQ3BGOzs7Ozs7OztRQUdMLHNEQUF5Qjs7Ozs7O1lBQXpCLFVBQTBCLGNBQXNDLEVBQUUsY0FBc0IsRUFBRSxhQUFxQjs7Z0JBQzNHLElBQUksZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksY0FBYyxHQUFBLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxnQkFBZ0IsRUFBRTtvQkFDbEIsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztpQkFDMUM7cUJBQ0k7b0JBQ0QsZ0JBQWdCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDekMsZ0JBQWdCLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztvQkFDakQsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztvQkFDdkMsY0FBYyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUN6QzthQUNKOzs7Ozs7O1FBT08saURBQW9COzs7Ozs7c0JBQUMsbUJBQXVDLEVBQUUsV0FBdUI7O2dCQUN6RixJQUFJOztvQkFDQSxJQUFJLFVBQVUsQ0FBcUI7b0JBQ25DLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUc7d0JBQ3JDLElBQUksR0FBRyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7NEJBQ25DLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDbEM7d0JBQ0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ3ZCLElBQUksR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7OztnQ0FHdkYsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsb0JBQW9CLElBQUksbUJBQW1CLENBQUMsb0JBQW9CLEdBQUEsQ0FBQyxDQUFDOzZCQUM5STtpQ0FBTTtnQ0FDSCxPQUFPLEtBQUssQ0FBQzs2QkFDaEI7eUJBQ0o7NkJBQ0k7NEJBQ0QsT0FBTyxLQUFLLENBQUM7eUJBQ2hCO3FCQUNKLENBQUMsQ0FBQztvQkFDSCxPQUFPLFVBQVUsQ0FBQztpQkFDckI7Z0JBQUMsV0FBTTtvQkFDSixPQUFPLElBQUksQ0FBQztpQkFDZjs7Ozs7O1FBR0UsaURBQW9COzs7O3NCQUFDLFlBQXlCO2dCQUNqRCxJQUFJOztvQkFDQSxJQUFJLGdCQUFnQixDQUFrQjtvQkFDdEMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUE7b0JBQ2pGLElBQUksZ0JBQWdCLEVBQUU7d0JBQ2xCLFlBQVksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDckU7aUJBQ0o7Z0JBQUMsV0FBTTtpQkFFUDs7Ozs7Ozs7UUFPRyx3REFBMkI7Ozs7OztzQkFBQyxVQUE4QixFQUFFLGFBQXNCOztnQkFFdEYsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztnQkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUN4QyxJQUFJLEdBQUcsR0FBZ0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOztvQkFDckMsSUFBSSxTQUFTLENBQVM7O29CQUN0QixJQUFJLFdBQVcsQ0FBUztvQkFDeEIsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOztvQkFHM0UsSUFBSSxhQUFhLEVBQUU7d0JBQ2YsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFBO3FCQUNoRjt5QkFBTTt3QkFDSCxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUE7cUJBQzVFO29CQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3FCQUMxRTtpQkFDSjtnQkFDRCxPQUFPLFFBQVEsQ0FBQzs7Ozs7Ozs7O1FBc0NiLG1EQUFzQjs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLGFBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQXNFMUUsbURBQXNCOzs7OztzQkFBQyxXQUF1Qjs7Z0JBQ2pELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQzlELGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxjQUFjLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUEsQ0FBQzt3QkFDMUgsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxjQUFjLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUE7aUJBQzVMOztnQkFFRCxPQUFPLGtCQUFrQixDQUFDOzs7Ozs7OztRQVF2Qiw4REFBaUM7Ozs7OztzQkFBQyxPQUFtQixFQUFFLGNBQWlDOztnQkFFM0YsSUFBSSxrQkFBa0IsR0FBVyxPQUFPLENBQUMsU0FBUyxDQUFDOztnQkFFbkQsSUFBSSx1QkFBdUIsR0FBVyxDQUFDLENBQUM7O2dCQUV4QyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUVsRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBQ25CLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTs7d0JBQ2xELElBQUksVUFBVSxHQUFhLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7O3dCQUVqRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzt3QkFFMUYsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzs0QkFDaEMsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDOzRCQUN4RCx1QkFBdUIsSUFBSSxJQUFJLENBQUMsb0NBQW9DLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7eUJBQzNKO3FCQUNKO2lCQUNKOzs7O2dCQU1ELHVCQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxPQUFPLHVCQUF1QixDQUFDOzs7Ozs7OztRQVE1Qiw0REFBK0I7Ozs7OztzQkFBQywyQkFBZ0QsRUFBRSxhQUFpQzs7Z0JBQ3RILElBQUksb0JBQW9CLEdBQUcsSUFBSSxLQUFLLEVBQWdCLENBQUM7Z0JBQ3JELElBQUksMkJBQTJCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDeEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O3dCQUM5QyxJQUFJLFNBQVMsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTs7NEJBQ2xGLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUM7NEJBQ3pFLElBQUksYUFBYSxFQUFFOztnQ0FDZixJQUFJLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3REFDcEMsRUFBRTs7b0NBQ1AsSUFBSSxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7O29DQUN6QixJQUFJLFVBQVUsR0FBRywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUssR0FBQSxDQUFDLENBQUM7b0NBQy9FLElBQUksVUFBVSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLEdBQUEsQ0FBQyxFQUFFO3dDQUN2RSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7cUNBQ3hDOztnQ0FMTCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7NENBQWpDLEVBQUU7aUNBTVY7NkJBQ0o7eUJBQ0o7cUJBQ0o7aUJBQ0o7Z0JBQ0QsT0FBTyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7UUFRekIsd0VBQTJDOzs7Ozs7c0JBQUMsWUFBK0IsRUFBRSxhQUFpQzs7Z0JBQ2pILElBQUksMkJBQTJCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFFbkgsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsMkJBQTJCLEVBQUUsYUFBYSxDQUFDLENBQUM7Ozs7Ozs7Ozs7O1FBT3JGLDREQUErQjs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsUUFBZ0IsRUFBRSxJQUFTLEVBQzVGLFNBQW1CLEVBQUUsWUFBc0I7O2dCQUczQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFDQUFxQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFDOUYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzs7b0JBQ3ZDLElBQUksU0FBUyxDQUFhO29CQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFO3dCQUN2QixTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQzt3QkFDN0IsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNqQzt5QkFBTTt3QkFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7cUJBQzdCO29CQUVELFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDeEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ25DLENBQUMsQ0FBQzs7Ozs7Ozs7UUFRSix5REFBNEI7Ozs7OztzQkFBQyxVQUFvQixFQUFFLGdCQUFxQzs7Z0JBRTNGLElBQUksZUFBZSxHQUFHLElBQUksS0FBSyxFQUFnQixDQUFDO2dCQUNoRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztvQkFDakQsSUFBSSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7O29CQUN2QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFFeEQsUUFBUSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTt3QkFDL0IsS0FBSyxTQUFTOzs0QkFFVixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksTUFBTSxFQUFFO2dDQUM1SCxXQUFXLENBQUMsS0FBSyxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQzs2QkFDbEU7aUNBQ0k7Z0NBQ0QsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7NkJBQ3ZEOzs0QkFDRCxJQUFJLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUM1QyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO2dDQUMzQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDOzZCQUNyQzs0QkFDRCxNQUFNO3FCQUNiO2lCQUNKO2dCQUNELE9BQU8sZUFBZSxDQUFDOzs7Ozs7Ozs7UUFPcEIsOERBQWlDOzs7Ozs7O3NCQUFDLGNBQWlDLEVBQUUsU0FBaUIsRUFBRSxLQUFhOztnQkFDeEcsSUFBSSxnQkFBZ0IsR0FBd0IsSUFBSSxLQUFLLEVBQWdCLENBQUM7O2dCQUN0RSxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUVyQixJQUFJLGNBQWMsRUFBRTtvQkFDaEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O3dCQUMvQyxJQUFJLGVBQWUsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7O3dCQUN6QyxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7O3dCQUNuRCxJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQy9DLElBQUksZUFBZSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUU7NEJBQ2hHLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztnQ0FDbEUsSUFBSSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBRTdELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztvQ0FDOUQsSUFBSSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29DQUNwRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUU7O3dDQUMxQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3Q0FDeEQsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLEVBQUU7NENBQ3pFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzt5Q0FDdEM7cUNBQ0o7aUNBQ0o7NkJBQ0o7eUJBQ0o7cUJBQ0o7aUJBQ0o7Z0JBRUQsT0FBTyxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7UUFTckIsaUVBQW9DOzs7Ozs7Ozs7c0JBQUMsa0JBQTBCLEVBQUUsU0FBd0IsRUFBRSxnQkFBd0IsRUFBRSxjQUFtQyxFQUFFLGNBQWlDOzs7Z0JBQzlMLElBQUksbUJBQW1CLENBQUM7O2dCQUN4QixJQUFJLGVBQWUsQ0FBQzs7Z0JBQ3BCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDOztnQkFDMUIsSUFBSSxrQkFBa0IsR0FBVyxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQzs7Z0JBQ3ZFLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQzs7b0JBQ3ZCLEtBQW1CLElBQUEsY0FBQUEsU0FBQSxTQUFTLENBQUEsb0NBQUEsMkRBQUU7d0JBQXpCLElBQU0sSUFBSSxzQkFBQTt3QkFDWCxtQkFBbUIsR0FBRyxFQUFFLENBQUM7d0JBQ3pCLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQzt3QkFDeEUsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUNwRixJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFOzRCQUMxQyxtQkFBbUIsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFDMUQ7Z0RBQ1UsUUFBUTs0QkFDZixJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEdBQUEsQ0FBQyxFQUFFOztnQ0FDM0QsSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLFdBQVcsR0FBQSxDQUFDLENBQUM7Z0NBQzVFLGlCQUFpQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQUsscUNBQXFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLGtCQUFrQixDQUFDLENBQUM7OzZCQUUxSDs7Ozs0QkFMTCxLQUF1QixJQUFBLG1CQUFBQSxTQUFBLGNBQWMsQ0FBQSw4Q0FBQTtnQ0FBaEMsSUFBTSxRQUFRLDJCQUFBO3NEQUFSLFFBQVE7Ozs2QkFNbEI7Ozs7Ozs7Ozs7Ozs7OztxQkFDSjs7Ozs7Ozs7Ozs7Ozs7O2dCQUNELE9BQU8saUJBQWlCLENBQUM7Ozs7OztRQUc3QixrRUFBcUM7Ozs7WUFBckMsVUFBc0MsS0FBSztnQkFDdkMsSUFBSTs7b0JBQ0EsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2xELElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7d0JBQ2pGLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO3FCQUN6QztpQkFDSjtnQkFBQyxXQUFNO2lCQUNQO2dCQUNELE9BQU8sQ0FBQyxDQUFDO2FBQ1o7Ozs7Ozs7UUFPTSxpRUFBb0M7Ozs7OztzQkFBQyxPQUFtQixFQUFFLGNBQWlDOztnQkFDOUYsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUE7Z0JBQzFCLElBQUksY0FBYyxFQUFFO29CQUNoQixrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsRUFBRTs7b0JBQ3hCLElBQUkscUJBQXFCLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQzdELHFCQUFxQixDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUE7b0JBQzdDLHFCQUFxQixDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFFNUQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztpQkFDckQ7Z0JBRUQsT0FBTyxPQUFPLENBQUM7Ozs7Ozs7Ozs7O1FBV1osc0RBQXlCOzs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDdEYsU0FBbUIsRUFBRSxZQUFzQjtnQkFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBQ3hGLElBQUksY0FBYyxDQUFDO29CQUNuQixjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO29CQUN2RSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQzdCLEVBQ0csVUFBQSxHQUFHO29CQUNDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNuQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O1FBV0osMERBQTZCOzs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDMUYsU0FBbUIsRUFBRSxZQUFzQjs7Z0JBRTNDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxtQ0FBbUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtvQkFDdkcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDckUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDeEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNyQixDQUFDLENBQUM7Ozs7Ozs7Ozs7O1FBV0osdURBQTBCOzs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDdkYsU0FBbUIsRUFBRSxZQUFzQjtnQkFFM0MsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGdDQUFnQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUNwRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ25CLEVBQ0csVUFBQSxHQUFHO29CQUNDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDckIsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztRQVdKLGlEQUFvQjs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsUUFBZ0IsRUFBRSxJQUFTLEVBQ2pGLFNBQW1CLEVBQUUsWUFBc0I7O2dCQUUzQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsMEJBQTBCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQzlGLFNBQVMsRUFBRSxDQUFDO2lCQUNmLEVBQ0csVUFBQSxHQUFHO29CQUNDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDckIsQ0FBQyxDQUFDOzs7Ozs7UUFJSiw2Q0FBZ0I7Ozs7c0JBQUMsS0FBeUI7Z0JBQzdDLElBQUksS0FBSyxFQUFFOztvQkFDUCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUEsQ0FBQzt3QkFDckcsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdEcsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO3dCQUNoQixPQUFPLENBQUMsQ0FBQztxQkFDWjt5QkFBTTt3QkFDSCxPQUFPLFNBQVMsQ0FBQztxQkFDcEI7aUJBQ0o7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLENBQUM7aUJBQ1o7O2lDQTdoRlQ7UUEraEZDOzs7Ozs7O1FDamhGRzs0QkFIc0MsSUFBSUYsZUFBWSxFQUFFO29DQUM3QixJQUFJO1lBRzNCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN0QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTthQUNsQztTQUVKOzs7O1FBRUQsK0NBQWdCOzs7WUFBaEI7O2dCQUNJLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7O2dCQUN2RCxJQUFJLFdBQVcsQ0FBQzs7Z0JBQ2hCLElBQUksSUFBSSxHQUFZLElBQUksQ0FBQzs7Z0JBQ3pCLElBQUksTUFBTSxDQUFDO2dCQUVYLElBQUksV0FBVyxFQUFFO29CQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRTt3QkFDcEYsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFFekQsSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsYUFBYSxJQUFJLFNBQVMsRUFBRTs0QkFDbkUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7eUJBQy9CO3FCQUNKO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7Ozs7UUFFTSx1REFBd0I7Ozs7Z0JBRTNCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDcEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztnQkFJckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnR0FBZ0csQ0FBQyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBbUJqSCx3Q0FBUzs7O1lBQVQ7Z0JBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2lCQUNuQztxQkFDSTtvQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2lCQUMzRTthQUNKOzs7O1FBRUQsMkNBQVk7OztZQUFaOztnQkFDSSxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDOztnQkFDdkQsSUFBSSxXQUFXLENBQUM7Z0JBRWhCLElBQUksV0FBVyxFQUFFO29CQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUU7d0JBQ3pCLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQztxQkFDbEM7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZjs7OztRQUVNLHdDQUFTOzs7OztnQkFFWixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDOzs7OztRQUluQix5REFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7O1FBY0gsc0NBQU87Ozs7c0JBQUMsUUFBUTs7Ozs7b0NBRWIscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBQTs7Z0NBQXpDLFNBQVMsR0FBRyxTQUE2QixDQUFBO2dDQUN6QyxzQkFBTyxTQUFTLEVBQUE7Ozs7Ozs7OztRQUtiLG1DQUFJOzs7O3NCQUFDLE1BQWM7O2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O2dCQUNoRCxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDekMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQzNCLEtBQUssRUFBRSxJQUFJO2lCQUNkLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTtvQkFFcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1R0FBdUcsQ0FBQyxDQUFBO2lCQUN2SCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07b0JBQ2xCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHFHQUFxRyxDQUFDLENBQUE7aUJBQ3JILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTs7aUJBRXZCLENBQUMsQ0FBQzs7Ozs7O1FBR0Esa0NBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFHMUIsb0NBQUs7Ozs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUdsRCw0Q0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUduRCxzQ0FBTzs7OztnQkFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Ozs7O1FBR3pCLGdEQUFpQjs7OztnQkFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7UUFHbEIsdUNBQVE7Ozs7c0JBQUMsRUFBRTs7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTtvQkFDN0IsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDdkMsQ0FBQyxDQUFDOzs7OztRQUdBLDRDQUFhOzs7OztnQkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxPQUFPO29CQUN0RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRzt3QkFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQzlELENBQUMsQ0FBQztpQkFDTixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsVUFBVTtvQkFDZCxPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3QyxDQUFDLENBQUM7OztvQkFuTFZILGFBQVUsU0FBQzt3QkFDUixVQUFVLEVBQUUsTUFBTTtxQkFDckI7Ozs7O21DQUxEOzs7Ozs7O1FDU0E7UUFLSSxnQ0FBWSxRQUFROzJCQUpGLElBQUksTUFBTSxFQUFFO3VDQUVTLEtBQUs7WUFHeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7WUFDM0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDakM7Ozs7UUFHTSx1REFBc0I7Ozs7O2dCQUN6QixJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ2xGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFOztvQkFDeEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTs7d0JBQzVELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksZ0JBQWdCLEdBQUEsQ0FBQyxDQUFDO3dCQUN6RixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFBRTs0QkFDekIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzt5QkFDbkM7cUJBQ0o7aUJBQ0o7Ozs7Ozs7O1FBSVEseURBQXdCOzs7Ozs7c0JBQUMsZUFBNkIsRUFBRSxTQUFjLEVBQUUsY0FBNkI7Ozs7Ozs7Z0NBRTlFLEtBQUFLLFNBQUEsZUFBZSxDQUFDLGdCQUFnQixDQUFBOzs7OztnQ0FBckQsaUJBQWlCO2dDQUN4QixxQkFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBQTs7Z0NBQWpGLFNBQWlGLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0NBRzVELEtBQUFBLFNBQUEsZUFBZSxDQUFDLGNBQWMsQ0FBQTs7Ozs7Z0NBQTVDLFVBQVU7Ozs7Z0NBQ0ksS0FBQUEsU0FBQSxVQUFVLENBQUMsTUFBTSxDQUFBOzs7OztnQ0FBM0IsTUFBTTtnQ0FDYixxQkFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUE7O2dDQUF0RSxTQUFzRSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxQ0FHOUUsc0JBQU8sRUFBRSxFQUFDOzs7Ozs7Ozs7OztRQUlELG1EQUFrQjs7Ozs7O3NCQUFDLGVBQTZCLEVBQUUsU0FBYyxFQUFFLGNBQTZCOzs7Ozs7O2dDQUN4RyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztzQ0FDMUIsU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsY0FBYyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQTtvQ0FBN0ksd0JBQTZJOzs7Ozs7Z0RBRXJJLE1BQU0sR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dEQUMzQyxXQUFXLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dEQUM1RCxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7c0RBQ25GLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtvREFBckMsd0JBQXFDO3FEQUNqQyxDQUFDLE9BQUssbUJBQW1CO29EQUF6Qix3QkFBeUI7Z0RBQ3pCLFFBQVEsV0FBVyxDQUFDLENBQUMsQ0FBQztvREFDbEIsS0FBSyxJQUFJO3dEQUNMLFlBQVksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQzt3REFDdEMsTUFBTTtvREFDVixLQUFLLElBQUk7d0RBQ0wsWUFBWSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO3dEQUN0QyxNQUFNO29EQUNWLEtBQUssSUFBSTt3REFDTCxZQUFZLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7d0RBQ3RDLE1BQU07b0RBQ1YsUUFBUTtpREFDWDs7OztnREFJTyxxQkFBcUIsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0RBQ3RDLHFCQUFNLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQTs7Z0RBQTVELFVBQVUsR0FBRyxTQUErQztnREFDNUQsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dEQUN0RCxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvREFDbEUsV0FBYSxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7b0RBQ3pGLFlBQVksQ0FBQyxNQUFNLEdBQUcsT0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsUUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO29EQUMxRSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQUEsWUFBWTt3REFDOUMsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFFBQU0sRUFBRSxDQUFDLENBQUMsQ0FBQTtxREFDMUUsQ0FBQyxDQUFDO2lEQUNOOzs7O2dEQUdELE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEdBQUcsSUFBRSxDQUFDLE9BQU8sR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7OztzREFLMUYsWUFBWSxLQUFLLFNBQVMsQ0FBQTtvREFBMUIsd0JBQTBCO2dEQUMxQixNQUFNLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzs7b0RBRW5DLHFCQUFNLE9BQUsseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsRUFBQTs7Z0RBQXZFLFNBQXVFLENBQUM7Ozs7Ozs7Z0NBekN2RSxDQUFDLEdBQUcsQ0FBQzs7O3NDQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQTs7Ozs7OztnQ0FBRSxDQUFDLEVBQUUsQ0FBQTs7O2dDQTRDMUQsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dDQUMvQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDO2dDQUMzQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7Z0NBQzdELGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7O3FDQUUzRCxlQUFlO29DQUFmLHdCQUFlO2dDQUNmLHFCQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFBOztnQ0FBL0UsU0FBK0UsQ0FBQzs7b0NBRXBGLHNCQUFPLEVBQUUsRUFBQzs7Ozs7Ozs7Ozs7UUFHRCwyREFBMEI7Ozs7OztzQkFBQyxNQUFvQixFQUFFLFNBQWMsRUFBRSxjQUE2Qjs7Ozs7O3NDQUNuRyxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQTtvQ0FBakgsd0JBQWlIO2dDQUM3RyxZQUFZLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFBLENBQUMsQ0FBQztzQ0FDdkcsWUFBWSxLQUFLLFNBQVMsQ0FBQTtvQ0FBMUIsd0JBQTBCO2dDQUMxQixNQUFNLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzs7b0NBRW5DLHFCQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFBOztnQ0FBdkUsU0FBdUUsQ0FBQzs7b0NBR2hGLHNCQUFPLEVBQUUsRUFBQzs7Ozs7Ozs7Ozs7UUFJRCwwREFBeUI7Ozs7OztzQkFBQyxNQUFvQixFQUFFLFNBQWMsRUFBRSxjQUE2Qjs7Ozs7O2dDQUNsRyxNQUFNLEdBQVcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7Z0NBQ3BELGFBQWEsR0FBaUIsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztzQ0FFakUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUE7b0NBQTdCLHdCQUE2QjtnQ0FDekIsS0FBSyxHQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ2xJLHFCQUFNLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBQTs7Z0NBQTlGLE1BQU0sR0FBRyxTQUFxRjtnQ0FDbEcsSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtvQ0FDbkIsV0FBVyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0NBQ25DLFdBQVcsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7b0NBQ3pELFdBQVcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztvQ0FDL0IsV0FBVyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7b0NBQzVCLFdBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQ0FDN0IsTUFBTSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7aUNBQ3JDOzs7Ozs7O3FDQXRJYjtRQTJJQzs7Ozs7OztRQzNIRztTQUFpQjs7Ozs7Ozs7O1FBR1Ysa0RBQXVCOzs7Ozs7OztzQkFBQ0UsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUM3RixVQUFvQixFQUFFLFdBQXFCOztnQkFDM0MsSUFBSSxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFBO2dCQUNqQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBRXZGLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzNDLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBSUosbURBQXdCOzs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUFtQixFQUNoRyxVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsOEJBQThCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFDOUYsSUFBSSxXQUFXLENBQU07b0JBQ3JCLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBRW5CLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDM0IsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFJSixzQ0FBVzs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFDOUQsVUFBb0IsRUFBRSxXQUFxQjtnQkFDM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUdwRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUU3QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3JCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQU1KLDhDQUFtQjs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsU0FBYyxFQUN0RixVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUcvRixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztvQkFDeEMsSUFBSSxVQUFVLENBQWE7b0JBQzNCLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTs7d0JBRXJELFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBTSxLQUFLLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FCQUMvRDt5QkFBTTt3QkFDSCxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7cUJBQy9DO29CQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3hCLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDMUIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNsQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7UUFNWCw4Q0FBbUI7Ozs7Ozs7Ozs7Ozs7WUFBbkIsVUFBb0JBLGdCQUE0QixFQUFFLFNBQXlCLEVBQUUsUUFBZ0IsRUFBRSxTQUFpQixFQUM1RyxVQUFvQixFQUFFLFdBQXFCLEVBQWMsV0FBa0IsRUFBYyxlQUFzQixFQUFjLFFBQWMsRUFBYyxjQUFvQjs7c0NBQWxHOzs7MENBQW9DOzs7a0NBQTRCOzs7d0NBQWtDOzs7Z0JBQzdLLElBQUksU0FBUyxDQUFDO2dCQUNkLFNBQVMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDbE0sSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO29CQUNuQkEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsK0JBQStCLEdBQUcsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O3dCQUU5RixVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3FCQUMvQixFQUNHLFVBQUEsR0FBRzs7d0JBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ2xDLENBQUMsQ0FBQztpQkFDVjtxQkFBTTtvQkFDSCxXQUFXLENBQUMsaUNBQWlDLENBQUMsQ0FBQztpQkFDbEQ7YUFDSjs7Ozs7Ozs7Ozs7Ozs7UUFJRCxnREFBcUI7Ozs7Ozs7Ozs7OztZQUFyQixVQUFzQkEsZ0JBQTRCLEVBQUUsVUFBa0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFlLEVBQUUsU0FBaUIsRUFDMUgsVUFBb0IsRUFBRSxXQUFxQixFQUFjLFdBQWtCLEVBQWMsY0FBNEI7O3NDQUExQzs7O3dDQUEwQzs7O2dCQUNySCxJQUFJLFNBQVMsQ0FBaUI7O2dCQUM5QixJQUFJLFNBQVMsQ0FBQztnQkFDZCxTQUFTLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztnQkFFdEYsU0FBUyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxDQUFDO2dCQUN2SSxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7b0JBQ25CQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQywrQkFBK0IsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7d0JBRTlGLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7cUJBQy9CLEVBQ0csVUFBQSxHQUFHOzt3QkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQy9CLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNsQyxDQUFDLENBQUM7aUJBQ1Y7cUJBQU07b0JBQ0gsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7aUJBQ2xEO2FBRUo7Ozs7Ozs7Ozs7UUFPRCw4REFBbUM7Ozs7Ozs7O1lBQW5DLFVBQW9DQSxnQkFBNEIsRUFBRSxVQUFrQixFQUFFLFNBQWlCLEVBQ25HLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDQSxnQkFBYSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUV6RyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMxQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQixDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7Ozs7OztRQUtELDZDQUFrQjs7Ozs7Ozs7Ozs7WUFBbEIsVUFBbUJBLGdCQUE0QixFQUFFLE9BQWUsRUFBRSxXQUFtQixFQUFFLFNBQWlCLEVBQUUsUUFBZ0IsRUFDdEgsVUFBb0IsRUFBRSxXQUFxQixFQUFjLGNBQTRCOzt3Q0FBQTs7O2dCQUVyRixJQUFJLEtBQUssR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDbEdBLGdCQUFhLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUU5RyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCLEVBQ0csVUFBQSxHQUFHO29CQUNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O29CQUVqQixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzlDLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7Ozs7UUFFRCxpREFBc0I7Ozs7Ozs7Ozs7O1lBQXRCLFVBQXVCQSxnQkFBNEIsRUFBRSxPQUFlLEVBQUUsV0FBbUIsRUFBRSxTQUFpQixFQUFFLFFBQWdCLEVBQzFILFVBQW9CLEVBQUUsV0FBcUIsRUFBYyxjQUE0Qjs7d0NBQUE7OztnQkFFckYsSUFBSSxLQUFLLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQ2xHQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFOUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsR0FBRztvQkFDQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBRXZCLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7O1FBR0Qsa0RBQXVCOzs7Ozs7OztZQUF2QixVQUF3QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxRQUFRLEVBQzdFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRC9DLGlCQXFCQzs7O2dCQWZHLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO29CQUM1Q0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsK0JBQStCLEdBQUcsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTt3QkFDM0UsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzVCLEtBQUksQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7O3dCQUd6QyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ3hCLEVBQ0csVUFBQSxLQUFLOzt3QkFFRCxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3RCLENBQUMsQ0FBQztpQkFDVjtxQkFBTTtvQkFDSCxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3hCO2FBQ0o7Ozs7OztRQUdELG9EQUF5Qjs7OztZQUF6QixVQUEwQixTQUFTO2dCQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNuRTs7Ozs7Ozs7UUFJRCxvREFBeUI7Ozs7OztZQUF6QixVQUEwQixTQUFpQixFQUFFLFNBQWlCLEVBQUUsa0JBQWtCOztnQkFDOUUsSUFBSSxjQUFjLEdBQVcsRUFBRSxDQUFDOztnQkFDaEMsSUFBSSxhQUFhLENBQUM7O2dCQUVsQixJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBVyxDQUFDOztnQkFDckMsSUFBSSxRQUFRLENBQVU7O2dCQUN0QixJQUFJLGNBQWMsQ0FBUzs7O2dCQUszQixhQUFhLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztnQkFFN0QsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzNCLE9BQU8sU0FBUyxJQUFJLEVBQUUsRUFBRTt3QkFFcEIsY0FBYyxHQUFHLGNBQWMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDNUQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ25DLGFBQWEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFBLENBQUMsQ0FBQzt3QkFFckgsY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUNoRCxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7NEJBQzFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQzVCOzs7cUJBS0o7aUJBQ0o7cUJBQU07b0JBQ0gsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Z0JBQ0QsT0FBTyxTQUFTLENBQUM7YUFDcEI7Ozs7OztRQUdELGdEQUFxQjs7OztZQUFyQixVQUFzQixTQUFTO2dCQUEvQixpQkFXQztnQkFWRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO29CQUNuQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDMUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ3JELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3REO3lCQUFNO3dCQUNILFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTs0QkFDNUIsS0FBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNwQyxDQUFDLENBQUM7cUJBQ047aUJBQ0o7YUFDSjs7Ozs7Ozs7Ozs7OztRQUdELHdDQUFhOzs7Ozs7Ozs7OztZQUFiLFVBQWNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsV0FBbUIsRUFBRSxXQUFtQixFQUFFLFNBQXVCLEVBQUUsVUFBb0IsRUFBRSxXQUFxQixFQUFFLFdBQTRCO2dCQUE1Qiw0QkFBQTtvQkFBQSxtQkFBNEI7OztnQkFDdk0sSUFBSSxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUV4SEEsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRXBHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEtBQUs7O29CQUVELFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7Ozs7UUFHRCw4Q0FBbUI7Ozs7Ozs7OztZQUFuQixVQUFvQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQzFFLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxTQUFjO2dCQUMzREEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUUxRixJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUM7O29CQUN6QixJQUFJLHVCQUF1QixHQUFHLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BFLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUVBLGdCQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO3dCQUNqRixVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ3hCLENBQUMsQ0FBQztpQkFFTixFQUNHLFVBQUEsS0FBSzs7b0JBRUQsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7OztRQUVELG9EQUF5Qjs7Ozs7Ozs7O1lBQXpCLFVBQTBCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVMsRUFDaEYsVUFBb0IsRUFBRSxXQUFxQixFQUFFLFNBQWM7Z0JBQzNEQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxzQ0FBc0MsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRWhHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEtBQUs7O29CQUVELFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7OztRQUVELGtEQUF1Qjs7Ozs7Ozs7WUFBdkIsVUFBd0JBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUM5RSxVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFekYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4QixFQUNHLFVBQUEsS0FBSzs7b0JBRUQsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7UUFHTSw4Q0FBbUI7Ozs7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFBRSxVQUFvQixFQUFFLFdBQXFCO2dCQUMvSEEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsbUNBQW1DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUU5RixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztRQUlYLG1EQUF3Qjs7Ozs7Ozs7WUFBeEIsVUFBeUJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUNuRixVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMscUNBQXFDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFHL0YsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsS0FBSzs7b0JBRUQsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7O1FBR0QsOENBQW1COzs7Ozs7OztZQUFuQixVQUFvQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUFtQixFQUNwRixVQUFvQixFQUFFLFdBQXFCOztnQkFDM0MsSUFBSSxLQUFLLEdBQUcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBRTFDQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyx1Q0FBdUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRWxHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzNDLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbEMsQ0FBQyxDQUFDO2FBQ1Y7Ozs7Ozs7Ozs7UUFHRCw0Q0FBaUI7Ozs7Ozs7O1lBQWpCLFVBQWtCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFlBQW9CLEVBQ25GLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUUvRixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7OztRQUdELG9EQUF5Qjs7Ozs7Ozs7O1lBQXpCLFVBQTBCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFlBQW9CLEVBQUUsTUFBYyxFQUMzRyxVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxzQ0FBc0MsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFlBQVksR0FBRyxHQUFHLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUV4SSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7O1FBSU0sNkNBQWtCOzs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUNoRixVQUFvQixFQUFFLFdBQXFCLEVBQUUsU0FBYzs7Z0JBQzNELElBQUksdUJBQXVCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVc7b0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztnQkFFbkcsT0FBTyxDQUFDLEdBQUcsQ0FBQ0EsZ0JBQWEsQ0FBQyxDQUFDO2dCQUMzQkEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsK0JBQStCLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUN6RixJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7b0JBQzFCLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUVBLGdCQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO3dCQUNsRixVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ3pCLENBQUMsQ0FBQztpQkFFTixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7OztRQUtMLGtEQUF1Qjs7Ozs7Ozs7O1lBQTdCLFVBQThCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVksRUFDdkYsU0FBYyxFQUFFLFNBQXdCLEVBQUUsT0FBcUI7Z0JBQS9DLDBCQUFBO29CQUFBLGdCQUF3Qjs7Z0JBQUUsd0JBQUE7b0JBQUEsYUFBcUI7Ozs7Ozs7Z0NBRzNELHVCQUF1QixHQUFHLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBRXBFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQ0FDM0gsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVc7b0NBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztnQ0FFNUYscUJBQU1BLGdCQUFhLENBQUMsYUFBYSxDQUFDLCtCQUErQixHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQXZHLElBQUksR0FBRyxTQUFnRyxDQUFDO2dDQUN4RyxxQkFBTSx1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFQSxnQkFBYSxDQUFDLEVBQUE7O2dDQUFoRixTQUFnRixDQUFDO2dDQUNqRixzQkFBTyxJQUFJLEVBQUM7Ozs7YUFDZjs7Ozs7Ozs7O1FBSUsseURBQThCOzs7Ozs7O1lBQXBDLFVBQXFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVMsRUFBRSxTQUFjOzs7Ozs7Z0NBQ3ZHLHVCQUF1QixHQUFHLElBQUksc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBR3BFLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXO29DQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7Z0NBRXZGLHFCQUFNQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxzQ0FBc0MsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUFuSCxTQUFTLEdBQUcsU0FBdUcsQ0FBQztnQ0FDcEgscUJBQU0sdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRUEsZ0JBQWEsQ0FBQyxFQUFBOztnQ0FBckYsU0FBcUYsQ0FBQztnQ0FDdEYsc0JBQU8sU0FBUyxFQUFDOzs7O2FBQ3BCOzs7Ozs7Ozs7O1FBSUQsa0RBQXVCOzs7Ozs7OztZQUF2QixVQUF3QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUN0RixVQUFvQixFQUFFLFdBQXFCOztnQkFDM0MsSUFBSSxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFBO2dCQUNqQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsNEJBQTRCLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUV0RixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUMzQyxFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0IsQ0FBQyxDQUFDO2FBQ1Y7Ozs7Ozs7Ozs7UUFHRCwrQ0FBb0I7Ozs7Ozs7O1lBQXBCLFVBQXFCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLE9BQWUsRUFDakYsVUFBb0IsRUFBRSxXQUFxQjtnQkFFM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRzdGLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztvQkFDN0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDNUIsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3BCO3lCQUNJO3dCQUNELFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDckI7aUJBQ0osRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUMsQ0FBQyxDQUFDO2FBQ1Y7Ozs7Ozs7OztRQUdNLG1EQUF3Qjs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsT0FBZSxFQUM1RixVQUFvQixFQUFFLFdBQXFCO2dCQUUzQ0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsMENBQTBDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFHdEcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO29CQUM3QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO3dCQUM1QixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDcEI7eUJBQ0k7d0JBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNyQjtpQkFDSixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFJSix3REFBNkI7Ozs7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLElBQVMsRUFDM0YsVUFBb0IsRUFBRSxXQUFxQjs7Z0JBRzNDQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQywwQ0FBMEMsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBR3BHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztvQkFDckQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDNUIsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN4QixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3BCO3lCQUNJO3dCQUNELFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDckI7aUJBQ0osRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFJSixtREFBd0I7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQzNFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFHakYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDakIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O1FBS1gsb0RBQXlCOzs7Ozs7Ozs7WUFBekIsVUFBMEJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUNoRixVQUFvQixFQUFFLFdBQXFCLEVBQUUsU0FBYzs7Z0JBQzNELElBQUksdUJBQXVCLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVc7b0JBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztnQkFDbkdBLGdCQUFhLENBQUMsYUFBYSxDQUFDLHNDQUFzQyxHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFaEcsSUFBSSxTQUFTLEdBQVEsSUFBSSxDQUFDO29CQUMxQix1QkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFQSxnQkFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQzt3QkFDbEYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNwQixDQUFDLENBQUM7aUJBRU4sRUFDRyxVQUFBLEtBQUs7b0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBRW5CLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7Ozs7UUFFRCwyREFBZ0M7Ozs7Ozs7Ozs7WUFBaEMsVUFBaUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUN2RixVQUFvQixFQUFFLFdBQXFCLEVBQUUsU0FBYyxFQUFFLFdBQW1COztnQkFDaEYsSUFBSSx1QkFBdUIsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7b0JBQ2xCLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXO3dCQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7b0JBQ25HQSxnQkFBYSxDQUFDLG9CQUFvQixDQUFDLHNDQUFzQyxHQUFHLFNBQVMsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7d0JBRXBILElBQUksU0FBUyxHQUFRLElBQUksQ0FBQzt3QkFDMUIsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRUEsZ0JBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7NEJBQ2xGLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDcEIsQ0FBQyxDQUFDO3FCQUVOLEVBQ0csVUFBQSxLQUFLO3dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O3dCQUVuQixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7NEJBQ2IsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3BDOzZCQUNJOzRCQUNELFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdEI7cUJBQ0osQ0FBQyxDQUFDO2lCQUNWO3FCQUFNO29CQUNILFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7YUFDSjs7Ozs7Ozs7O1FBRUQsbURBQXdCOzs7Ozs7OztZQUF4QixVQUF5QixlQUErQixFQUFFLFNBQWlCLEVBQUUsSUFBWSxFQUFFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBQ2xJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTs7Z0JBQ3ZDLElBQUksU0FBUyxHQUFHLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3RCLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTtvQkFDakQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN0QixFQUFFLFVBQUEsS0FBSztvQkFDSixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCLENBQUMsQ0FBQzthQUNOOzs7Ozs7OztRQUVELDBEQUErQjs7Ozs7OztZQUEvQixVQUFnQyxjQUFtQixFQUFFLEtBQWEsRUFDOUQsVUFBb0IsRUFBRSxhQUF1Qjs7Z0JBQzdDLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUEsQ0FBQyxJQUFJLFNBQVMsR0FBQSxDQUFDLElBQUksU0FBUyxHQUFBLENBQUMsQ0FBQzs7Z0JBQ2xOLElBQUksYUFBYSxHQUFHRCxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRTlDLElBQUksWUFBWSxJQUFJLFNBQVMsRUFBRTs7b0JBQzNCLElBQUksT0FBTyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBQSxDQUFDLElBQUksU0FBUyxHQUFBLENBQUMsQ0FBQTtvQkFDdEgsYUFBYSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7b0JBQ2xDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO29CQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO29CQUMxQixVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7aUJBQzVCO3FCQUNJO29CQUNELGFBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2lCQUNwRDthQUVKOzs7Ozs7Ozs7UUFHTSwyQ0FBZ0I7Ozs7Ozs7O3NCQUFDQyxnQkFBNEIsRUFBRSxTQUFpQixFQUNuRSxVQUFvQixFQUFFLFdBQXFCLEVBQUUsU0FBNEI7Z0JBQTVCLDBCQUFBO29CQUFBLG9CQUE0Qjs7Z0JBRXpFQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUUzRixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDMUMsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBSUosa0RBQXVCOzs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQ3RGLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRS9GLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNsRCxFQUNHLFVBQUEsR0FBRzs7b0JBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQixDQUFDLENBQUM7Ozs7Ozs7OztRQVNFLHdEQUE2Qjs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVOzs7Ozs7O2dDQUt2RixxQkFBTUEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsb0NBQW9DLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBN0csSUFBSSxHQUFHLFNBQXNHLENBQUM7Z0NBQzlHLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2dDQUN2QixzQkFBTyxJQUFJLEVBQUM7OztnQ0FHWixzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7O1FBTWIsOENBQW1COzs7OztzQkFBQyxPQUE0QixFQUFFLEdBQUc7Z0JBQ3hELElBQUk7O29CQUNBLElBQUksbUJBQW1CLENBQWU7b0JBQ3RDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHOzt3QkFDbEMsSUFBSSxLQUFLLEdBQVksS0FBSyxDQUFDO3dCQUMzQixHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7NEJBRTFCLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUU7Z0NBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUM7NkJBQ2hCO3lCQUNKLENBQUMsQ0FBQzt3QkFDSCxPQUFPLEtBQUssQ0FBQztxQkFDaEIsQ0FBQyxDQUFDO29CQUNILG1CQUFtQixDQUFDLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUEsQ0FBQyxDQUFDO29CQUN0RyxPQUFPLG1CQUFtQixDQUFDO2lCQUM5QjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNoQixPQUFPLElBQUksQ0FBQztpQkFDZjs7Ozs7OztRQUtFLCtDQUFvQjs7Ozs7c0JBQUMsUUFBNEIsRUFBRSxPQUFPOztnQkFDN0QsSUFBSSxZQUFZLENBQWM7Z0JBQzlCLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLEdBQUEsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLFlBQVksQ0FBQzs7Ozs7Ozs7OztRQUlqQixzREFBMkI7Ozs7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDMUYsVUFBb0IsRUFBRSxXQUFxQjtnQkFFM0NBLGdCQUFhLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFbkcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDM0MsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBSVgsdURBQTRCOzs7Ozs7O1lBQTVCLFVBQTZCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBQ3JIQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFckYsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO29CQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO3dCQUM1QixLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzVCO29CQUVELFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDckIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7OztRQUtELHVEQUE0Qjs7Ozs7Ozs7WUFBNUIsVUFBNkJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxVQUFvQixFQUFFLFdBQXFCO2dCQUN4SUEsZ0JBQWEsQ0FBQyxLQUFLLENBQUMseUNBQXlDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFdkcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO29CQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO3dCQUM1QixLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzVCO29CQUVELFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDckIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDVjs7Ozs7Ozs7UUFFRCxpREFBc0I7Ozs7Ozs7WUFBdEIsVUFBdUJBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsVUFBb0IsRUFBRSxXQUFxQjtnQkFDL0dBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUUvRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7b0JBQ2xELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7d0JBQzVCLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDNUI7b0JBRUQsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNyQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsV0FBVyxFQUFFLENBQUM7aUJBQ2pCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7UUFFRCxrREFBdUI7Ozs7Ozs7O1lBQXZCLFVBQXdCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsVUFBb0IsRUFBRSxXQUFxQjtnQkFDbklBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRWxHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztvQkFDbEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDNUIsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUM1QjtvQkFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3JCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxXQUFXLEVBQUUsQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ1Y7Ozs7Ozs7OztRQUlELDJDQUFnQjs7Ozs7OztZQUFoQixVQUFpQkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxVQUFvQixFQUFFLFdBQXFCO2dCQUN6R0EsZ0JBQWEsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBQ3pFLElBQUksTUFBTSxDQUFDO29CQUNYLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQixVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3RCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLEVBQUUsQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ1Y7Ozs7Ozs7O1FBR00sbURBQXdCOzs7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBQ3hIQSxnQkFBYSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUNqRixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLEVBQUUsQ0FBQztpQkFDakIsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFJSixpREFBc0I7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsVUFBb0IsRUFBRSxXQUFxQjtnQkFDdEhBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQy9FLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDLENBQUM7Ozs7Ozs7UUFLRSxtREFBd0I7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQjs7Ozs7b0NBR2pFLHFCQUFNQSxnQkFBYSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQWxHLGFBQWEsR0FBRyxTQUFrRixDQUFDO2dDQUNuRyxzQkFBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUM7Ozs7Ozs7Ozs7UUFHZixvREFBeUI7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQjs7Ozs7OztnQ0FJdkUscUJBQU1BLGdCQUFhLENBQUMsS0FBSyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBM0UsSUFBSSxHQUFHLFNBQW9FLENBQUM7Z0NBQzVFLHNCQUFPLElBQUksRUFBQzs7O2dDQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQUliLDJDQUFnQjs7Ozs7Ozs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQixFQUFFLFVBQVUsRUFBRSxTQUFpQixFQUFFLElBQVksRUFBRSxPQUFlLEVBQUUsVUFBa0IsRUFDdEssVUFBb0IsRUFBRSxXQUFxQjs7Z0JBRTNDLElBQUksU0FBUyxDQUFDO2dCQUNkLFNBQVMsR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7Z0JBQ25KQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLDZCQUE2QixHQUFHLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxLQUFLOztvQkFFdkcsVUFBVSxFQUFFLENBQUM7aUJBQ2hCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzlDLENBQUMsQ0FBQzs7Ozs7OztRQUtFLHdEQUE2Qjs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCOzs7OztvQ0FHdEUscUJBQU1BLGdCQUFhLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBeEcsYUFBYSxHQUFHLFNBQXdGLENBQUM7Z0NBQ3pHLHNCQUFPLGFBQWEsRUFBQzs7Ozs7Ozs7Ozs7OztRQUtaLDhDQUFtQjs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUFFLFVBQW9CLEVBQUUsV0FBcUI7Ozt3QkFFcklBLGdCQUFhLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOzs7NEJBRzNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDcEIsRUFDRyxVQUFBLEdBQUc7OzRCQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2pCLFdBQVcsRUFBRSxDQUFDO3lCQUNqQixDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBZ0JYLDRDQUFpQjs7Ozs7Ozs7WUFBakIsVUFBa0JBLGdCQUE0QixFQUFFLFFBQWdCLEVBQUUsVUFBb0IsRUFBRSxXQUFxQjtnQkFDekdBLGdCQUFhLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFHLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQ3pFLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2hDLEVBQ0csVUFBQSxHQUFHO29CQUNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEIsQ0FBQyxDQUFDO2FBQ1Y7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQVVELG9EQUF5Qjs7Ozs7Ozs7O1lBQXpCLFVBQTBCQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFBRSxVQUFvQixFQUFFLFdBQXFCOztnQkFFNUhBLGdCQUFhLENBQUMsYUFBYSxDQUFDLHNDQUFzQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUMvRixVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUMzQyxFQUNHLFVBQUEsR0FBRztvQkFDQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCLENBQUMsQ0FBQzthQUNWOzs7Ozs7Ozs7OztRQVVNLDhDQUFtQjs7Ozs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsUUFBZ0IsRUFBRSxjQUFzQixFQUFFLElBQVMsRUFDeEcsVUFBb0IsRUFBRSxXQUFxQjtnQkFDM0NBLGdCQUFhLENBQUMsYUFBYSxDQUFDLHlCQUF5QixHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUN6RyxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ3pCLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQUdKLHNEQUEyQjs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUN4RixVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxxQ0FBcUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBQ3JHLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ2pELFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDekIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBSUwsaUNBQU07Ozs7Ozs7O1lBQVosVUFBYUEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFTLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjs7Ozs7O2dDQUVuRyxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0NBQy9GLHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBekYsSUFBSSxHQUFHLFNBQWtGLENBQUE7Z0NBQ3pGLHNCQUFPLElBQUksRUFBQTs7OzthQUNkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFZSyw0Q0FBaUI7Ozs7Ozs7OztZQUF2QixVQUF3QkEsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsR0FBVzs7Ozs7O2dDQUVsSCxJQUFJLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dDQUNuRSxxQkFBTUEsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBdEcsSUFBSSxHQUFHLFNBQStGLENBQUE7Z0NBQ3RHLHNCQUFPLElBQUksRUFBQTs7OzthQUNkOzs7Ozs7Ozs7O1FBR1ksK0NBQW9COzs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQzdFLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxHQUFXLEVBQUUsV0FBcUI7Ozt3QkFDekVBLGdCQUFhLENBQUMsd0JBQXdCLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOzs0QkFFbkksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNyQixFQUNHLFVBQUEsS0FBSzs7NEJBRUQsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7eUJBQ25DLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQUdMLHFEQUEwQjs7Ozs7WUFBaEMsVUFBaUNBLGdCQUE0QixFQUFFLElBQUk7Ozs7O29DQUd4RCxxQkFBTUEsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQXRHLElBQUksR0FBRyxTQUErRixDQUFBO2dDQUN0RyxzQkFBTyxJQUFJLEVBQUE7Ozs7YUFDZDs7Ozs7Ozs7Ozs7O1FBT0ssMERBQStCOzs7Ozs7WUFBckMsVUFBc0NBLGdCQUE0QixFQUFFLElBQUk7Ozs7O29DQUc3RCxxQkFBTUEsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxvQ0FBb0MsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQTNHLElBQUksR0FBRyxTQUFvRyxDQUFBO2dDQUMzRyxzQkFBTyxJQUFJLEVBQUE7Ozs7YUFDZDs7Ozs7OztRQUdLLG1EQUF3Qjs7Ozs7O1lBQTlCLFVBQStCQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLE1BQWM7Ozs7OztnQ0FDdEYsS0FBSyxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUE7Z0NBRS9DLHFCQUFNQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQTFGLElBQUksR0FBRyxTQUFtRixDQUFBO2dDQUMxRixzQkFBTyxJQUFJLEVBQUM7Ozs7YUFDZjs7Ozs7Ozs7OztRQVVNLDZDQUFrQjs7Ozs7Ozs7O3NCQUFDLFFBQWdCLEVBQUVBLGdCQUE0QixFQUNwRSxJQUFTLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjs7Z0JBSXREQSxnQkFBYSxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtvQkFDMUYsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNyRCxFQUNHLFVBQUEsR0FBRztvQkFDQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDbkMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7UUFJTCwrQ0FBb0I7Ozs7Ozs7Ozs7WUFBMUIsVUFBMkIsV0FBMEIsRUFBRSxTQUFpQixFQUFFLFVBQWtCLEVBQUUsSUFBWSxFQUFFLFFBQWdCLEVBQUUsT0FBZSxFQUFFLE9BQWU7Ozs7OztnQ0FFdEosSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQTtnQ0FDdkgscUJBQU0sV0FBVyxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQTFGLFdBQVcsR0FBRyxTQUE0RSxDQUFBO2dDQUMxRixXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtnQ0FDckMsc0JBQU8sV0FBVyxFQUFBOzs7O2FBQ3JCOzs7Ozs7Ozs7UUFFSywrQ0FBb0I7Ozs7Ozs7O1lBQTFCLFVBQTJCLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQUUsTUFBYzs7Ozs7O2dDQUV4SCxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUE7Z0NBQ3pGLHFCQUFNLFdBQVcsQ0FBQyxhQUFhLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUExRixXQUFXLEdBQUcsU0FBNEUsQ0FBQTtnQ0FDMUYsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7Z0NBQ3JDLHNCQUFPLFdBQVcsRUFBQTs7OzthQUNyQjs7Ozs7Ozs7UUFFSyw2Q0FBa0I7Ozs7Ozs7WUFBeEIsVUFBeUIsV0FBMEIsRUFBRSxTQUFpQixFQUFFLFVBQWtCLEVBQUUsTUFBYzs7Ozs7O2dDQUVsRyxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFBO2dDQUNoRSxxQkFBTSxXQUFXLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBeEYsV0FBVyxHQUFHLFNBQTBFLENBQUE7Z0NBQ3hGLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dDQUNyQyxzQkFBTyxXQUFXLEVBQUE7Ozs7YUFDckI7Ozs7Ozs7Ozs7UUFHTSw2Q0FBa0I7Ozs7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFhLEVBQUUsVUFBa0IsRUFDeEcsVUFBb0IsRUFBRSxXQUFxQjtnQkFDM0NBLGdCQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUNoSCxVQUFVLEVBQUUsQ0FBQztpQkFDaEIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsRUFBRSxDQUFDO2lCQUNqQixDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFHSixvREFBeUI7Ozs7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxTQUFpQixFQUFFLHdCQUFnQyxFQUFFLFdBQXVCLEVBQUUsWUFBc0I7Z0JBQy9KQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLHNDQUFzQyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsd0JBQXdCLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtvQkFDbkosWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUE7aUJBQ2pFLEVBQ0csVUFBQSxHQUFHOztvQkFFQyxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7b0JBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDOUQsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFHSix3REFBNkI7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsV0FBdUIsRUFBRSxZQUFzQjtnQkFDaklBLGdCQUFhLENBQUMsd0JBQXdCLENBQUMsMENBQTBDLEdBQUcsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQ3RILFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFBO2lCQUNqRSxFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO29CQUNwRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzlELENBQUMsQ0FBQzs7Ozs7Ozs7UUFHRSxnREFBcUI7Ozs7OztzQkFBQ0EsZ0JBQTRCLEVBQUUsU0FBaUIsRUFBRSxXQUF1Qjs7Ozs7b0NBRTVGLHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLGtDQUFrQyxHQUFHLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQTVILElBQUksR0FBRyxTQUFxSDtnQ0FDaEksc0JBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFBOzs7Ozs7Ozs7Ozs7UUFTeEQscURBQTBCOzs7Ozs7O3NCQUFDQSxnQkFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVM7Ozs7Ozs7Z0NBRzlFLHFCQUFNQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLGdDQUFnQyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQWxILElBQUksR0FBRyxTQUEyRztnQ0FDdEgsc0JBQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFDOzs7Z0NBR2xFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBQyxDQUFDLENBQUM7Z0NBQ2pCLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7Ozs7O1FBWWIsbURBQXdCOzs7Ozs7Ozs7c0JBQUNBLGdCQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUNyRixTQUFtQixFQUFFLFlBQXNCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw4QkFBOEIsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtvQkFDbEcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuQixFQUNHLFVBQUEsR0FBRztvQkFDQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3JCLENBQUMsQ0FBQzs7UUF0aUNYQztZQUNrREMsV0FBQUMsV0FBUSxFQUFFLENBQUEsRUFBc0JELFdBQUFDLFdBQVEsRUFBRSxDQUFBLEVBQTBCRCxXQUFBQyxXQUFRLEVBQUUsQ0FBQSxFQUFrQkQsV0FBQUMsV0FBUSxFQUFFLENBQUE7OzZDQUR6SCxhQUFhLEVBQWEsS0FBSyxrQkFDbEQsUUFBUSxFQUFlLFFBQVE7O21FQWU5QztRQUlERjtZQUNrREMsV0FBQUMsV0FBUSxFQUFFLENBQUEsRUFBc0JELFdBQUFDLFdBQVEsRUFBRSxDQUFBOzs2Q0FEdkQsYUFBYSxrQ0FDbEMsUUFBUSxFQUFlLFFBQVE7O3FFQW9COUM7UUF1QkRGO1lBQ2tEQyxXQUFBQyxXQUFRLEVBQUUsQ0FBQTs7NkNBRDFCLGFBQWEsa0NBQy9CLFFBQVEsRUFBZSxRQUFROztrRUFZOUM7UUFFREY7WUFDa0RDLFdBQUFDLFdBQVEsRUFBRSxDQUFBOzs2Q0FEdEIsYUFBYSxrQ0FDbkMsUUFBUSxFQUFlLFFBQVE7O3NFQVk5QzsrQkF4TEw7Ozs7Ozs7O0lDOEJBLElBQU1OLFFBQU0sR0FBRyxPQUFPLENBQUM7O0lBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTNDLFFBQUE7UUFXSSxzQkFBWSxnQkFBZ0MsRUFBRSxlQUE4QixFQUFFLFNBQWlCOzJCQVZ0RSxJQUFJLE1BQU0sRUFBRTttQ0FFQSxJQUFJO2dDQUNWLEtBQUs7a0NBQ0osQ0FBQyxDQUFDO3FDQUNDLENBQUM7a0NBQ1osRUFBRTtZQUt0QixJQUFJLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDO1lBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1NBQy9COzs7Ozs7UUFLTSx5Q0FBa0I7Ozs7O3NCQUFDLFlBQXdCO2dCQUM5QyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRTtvQkFDbEMsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQ25DLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztpQkFDakQ7Ozs7Ozs7Ozs7OztRQUdFLDJDQUFvQjs7Ozs7Ozs7OztzQkFBQyxTQUFpQixFQUFFLGFBQTRCLEVBQUUsV0FBdUIsRUFDaEcsU0FBYyxFQUFFLFNBQW1CLEVBQUUsWUFBc0IsRUFBRSxjQUE4QjtnQkFBOUIsK0JBQUE7b0JBQUEscUJBQThCOztnQkFDM0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFFaEUsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUM5SyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNwQyxXQUFXLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN4QyxXQUFXLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO29CQUNoRCxXQUFXLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFBOztvQkFHM0QsV0FBVyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO29CQUNwRCxXQUFXLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7b0JBRTlDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMzQyxFQUNHLFVBQUEsR0FBRzs7b0JBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3BDLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQUdFLGtEQUEyQjs7Ozs7Ozs7c0JBQUMsU0FBaUIsRUFBRSxhQUE0QixFQUFFLFdBQXVCLEVBQzdHLFNBQWMsRUFBRSxjQUE4QjtnQkFBOUIsK0JBQUE7b0JBQUEscUJBQThCOzs7Ozs7OztnQ0FFMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0NBRXJELHFCQUFNLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQTVMLElBQUksR0FBRyxTQUFxTDtnQ0FDNUwsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0NBQ3BDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0NBQ3hDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7O2dDQUdoRCxXQUFXLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7Z0NBQ3BELFdBQVcsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztnQ0FFOUMsc0JBQU8sV0FBVyxFQUFDOzs7Z0NBR25CLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7OztRQUtQLDhDQUF1Qjs7Ozs7OztzQkFBQyxTQUFpQixFQUFFLGFBQTRCLEVBQUUsV0FBOEIsRUFBRSxTQUFjOzs7Ozs7O2dDQUU1SCxxQkFBTSxhQUFhLENBQUMsd0JBQXdCLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUE1TCxTQUE0TCxDQUFDO2dDQUU3TCxzQkFBTyxJQUFJLEVBQUM7OztnQ0FHWixzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7OztRQU9iLHlDQUFrQjs7Ozs7O3NCQUFDLFNBQWMsRUFBRSxXQUF1QixFQUFFLGNBQXVCO2dCQUN0RixJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7b0JBQ2pGLElBQUksY0FBYyxFQUFFO3dCQUNoQixXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQzt3QkFDOUQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFOzRCQUNsRixXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQzt5QkFDdEU7cUJBQ0o7eUJBQ0k7d0JBQ0QsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUE7d0JBQ2hFLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO3FCQUNsRTtpQkFDSjs7Ozs7Ozs7Ozs7Ozs7OztRQUlFLGtEQUEyQjs7Ozs7Ozs7Ozs7Ozs7c0JBQUMsT0FBZSxFQUFFLFlBQXlCLEVBQ3pFLGVBQTZCLEVBQUUsU0FBbUIsRUFBRSxZQUFzQixFQUFFLFNBQWMsRUFBRSxTQUFpQixFQUM3RyxZQUF5QixFQUFFLFdBQThCLEVBQUUsWUFBd0IsRUFBRSx3QkFBb0M7O2dCQUFwQyx5Q0FBQTtvQkFBQSwrQkFBb0M7OztnQkFFekgsSUFBSSxXQUFXLENBQWE7O2dCQUM1QixJQUFJLFdBQVcsQ0FBUzs7Z0JBQ3hCLElBQUksbUJBQW1CLENBQWU7Z0JBQ3RDLG1CQUFtQixHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUV4RCxXQUFXLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Z0JBR3hMLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQU0sTUFBTTs7Ozs7O29DQUNqRCxXQUFXLEdBQUcsTUFBTSxDQUFDO29DQUNqQixlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7MENBQ25HLGVBQWUsSUFBSSxDQUFDLENBQUE7d0NBQXBCLHdCQUFvQjs7b0NBRXBCLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7O29DQUl0RSxXQUFXLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBQSxDQUFDLENBQUM7b0NBQ3ZLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQ0FDcEMsV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO29DQUNySixxQkFBTSxPQUFPLENBQUMsMEJBQTBCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFBOztvQ0FBbEUsU0FBa0UsQ0FBQztvQ0FDbkUsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7O29DQUVyQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixDQUFDLENBQUM7b0NBQ3JKLHFCQUFNLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUE7O29DQUFsRSxTQUFrRSxDQUFDO29DQUNuRSxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOzs7Ozs7OztpQkFJNUMsRUFBRSxVQUFNLEtBQUs7Ozs7OzBDQUNOLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFBO3dDQUFyQix3QkFBcUI7O29DQUNyQixXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLHdCQUF3QixDQUFDLENBQUM7b0NBQ3RKLHFCQUFNLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUE7O29DQUFsRSxTQUFrRSxDQUFDO29DQUNuRSxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOzs7b0NBRXJDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQ0FDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDbkIsWUFBWSxFQUFFLENBQUM7Ozs7OztpQkFFdEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O1FBS0EsZ0NBQVM7Ozs7Ozs7Ozs7Ozs7O3NCQUFDLFlBQXlCLEVBQ3RDLGVBQTZCLEVBQUUsU0FBbUIsRUFBRSxZQUFzQixFQUFFLFNBQWMsRUFBRSxTQUFpQixFQUM3RyxZQUF5QixFQUFFLFdBQThCLEVBQUUsWUFBd0IsRUFBRSx3QkFBb0MsRUFBRSxjQUFrQjtnQkFBeEQseUNBQUE7b0JBQUEsK0JBQW9DOztnQkFBRSwrQkFBQTtvQkFBQSxrQkFBa0I7OztnQkFFN0ksSUFBSSxXQUFXLEdBQWUsWUFBWSxDQUFDOztnQkFFM0MsSUFBSSxtQkFBbUIsQ0FBZTtnQkFDdEMsbUJBQW1CLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXhELElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO29CQUMvQixXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLHdCQUF3QixDQUFDLENBQUM7b0JBQ3RKLElBQUksU0FBUzt3QkFDVCxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDOzt3QkFFckMsT0FBTyxXQUFXLENBQUM7aUJBRTFCO3FCQUFNOztvQkFDSCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDdkcsSUFBSSxlQUFlLElBQUksQ0FBQyxFQUFFOzt3QkFFdEIsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsZUFBZSxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUM7d0JBRXJFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFDdkssSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNwQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQyxDQUFDO3dCQUNySyxJQUFJLFNBQVM7NEJBQ1QsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7NEJBRXJDLE9BQU8sV0FBVyxDQUFDO3FCQUMxQjt5QkFBTTt3QkFDSCxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQyxDQUFDO3dCQUNySyxJQUFJLFNBQVM7NEJBQ1QsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQzs7NEJBRXJDLE9BQU8sV0FBVyxDQUFDO3FCQUMxQjtpQkFDSjs7Ozs7Ozs7UUFPRSw0Q0FBcUI7Ozs7OztzQkFBQyxXQUErQixFQUFFLFNBQXVCLEVBQUUsWUFBeUI7OztnQkFDNUcsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQzs7Z0JBQzdCLElBQUksUUFBUSxHQUFXLENBQUMsQ0FBQztnQkFDekIsWUFBWSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxXQUFXLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBRWhGLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxLQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEdBQUEsQ0FBQyxDQUFDO29CQUNwSCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTs7d0JBRXBDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDN0csSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUU7NEJBQ3RHLFlBQVksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQzs0QkFDckMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOzt5QkFFOUUsQUFFQTtxQkFDSjtpQkFDSjtnQkFDRCxPQUFPLFFBQVEsQ0FBQzs7Ozs7O1FBR3BCLDBDQUFtQjs7OztZQUFuQixVQUFvQixZQUF5Qjs7Z0JBQ3pDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQzs7Z0JBQ2pCLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFBO2dCQUU5RSxJQUFJLFdBQVcsRUFBRTtvQkFDYixRQUFRLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO2lCQUNqQztnQkFFRCxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7b0JBQ2QsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7cUJBQ0k7b0JBQ0QsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO2FBRUo7Ozs7Ozs7UUFPTSx5Q0FBa0I7Ozs7OztzQkFBQyxZQUF5QixFQUFFLFdBQStCOztnQkFDaEYsSUFBSSxLQUFLLEdBQVksS0FBSyxDQUFDO2dCQUMzQixJQUFJO29CQUNBLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDLEVBQUUsR0FBQSxDQUFDLEVBQUU7d0JBQ3hELEtBQUssR0FBRyxJQUFJLENBQUM7cUJBQ2hCO2lCQUNKO2dCQUFDLFdBQU07aUJBRVA7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O1FBUVYseUNBQWtCOzs7Ozs7c0JBQUMsSUFBaUIsRUFBRSxXQUF1Qjs7Z0JBQ2hFLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztnQkFDM0IsSUFBSTs7b0JBQ0EsSUFBSSxVQUFVLEdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7O29CQUNsRixJQUFJLFdBQVcsR0FBVyxXQUFXLENBQUMsTUFBTSxDQUFDO29CQUU3QyxJQUFJLFdBQVcsSUFBSSxVQUFVLEVBQUU7d0JBQzNCLEtBQUssR0FBRyxJQUFJLENBQUM7cUJBQ2hCO2lCQUdKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtvQkFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtpQkFDbEI7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7O1FBS1YsK0NBQXdCOzs7Ozs7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxPQUFlLEVBQ3BFLFNBQWMsRUFBRSxTQUFpQixFQUFFLGFBQXFCLEVBQUUsU0FBbUIsRUFBRSxZQUFzQixFQUNuRyxXQUErQixFQUFFLFlBQWdDOztnQkFBakUsNEJBQUE7b0JBQUEsa0JBQStCOztnQkFBRSw2QkFBQTtvQkFBQSxtQkFBZ0M7OztnQkFFbkUsSUFBSSxXQUFXLENBQVM7Z0JBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7O2dCQUdwQyxJQUFJLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLEVBQUU7b0JBQ3RDLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXhMLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTt3QkFDM0MsT0FBTyxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQzt3QkFDN0QsS0FBSSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUN6SCxFQUFFLFVBQUEsS0FBSzt3QkFDSixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFOzs0QkFDdkIsT0FBTyxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQzs0QkFDN0QsS0FBSSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO3lCQUN6SDs2QkFBTTs0QkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7NEJBQ25DLFlBQVksRUFBRSxDQUFDO3lCQUNsQjtxQkFDSixDQUFDLENBQUM7aUJBQ047Ozs7Ozs7Ozs7OztRQUdFLGtEQUEyQjs7Ozs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLE9BQWUsRUFDdkUsU0FBYyxFQUFFLFdBQXdCLEVBQUUsU0FBbUIsRUFBRSxZQUFzQixFQUFFLFlBQXlCO2dCQUNoSCxJQUFJLFdBQVcsRUFBRTs7b0JBQ2IsSUFBSSxhQUFhLENBQWM7b0JBQy9CLElBQUksWUFBWSxFQUFFO3dCQUNkLGFBQWEsR0FBRyxZQUFZLENBQUM7cUJBQ2hDO3lCQUFNO3dCQUNILGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNsQyxhQUFhLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztxQkFDL0I7O29CQUVELElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQzs7O3dCQUd6RixPQUFPLENBQUMsK0JBQStCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7NEJBQ3BFLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQ3hCLFNBQVMsRUFBRSxDQUFDO3lCQUNmLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQSxDQUFDOzRCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7NEJBQ3hCLFNBQVMsRUFBRSxDQUFDO3lCQUNmLENBQUMsQ0FBQztxQkFDTixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUEsQ0FBQzt3QkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO3dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0RBQW9ELENBQUMsQ0FBQzt3QkFDbEUsU0FBUyxFQUFFLENBQUM7OztxQkFHZixDQUFDLENBQUM7aUJBQ047cUJBQ0k7b0JBQ0QsU0FBUyxFQUFFLENBQUM7aUJBQ2Y7Ozs7Ozs7Ozs7OztRQUtFLG1DQUFZOzs7Ozs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsT0FBZSxFQUN4RCxTQUFjLEVBQUUsU0FBaUIsRUFBRSxhQUFxQixFQUFFLFNBQW1CLEVBQUUsWUFBc0I7O2dCQUVyRyxJQUFJLFdBQVcsQ0FBUzs7O2dCQUd4QixJQUFJLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLEVBQUU7b0JBQ3RDLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXhMLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTt3QkFDM0MsT0FBTyxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQzt3QkFDN0QsU0FBUyxFQUFFLENBQUM7cUJBQ2YsRUFBRSxVQUFBLEtBQUs7d0JBQ0osSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTs7NEJBQ3ZCLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7NEJBQzdELFNBQVMsRUFBRSxDQUFDO3lCQUNmOzZCQUFNOzRCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQzs0QkFDbkMsWUFBWSxFQUFFLENBQUM7eUJBQ2xCO3FCQUNKLENBQUMsQ0FBQztpQkFDTjs7Ozs7Ozs7UUFJUSxzQ0FBZTs7Ozs7O3NCQUFDLE9BQWUsRUFBRSxTQUFjLEVBQUUsU0FBaUI7Ozs7OztnQ0FFM0UsV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDeEwscUJBQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBQTs7Z0NBQWpDLFNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7O1FBSy9CLDZDQUFzQjs7Ozs7Ozs7c0JBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsWUFBd0IsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVOztnQkFFcEgsSUFBSSxZQUFZLENBQUMsY0FBYyxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRTs7b0JBQ2xGLElBQUksU0FBUyxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUE7b0JBQ3ZLLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO3dCQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FCQUMvQixDQUFDLENBQUE7O29CQUdGLFNBQVMsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFBO29CQUN6SixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQzt3QkFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3FCQUNqQyxDQUFDLENBQUE7aUJBQ0w7Ozs7Ozs7O1FBTVEsK0NBQXdCOzs7Ozs7c0JBQUMsT0FBZSxFQUFFLFNBQWMsRUFBRSxTQUFpQjs7Ozs7OztnQ0FLcEYsV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FFM0sscUJBQU0sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBQTs7Z0NBQXRELFVBQVUsR0FBRyxTQUF5QyxDQUFDO2dDQUN2RCxzQkFBTyxVQUFVLEVBQUM7Ozs7Ozs7Ozs7Ozs7UUFJVCx1Q0FBZ0I7Ozs7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsT0FBZSxFQUFFLGVBQW9CLEVBQUUsZ0JBQXFCLEVBQUUsU0FBbUI7Ozs7Ozs7Z0NBSzFILGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDdE4sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBQzFNLHFCQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsRUFBQTs7Z0NBQTVELFVBQVUsR0FBRyxTQUErQztnQ0FFaEUsVUFBVSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2dDQUN2RCxVQUFVLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0NBQ3ZELE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dDQUMxQixxQkFBTSxPQUFPLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLEVBQUE7O2dDQUF4RSxTQUF3RSxDQUFDO2dDQUN6RSxTQUFTLEVBQUUsQ0FBQzs7OztnQ0FFWixTQUFTLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7O1FBUWIsc0RBQStCOzs7OztzQkFBQyxXQUF1Qjs7Ozs7Ozs7Ozs7Ozs7O2dCQWlCMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7UUFLakMsd0NBQWlCOzs7O3NCQUFDLFdBQXVCOztnQkFHNUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOztvQkFHekIsSUFBSSxVQUFVLEdBQUcsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDLEtBQUssRUFDdEcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUU3RixJQUFJLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDbEYsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQUU7d0JBQ3BCLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7cUJBQ25LO3lCQUFNO3dCQUNILEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztxQkFDN0U7b0JBTUQsS0FBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN0RyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7O1FBSW5DLG9EQUE2Qjs7Ozs7c0JBQUMsWUFBeUIsRUFBRSxXQUFtQjs7Z0JBQy9FLElBQUksY0FBYyxHQUFXLENBQUMsQ0FBQztnQkFDL0IsSUFBSTtvQkFDQSxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7d0JBQ2pDLGNBQWMsR0FBRyxDQUFDLENBQUMsY0FBYyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUMxRCxDQUFDLENBQUM7aUJBQ047Z0JBQUMsV0FBTTtpQkFFUDtnQkFDRCxRQUFRLENBQUMsQ0FBQyxXQUFXLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRTs7Ozs7Ozs7Ozs7Ozs7UUE4QnpDLDhDQUF1Qjs7Ozs7Ozs7Ozs7O3NCQUFDLFlBQXdCLEVBQUUsaUJBQXlCLEVBQUUsSUFBWSxFQUFFLElBQVksRUFDMUcsZUFBMkIsRUFBRSxLQUFhLEVBQUUsV0FBbUI7Z0JBRS9ELFlBQVksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzdDLFlBQVksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixZQUFZLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztnQkFDL0IsWUFBWSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN0RCxZQUFZLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0JBQzFELFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQztnQkFDOUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDNUIsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLFdBQVcsQ0FBQztnQkFDbEMsWUFBWSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDN0IsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7UUFJcEMsNENBQXFCOzs7Ozs7Ozs7O3NCQUFDLGVBQTZCLEVBQUUsWUFBeUIsRUFBRSxTQUFjLEVBQUUsWUFBeUIsRUFBRSxXQUE4QixFQUFFLFlBQXdCLEVBQUUsd0JBQW9DO2dCQUFwQyx5Q0FBQTtvQkFBQSwrQkFBb0M7OztnQkFFNU4sSUFBSSxXQUFXLENBQUM7Z0JBQ2hCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtvQkFDdEIsV0FBVyxHQUFHLFlBQVksQ0FBQztpQkFDOUI7cUJBQU07b0JBQ0gsV0FBVyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7aUJBQ2xDO2dCQUVELFdBQVcsQ0FBQyxLQUFLLEdBQUdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxXQUFXLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsV0FBVyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDakQsV0FBVyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDakQsV0FBVyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztnQkFDdkQsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFdkIsV0FBVyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDbkQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDakQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFFbEQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7Z0JBT3RDLElBQUksV0FBVyxDQUFDLFlBQVksSUFBSSxFQUFFLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtvQkFDeEQsV0FBVyxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7b0JBQ3RDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO2lCQUNwQztnQkFFRCxJQUFJLFlBQVksQ0FBQyxXQUFXLElBQUksRUFBRSxJQUFJLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFO29CQUMvRCxXQUFXLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7b0JBQ3BELFdBQVcsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztpQkFDakQ7Z0JBR0QsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO29CQUN0RCxXQUFXLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztpQkFDckM7cUJBQ0k7b0JBQ0QsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRTt3QkFDOUIsV0FBVyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDO3FCQUNwRDtpQkFDSjs7Z0JBR0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBOzs7Z0JBS3RLLE9BQU8sV0FBVyxDQUFDOzs7Ozs7OztRQU1oQixzQ0FBZTs7Ozs7c0JBQUMsWUFBeUIsRUFBRSxPQUFxQjtnQkFDbkUsSUFBSTtvQkFDQSxZQUFZLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsUUFBUSxJQUFJLGVBQWUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUN6RyxZQUFZLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsUUFBUSxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUMxRyxZQUFZLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNoRztnQkFBQyxXQUFNO2lCQUVQO2dCQUNELE9BQU8sWUFBWSxDQUFDOzs7Ozs7Ozs7Ozs7O1FBSWpCLDRDQUFxQjs7Ozs7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxlQUE2QixFQUMvRSxZQUF5QixFQUFFLFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjLEVBQUUsd0JBQW9DLEVBQUUsY0FBa0I7Z0JBQXhELHlDQUFBO29CQUFBLCtCQUFvQzs7Z0JBQUUsK0JBQUE7b0JBQUEsa0JBQWtCOzs7O2dCQUc5SixXQUFXLENBQUMsS0FBSyxHQUFHQSxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxXQUFXLENBQUMsV0FBVyxJQUFJLEVBQUUsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRTtvQkFDL0QsV0FBVyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDO2lCQUNwRDs7Z0JBR0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO2dCQUVuTCxPQUFPLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O1FBR2hCLGdEQUF5Qjs7Ozs7Ozs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLGVBQTZCLEVBQ25GLGdCQUFvQyxFQUFFLFlBQXlCLEVBQy9ELFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjLEVBQUUsaUJBQThCLEVBQUUsY0FBa0IsRUFBRSx3QkFBb0M7Z0JBQXhELCtCQUFBO29CQUFBLGtCQUFrQjs7Z0JBQUUseUNBQUE7b0JBQUEsK0JBQW9DOzs7Z0JBR25LLElBQUksV0FBVyxHQUFHLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUE7Z0JBQ3hGLElBQUksV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7b0JBQ2hDLE9BQU8sV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLElBQUksZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxXQUFXLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMxTSxXQUFXLENBQUMsaUJBQWlCLENBQUMsR0FBRyxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztvQkFDdkcsWUFBWSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztpQkFDekU7O2dCQUVELElBQUksWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLFdBQVcsQ0FBQyxLQUFLLEdBQUdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxZQUFZLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBRTFMLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUM3QixPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDdEM7Z0JBQ0QsSUFBSSxpQkFBaUIsRUFBRTs7b0JBRW5CLFlBQVksQ0FBQyxVQUFVLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2lCQUNsRDtnQkFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFOztvQkFDL0IsSUFBSSxjQUFjLENBQXNCO29CQUN4QyxjQUFjLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7b0JBQ3pELElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzt3QkFJN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7OzRCQUM1QyxJQUFJLGFBQWEsR0FBaUIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs0QkFDcEQsSUFBSSxlQUFlLENBQWM7NEJBRWpDLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRTtnQ0FDNUIsZUFBZSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7NkJBQ2hEO2lDQUNJO2dDQUNELGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztnQ0FDbEQsZUFBZSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDOzZCQUN0RDs0QkFDRCxlQUFlLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7NEJBQ3hELGVBQWUsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDOzs0QkFFL0UsZUFBZSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7OzRCQUUvRixhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs0QkFDOUQsSUFBSTs7Z0NBQ0EsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxHQUFBLENBQUMsQ0FBQztnQ0FDN0YsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRTtvQ0FDaEMsZUFBZSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO2lDQUNuRDs2QkFDSjs0QkFDRCxPQUFNLENBQUMsRUFBRTtnQ0FDTCxPQUFPLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTs2QkFDdEY7NEJBQ0QsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQzt5QkFDekw7cUJBQ0o7O29CQUdELElBQUksWUFBWSxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDbEMsWUFBWSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDO3FCQUNoRDs7b0JBRUQsSUFBSSxZQUFZLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxFQUFFO3dCQUMvQixZQUFZLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUM7d0JBQ2xELFlBQVksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQztxQkFDN0Q7b0JBQ0QsSUFBSSx3QkFBd0IsSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUNqRSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOzRCQUNoQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsSUFBSSxjQUFNLEdBQUcsRUFBRSxDQUFDO3lCQUNwRCxDQUFDLENBQUM7cUJBQ047b0JBRUQsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBRXhDO3FCQUNJO29CQUNELFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQzlEO2dCQUNELFlBQVksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQzs7Ozs7OztRQUlsRCx1REFBZ0M7Ozs7WUFBaEMsVUFBaUMsZUFBNkI7Z0JBQTlELGlCQWtCQzs7Z0JBakJHLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDOztnQkFDM0IsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7O2dCQUM1QixJQUFJLGVBQWUsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7Z0JBRTVFLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87O29CQUNwRCxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7O29CQUNuRSxJQUFJLGVBQWUsR0FBRyxLQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDN0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQ25FLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUNsRSxtQkFBbUIsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDO2lCQUMzRixDQUFDLENBQUM7Z0JBRUgsSUFBSSxtQkFBbUIsR0FBRyxlQUFlLEVBQUU7b0JBQ3ZDLGtCQUFrQixHQUFHLEdBQUcsSUFBSSxlQUFlLEdBQUcsR0FBRyxHQUFHLG1CQUFtQixDQUFDLENBQUM7aUJBQzVFO2dCQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtnQkFDakMsT0FBTyxrQkFBa0IsQ0FBQzthQUM3Qjs7Ozs7O1FBT00sMENBQW1COzs7OztzQkFBQyxhQUEyQjtnQkFDbEQsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFHM0Qsd0RBQWlDOzs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLHNCQUEwQyxFQUFFLE1BQWMsRUFBRSxLQUFLLEVBQUUsU0FBaUI7OztnQkFDbEosSUFBSSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFHdEMsYUFBYSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7Z0JBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUN6QixhQUFhLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5RSxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRixhQUFhLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztnQkFHL0IsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQ0EsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUMzRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7O2dCQUVyRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDOzs7Z0JBSXRFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDdkUsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUNuRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzlELGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7O2dCQUduRSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUNwRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUNsRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBRTlGLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN0QyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsVUFBQSxRQUFRO29CQUNuQyxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN6RSxRQUFRLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUM7b0JBQ3ZDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLGFBQWEsQ0FBQzs7Ozs7O1FBR3pCLDBDQUFtQjs7OztZQUFuQixVQUFvQixXQUF1Qjs7O2dCQUN2QyxJQUFJLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsTUFBTTs7b0JBQ3ZELElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDOztvQkFDekUsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLGtCQUFrQixHQUFBLENBQUMsQ0FBQztvQkFDbkYsT0FBTyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFBO2lCQUNwRyxDQUFDLENBQUM7Z0JBRUgsV0FBVyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOzs7b0JBR3RCLEtBQXFCLElBQUEsMEJBQUFDLFNBQUEscUJBQXFCLENBQUEsNERBQUEsK0ZBQUU7d0JBQXZDLElBQU0sTUFBTSxrQ0FBQTt3QkFDYixXQUFXLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLGFBQWEsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUMxRixXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDO3FCQUN0Rjs7Ozs7Ozs7Ozs7Ozs7O2FBQ0o7Ozs7Ozs7Ozs7Ozs7UUFHTSxvREFBNkI7Ozs7Ozs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLGVBQTZCLEVBQ3ZGLGdCQUFvQyxFQUFFLFlBQXlCLEVBQy9ELFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjLEVBQUUsaUJBQTBDLEVBQUUsY0FBa0I7Z0JBQTlELGtDQUFBO29CQUFBLDZCQUEwQzs7Z0JBQUUsK0JBQUE7b0JBQUEsa0JBQWtCOzs7Z0JBRXpJLElBQUksWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7O2dCQUNyQyxJQUFJLGFBQWEsQ0FBZTs7Z0JBQ2hDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQzs7Z0JBQ3hCLElBQUksZUFBZSxDQUFDOztnQkFDcEIsSUFBSSxtQkFBbUIsQ0FBcUI7O2dCQUM1QyxJQUFJLG9CQUFvQixHQUFXLENBQUMsQ0FBQzs7Z0JBQ3JDLElBQUksaUJBQWlCLEdBQVcsQ0FBQyxDQUFDOztnQkFDbEMsSUFBSSxjQUFjLEdBQVcsQ0FBQyxDQUFDOztnQkFHL0IsZUFBZSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6RixJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLG1CQUFtQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDL0MsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxHQUFHLENBQUM7b0JBQ3hILG1CQUFtQixDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsb0JBQW9CLENBQUM7b0JBQ25JLG1CQUFtQixDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztpQkFDckQ7cUJBQ0k7b0JBQ0QsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQ3BJOztnQkFHRCxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7b0JBQ3ZELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7O29CQUdsRixpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQztvQkFDM0QsbUJBQW1CLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFFOUgsY0FBYyxHQUFHLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDO29CQUMxRCxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNsSSxZQUFZLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7b0JBRzNHLFlBQVksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7O29CQUcxRyxhQUFhLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFbEQsWUFBWSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO29CQUM1QyxZQUFZLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7b0JBQ3ZDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1RSxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEYsWUFBWSxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO29CQUM1QyxZQUFZLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUM7b0JBQ25ELFlBQVksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztvQkFDakQsWUFBWSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDOztvQkFDdEQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFLLElBQUksWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLEVBQUU7d0JBQzdCLGVBQWUsR0FBRyxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztxQkFDekQ7eUJBQU07d0JBQ0gsZUFBZSxHQUFHLENBQUMsQ0FBQztxQkFDdkI7b0JBRUQsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDOztvQkFHckssWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQ0QsUUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUMxRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDakYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7b0JBQ2hHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO29CQUMvRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztvQkFDdkYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQ2pHLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRTt3QkFDekIsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7cUJBQ3ZGO29CQUNELFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7O29CQUV0RyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDL0UsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQzVFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO29CQUN4RixZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtvQkFDNUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQTtvQkFDNUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7OztvQkFJM0YsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO29CQUMzRixZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQkFDaEcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7O29CQUVsTCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsY0FBYyxFQUFFLFFBQVEsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztvQkFDakgsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUNwRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUN0RyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7b0JBQ3hGLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7OztvQkFLdEYsSUFBSSxlQUFlLENBQUMsZUFBZSxFQUFFO3dCQUNqQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUN2RTt5QkFBTTt3QkFDSCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUMxRTtvQkFHRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7b0JBR3BFLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDcEgsV0FBVyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7b0JBSWhJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNuRixJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUE7aUJBQ3pDO3FCQUNJO29CQUNELFlBQVksQ0FBQyxjQUFjLENBQUMsR0FBRyxzQkFBc0IsQ0FBQztpQkFDekQ7Z0JBRUQsT0FBTyxZQUFZLENBQUM7Ozs7Ozs7UUFPakIsaURBQTBCOzs7OztzQkFBQyxtQkFBdUM7Z0JBQ3JFLElBQUksbUJBQW1CLENBQUMsd0JBQXdCLEVBQUU7O29CQUM5QyxJQUFJLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQztvQkFDdkcsSUFBSSxnQkFBZ0IsRUFBRTt3QkFDbEIsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7aUJBQ0o7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O1FBTVYsOENBQXVCOzs7Ozs7c0JBQUMsS0FBSyxFQUFFLFFBQVE7Z0JBQzFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7O29CQUNsQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFBLENBQUMsQ0FBQztvQkFDekMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxDQUFDO2lCQUNaOzs7Ozs7OztRQVNFLCtDQUF3Qjs7Ozs7O3NCQUFDLFlBQXlCLEVBQUUsU0FBaUI7Ozs7Z0JBTXhFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQzs7Z0JBQ2pCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDOztnQkFDMUIsSUFBSSxjQUFjLENBQUE7O2dCQUVsQixjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7O2dCQUcvRCxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7b0JBRXRDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3JNLGNBQWMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUN4RSxpQkFBaUIsR0FBRyxRQUFRLEdBQUcsY0FBYyxDQUFDO2lCQUNqRDtxQkFDSTs7b0JBRUQsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3JHLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQztpQkFDaEM7Z0JBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN2RyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQzs7Z0JBRzFKLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQzs7O2dCQUcxSCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFQSxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUNwSixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM3SixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFVelAsaURBQTBCOzs7Ozs7c0JBQUMsWUFBeUIsRUFBRSxRQUFnQjs7Z0JBQ3pFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFOztvQkFDMUQsSUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDL0MsU0FBUyxHQUFHLFNBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNqRDtnQkFDRCxPQUFPLFNBQVMsQ0FBQzs7Ozs7OztRQUdiLHNDQUFlOzs7OztzQkFBQyxZQUF5QixFQUFFLFFBQWdCOztnQkFDL0QsSUFBSSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksYUFBYSxHQUFBLENBQUMsQ0FBQzs7Z0JBQzVGLElBQUksb0JBQW9CLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLGdCQUFnQixHQUFBLENBQUMsQ0FBQzs7Z0JBQ2xHLElBQUksbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLGlCQUFpQixJQUFJLG9CQUFvQixFQUFFO29CQUMzQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoUDtnQkFDRCxPQUFPLG1CQUFtQixDQUFDOzs7Ozs7OztRQUd2QixvQ0FBYTs7Ozs7O3NCQUFDLFlBQXlCLEVBQUUsS0FBYSxFQUFFLFNBQWlCOztnQkFDN0UsSUFBSSxJQUFJLENBQWtCO2dCQUMxQixJQUFJLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFNBQVMsR0FBQSxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksSUFBSSxFQUFFOztvQkFFTixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztpQkFDdEI7cUJBQU07O29CQUVILFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQzdFOzs7Ozs7Ozs7UUFTRyx5Q0FBa0I7Ozs7Ozs7c0JBQUMsUUFBZ0IsRUFBRSxZQUF5QixFQUFFLFlBQW9CO2dCQUN4RixJQUFJOztvQkFDQSxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksWUFBWSxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQ3hGLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDbkQ7Z0JBQUMsV0FBTTtvQkFDSixPQUFPLENBQUMsQ0FBQztpQkFDWjs7Ozs7Ozs7O1FBU0cseUNBQWtCOzs7Ozs7O3NCQUFDLFFBQWdCLEVBQUUsWUFBeUIsRUFBRSxTQUFpQjtnQkFDckYsSUFBSTtvQkFDQSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRTt3QkFDaEIsT0FBTyxDQUFDLENBQUM7cUJBQ1o7O29CQUNELElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxTQUFTLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDbEYsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQztpQkFDN0I7Z0JBQUMsV0FBTTtvQkFDSixPQUFPLENBQUMsQ0FBQztpQkFDWjs7Ozs7Ozs7UUFRRSx1Q0FBZ0I7Ozs7OztzQkFBQyxZQUF5QixFQUFFLFlBQXFDO2dCQUNwRixJQUFJOztvQkFDQSxJQUFJLGtCQUFrQixDQUEwQjtvQkFDaEQsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFBLENBQUMsQ0FBQztvQkFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDaEQsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztxQkFDN0c7aUJBRUo7Z0JBQUMsV0FBTTtpQkFFUDs7Ozs7Ozs7UUFVRSw0Q0FBcUI7Ozs7OztzQkFBQyxZQUF5QixFQUFFLFlBQXFDO2dCQUN6RixJQUFJO29CQUNBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUMxQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUMxRztpQkFDSjtnQkFBQyxXQUFNO2lCQUVQOzs7Ozs7O1FBSUUsa0RBQTJCOzs7OztzQkFBQyxZQUF5QixFQUFFLFlBQXlCO2dCQUNuRixJQUFJO29CQUNBLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUM1RCxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUNqSjtpQkFDSjtnQkFBQyxXQUFNO2lCQUVQOzs7Ozs7Ozs7UUFXRSx1REFBZ0M7Ozs7Ozs7c0JBQUMsbUJBQXVDLEVBQUUsU0FBaUIsRUFBRSxTQUFnQjtnQkFBaEIsMEJBQUE7b0JBQUEsZ0JBQWdCOzs7Z0JBQ2hILElBQUksUUFBUSxHQUFXLEVBQUUsQ0FBQzs7Z0JBQzFCLElBQUksSUFBSSxHQUFXLEVBQUUsQ0FBQzs7Z0JBQ3RCLElBQUksUUFBUSxHQUFXLEVBQUUsQ0FBQzs7Z0JBQzFCLElBQUksSUFBSSxDQUFDO2dCQUNULElBQUksbUJBQW1CLElBQUksbUJBQW1CLENBQUMsd0JBQXdCLElBQUksbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDaEksSUFBSSxTQUFTLEVBQUU7d0JBQ1gsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsR0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGtCQUFrQixJQUFJLElBQUksR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsS0FBSzs0QkFDeEgsUUFBUSxHQUFHLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzs0QkFDekMsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQzs0QkFDdEMsUUFBUSxHQUFHLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO3lCQUMzRSxDQUFDLENBQUM7cUJBQ047eUJBQ0k7d0JBQ0QsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsa0JBQWtCLElBQUksSUFBSSxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLOzRCQUN6SCxRQUFRLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDOzRCQUN6QyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDOzRCQUN0QyxRQUFRLEdBQUcsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7eUJBQzNFLENBQUMsQ0FBQztxQkFDTjtvQkFDRCxJQUFJLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFBO29CQUMvRCxPQUFPLElBQUksQ0FBQztpQkFDZjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7Ozs7O1FBV1QsaURBQTBCOzs7Ozs7O3NCQUFDLG1CQUF1QyxFQUFFLFlBQXlCLEVBQUUsU0FBaUI7O2dCQUNuSCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUE7Z0JBQ2hGLElBQUksSUFBSSxFQUFFO29CQUNOLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO29CQUMxRSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDbkUsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7O29CQUd6RSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztvQkFDM0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7b0JBQ2xELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBRTFELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO3dCQUN2QyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDbEYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzVFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUNuRjtpQkFDSjtnQkFFRCxJQUFJLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDbkYsSUFBSSxJQUFJLEVBQUU7b0JBQ04sWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztvQkFDaEYsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztvQkFDekUsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztpQkFDbEY7Ozs7Ozs7O1FBU0UsK0NBQXdCOzs7Ozs7c0JBQUMsZUFBZSxFQUFFLFlBQXlCO2dCQUN0RSxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDeEQsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7aUJBQ3RGOzs7Ozs7OztRQVFFLCtDQUF3Qjs7Ozs7O3NCQUFDLGVBQTZCLEVBQUUsU0FBaUI7Z0JBQzVFLElBQUk7O29CQUNBLElBQUksaUJBQWlCLENBQW1COztvQkFDeEMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO29CQUN0QixJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGdCQUFnQjt3QkFDL0QsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFFNUUsaUJBQWlCLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUEsQ0FBQyxDQUFDO3dCQUNuSCxJQUFJLGlCQUFpQixFQUFFOzRCQUNuQixlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDOzRCQUNoRixZQUFZLEdBQUcsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDN0Y7cUJBQ0o7b0JBQ0QsT0FBTyxZQUFZLENBQUM7aUJBQ3ZCO2dCQUFDLFdBQU07b0JBQ0osT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Ozs7Ozs7UUFHRSxzREFBK0I7Ozs7O3NCQUFDLGFBQTJCLEVBQUUsU0FBaUI7Z0JBQ2pGLElBQUk7O29CQUNBLElBQUksaUJBQWlCLENBQW1COztvQkFDeEMsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO29CQUN0QixJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLElBQUksYUFBYSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUV2RyxpQkFBaUIsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFBLENBQUMsQ0FBQzt3QkFDL0YsSUFBSSxpQkFBaUIsRUFBRTs0QkFDbkIsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDOzRCQUM1RCxZQUFZLEdBQUcsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt5QkFDN0Y7cUJBQ0o7b0JBQ0QsT0FBTyxZQUFZLENBQUM7aUJBQ3ZCO2dCQUFDLFdBQU07b0JBQ0osT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Ozs7Ozs7O1FBT0Usa0RBQTJCOzs7Ozs7c0JBQUMsbUJBQXVDLEVBQUUsUUFBZ0I7O2dCQUN4RixJQUFJLFlBQVksR0FBRyxLQUFLLEVBQW1CLENBQUM7Z0JBRTVDLElBQUksbUJBQW1CLENBQUMsd0JBQXdCLEVBQUU7b0JBQzlDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7O3dCQUM3RSxJQUFJLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFFdEUsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFOzs0QkFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQzs0QkFDbEMsS0FBSyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDOzRCQUN2QyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzs0QkFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDNUI7cUJBQ0o7aUJBQ0o7Z0JBRUQsT0FBTyxZQUFZLENBQUM7Ozs7Ozs7O1FBSWpCLG1EQUE0Qjs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsbUJBQXVDLEVBQUUsWUFBeUI7O2dCQUMzSCxJQUFJLG1CQUFtQixJQUFJLElBQUksSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsSUFBSSxJQUFJLEVBQUU7b0JBQ3JGLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxVQUFBLFFBQVE7d0JBQ3pELElBQUksUUFBUSxDQUFDLGtCQUFrQixJQUFJLElBQUksRUFBRTs7NEJBRXJDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOzs0QkFFL0QsSUFBSSxnQkFBZ0IsQ0FBa0I7NEJBQ3RDLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxDQUFBOzRCQUNqRixJQUFJLGdCQUFnQixFQUFFO2dDQUNsQixnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7NkJBQ3pFO2lDQUNJO2dDQUNELFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQzs2QkFDNUc7NEJBQ0QsS0FBSSxDQUFDLHNDQUFzQyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt5QkFDekY7cUJBQ0osQ0FBQyxDQUFDO2lCQUNOOzs7Ozs7OztRQU1FLDZEQUFzQzs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsbUJBQXVDO2dCQUMxRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFO29CQUMvQixXQUFXLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLEVBQXNCLENBQUM7aUJBQ2xFO2dCQUNELElBQUksV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxvQkFBb0IsSUFBSSxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBQSxDQUFDLEVBQUUsQ0FFL0c7cUJBQU07b0JBRUgsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2lCQUMxRDtnQkFDRCxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNsRDs7Ozs7OztRQVFFLG1EQUE0Qjs7Ozs7c0JBQUMsV0FBdUI7O2dCQUN2RCxJQUFJLG1CQUFtQixDQUFlO2dCQUN0QyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxtQkFBbUIsRUFBRTs7b0JBQ3JCLElBQUksUUFBUSxHQUE4QixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ3RDLElBQUksV0FBVyxHQUF1QixXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLG9CQUFvQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsR0FBQSxDQUFDLENBQUM7d0JBQ3pJLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ2QsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDbEQ7cUJBQ0o7b0JBQ0QsbUJBQW1CLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7aUJBQzVFO3FCQUFNOztvQkFDSCxJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUN2QyxhQUFhLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztvQkFDbkMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUVuRSxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDakQ7Ozs7Ozs7Ozs7O1FBS0UsMENBQW1COzs7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxlQUE2QixFQUM3RSxZQUF5QixFQUFFLFdBQThCLEVBQUUsU0FBYyxFQUFFLFlBQXlCOztnQkFDcEcsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7O2dCQUNuRCxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUV0QixJQUFJO29CQUNBLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTs7d0JBQ3JCLElBQUksUUFBUSxDQUFhOzt3QkFDekIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFFMUUsUUFBUSxHQUFHLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDckgsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQzt3QkFFcEcsT0FBTyxtQkFBbUIsQ0FBQztxQkFDOUI7eUJBQU07d0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO3FCQUN4RDtpQkFFSjtnQkFBQyxXQUFNO29CQUNKLG1CQUFtQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDL0MsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDeEYsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO29CQUM3QyxtQkFBbUIsQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7b0JBQ3BELE9BQU8sbUJBQW1CLENBQUM7aUJBQzlCOzs7Ozs7OztRQUlFLHlDQUFrQjs7Ozs7O3NCQUFDLG1CQUF1QyxFQUFFLFFBQWdCLEVBQUUsWUFBeUI7O2dCQUMxRyxJQUFJOztvQkFDQSxJQUFJLHVCQUF1QixDQUE4QjtvQkFDekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsSUFBSSxJQUFJLEVBQUU7d0JBQ3RELHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxHQUFBLENBQUMsQ0FBQzt3QkFFakgsSUFBSSx1QkFBdUIsSUFBSSxJQUFJLElBQUksdUJBQXVCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDdkUsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFVBQUEsS0FBSztnQ0FDakMsS0FBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQ0FDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTTtvQ0FBRSxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dDQUVwRSxJQUFJLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsRUFBRTtvQ0FDbEYsS0FBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO2lDQUMzQztnQ0FDRCxLQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQzs2QkFDOUQsQ0FBQyxDQUFDO3lCQUNOO3FCQUNKO2lCQUNKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ25COzs7Ozs7UUFHRSxtQ0FBWTs7OztzQkFBQyxtQkFBdUM7O2dCQUN2RCxJQUFJOztvQkFDQSxJQUFJLHVCQUF1QixDQUE4QjtvQkFDekQsSUFBSSxtQkFBbUIsQ0FBQyx3QkFBd0IsSUFBSSxJQUFJLEVBQUU7d0JBQ3RELHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFBLENBQUMsQ0FBQzt3QkFFaEosSUFBSSx1QkFBdUIsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUMvRCx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO2dDQUNqQyxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQzs2QkFDMUUsQ0FBQyxDQUFDOzRCQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7eUJBQzlDO3FCQUNKO2lCQUNKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ25COzs7Ozs7UUFHTCx1Q0FBZ0I7Ozs7WUFBaEIsVUFBaUIsR0FBZTs7Z0JBQzVCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2pDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkI7aUJBQ0o7YUFDSjs7Ozs7OztRQUVELDZDQUFzQjs7Ozs7O1lBQXRCLFVBQXVCLEtBQTJCLEVBQUUsWUFBeUIsRUFBRSxRQUFnQjs7Z0JBQzNGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRTtvQkFDM0IsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUM7aUJBQ3pDO3FCQUNJO29CQUNELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ3BELEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTzt3QkFDNUIsT0FBTyxDQUFDLFFBQVEsR0FBRyxZQUFZLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO3FCQUN2RCxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7aUJBQzdCO2dCQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUMzQzs7Ozs7O1FBRUQsZ0RBQXlCOzs7OztZQUF6QixVQUEwQixLQUEyQixFQUFFLFlBQXlCO2dCQUM1RSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPO3dCQUM1QixPQUFPLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7cUJBQ3hDLENBQUMsQ0FBQztpQkFDTjthQUNKOzs7Ozs7O1FBRUQsa0RBQTJCOzs7Ozs7WUFBM0IsVUFBNEIsS0FBSyxFQUFFLFlBQXlCLEVBQUUsUUFBZ0I7Z0JBQzFFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFO29CQUNsQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO2lCQUNyQztxQkFDSTtvQkFDRCxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQzlFLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87d0JBQ2xDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztxQkFDbkQsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2lCQUM3QjtnQkFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2FBQ2pEOzs7Ozs7UUFFRCx5REFBa0M7Ozs7O1lBQWxDLFVBQW1DLFNBQVMsRUFBRSxZQUF5QjtnQkFDbkUsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87d0JBQ3JCLE9BQU8sQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztxQkFDeEMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7Ozs7Ozs7UUFHRCw2Q0FBc0I7Ozs7O1lBQXRCLFVBQXVCLGFBQW1DLEVBQUUsdUJBQW9EOztnQkFDNUcsSUFBSSxhQUFhLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRTs7b0JBQzlCLElBQUksa0JBQWtCLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsV0FBVyxHQUFBLENBQUMsQ0FBQzs7d0JBQ3pHLEtBQW9CLElBQUEsdUJBQUFDLFNBQUEsa0JBQWtCLENBQUEsc0RBQUEsc0ZBQUU7NEJBQW5DLElBQU0sS0FBSywrQkFBQTs0QkFDWixJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxFQUFFO2dDQUN0QixJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLElBQUksYUFBYSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRTtvQ0FDMUUsT0FBTyxJQUFJLENBQUM7aUNBQ2Y7NkJBQ0o7eUJBQ0o7Ozs7Ozs7Ozs7Ozs7OztpQkFDSjtnQkFFRCxPQUFPLEtBQUssQ0FBQzthQUNoQjs7Ozs7Ozs7O1FBSVksd0NBQWlCOzs7Ozs7OztzQkFBQyxTQUFjLEVBQ3pDLFlBQXlCLEVBQUUsWUFBeUIsRUFBRSxPQUFnQixFQUFFLFdBQXVCOzs7Ozs7O2dDQUUzRixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztzQ0FDckIsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO29DQUEvRCx3QkFBK0Q7Z0NBQ3RELENBQUMsR0FBRyxDQUFDOzs7c0NBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFBOztxQ0FDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO29DQUEzQix3QkFBMkI7O2dDQUUzQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO29DQUNsQyxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2lDQUM3RDs7Z0NBRUQsWUFBWSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0NBQ2hDLFlBQVksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7Z0NBQzdELFlBQVksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO2dDQUNyQyxxQkFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUE7O2dDQUFqSCxTQUFpSCxDQUFDOzs7Z0NBVnpFLENBQUMsRUFBRSxDQUFBOzs7OztnQ0FleEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsQ0FBQzs7O2dDQUVwQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O1FBUW5CLHVDQUFnQjs7Ozs7Ozs7O3NCQUFDLEtBQUssRUFBRSxTQUFjLEVBQy9DLFlBQXlCLEVBQUUsWUFBeUIsRUFBRSxPQUFnQixFQUFFLFdBQXVCOzs7OztvQ0FTaEYscUJBQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUE7Ozs7O2dDQUF4SCxZQUFZLEdBQUcsU0FBeUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFNaEgsaURBQTBCOzs7Ozs7Ozs7c0JBQUMsS0FBSyxFQUFFLFdBQXVCLEVBQUUsWUFBeUIsRUFBRSxZQUF5QixFQUFFLE9BQWdCLEVBQUUsU0FBYzs7Ozs7O2dDQUN0SixTQUFTLEdBQWlCLElBQUksQ0FBQztnQ0FDdkIscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBQTs7Z0NBQW5GLFNBQVMsR0FBRyxTQUF1RSxDQUFDO2dDQUNwRixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dDQUN6QixJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7Ozs7O29DQU1uQixXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lDQUM3STtnQ0FDRCxzQkFBTyxXQUFXLEVBQUM7Ozs7Ozs7Ozs7Ozs7UUFJVix1Q0FBZ0I7Ozs7Ozs7O3NCQUFDLElBQUksRUFBRSxPQUFnQixFQUFFLFdBQXVCLEVBQUUsU0FBYyxFQUFFLGVBQXNCO2dCQUF0QixnQ0FBQTtvQkFBQSxzQkFBc0I7Ozs7Ozs7Z0NBQzdHLGlCQUFpQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQ0FFM0MsU0FBUyxHQUFpQixJQUFJLENBQUM7Z0NBQy9CLHVCQUF1QixHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3NDQUd0RSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFBO29DQUFqRCx3QkFBaUQ7Z0NBQzdDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztnQ0FDaEMscUJBQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUE7O2dDQUF4RCxTQUFTLEdBQUcsU0FBNEMsQ0FBQztnQ0FDekQsU0FBUyxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDOztvQ0FFN0UscUJBQU0saUJBQWlCLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFBOztnQ0FBakosU0FBUyxHQUFHLFNBQXFJLENBQUM7OztnQ0FFdEosSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksZUFBZSxFQUFFO29DQUNoRSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUM7aUNBQzVEO2dDQUVELHFCQUFNLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFBOztnQ0FBNUYsU0FBNEYsQ0FBQzs7Z0NBRTdGLHNCQUFPLFNBQVMsRUFBQzs7Ozs7Ozs7OztRQUlkLDBDQUFtQjs7Ozs7c0JBQUMsV0FBbUIsRUFBRSxVQUFrQjs7Z0JBRTlELElBQUksVUFBVSxHQUFXLFVBQVUsQ0FBQztnQkFDcEMsSUFBSTs7b0JBQ0EsSUFBSSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzs7b0JBQ3JDLElBQUksVUFBVSxDQUFDO29CQUNmLElBQUksV0FBVyxJQUFJLEVBQUUsRUFBRTt3QkFDbkIsVUFBVSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDeEQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRzs7NEJBRXJDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksWUFBWSxFQUFFO2dDQUNuQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUNuRDtpQ0FDSTtnQ0FDRCxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQy9DO3lCQUNKLENBQUMsQ0FBQztxQkFDTjs7aUJBRUo7Z0JBQUMsV0FBTTtvQkFDSixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2lCQUN2Qjs7Z0JBR0QsT0FBTyxVQUFVLENBQUM7Ozs7Ozs7Ozs7UUFJZixpREFBMEI7Ozs7Ozs7O3NCQUFDLFdBQW1CLEVBQUUsWUFBeUIsRUFDNUUsVUFBa0IsRUFBRSxRQUFnQixFQUFFLHNCQUE4QjtnQkFDcEUsSUFBSTs7b0JBQ0EsSUFBSSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQzs7b0JBQ3JDLElBQUksYUFBYSxDQUFlOztvQkFDaEMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDOztvQkFDdkQsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDOztvQkFDcEMsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUM7O29CQUNyRixJQUFJLFVBQVUsQ0FBQzs7b0JBQ2YsSUFBSSxjQUFjLEdBQVcsQ0FBQyxDQUFDO29CQUMvQixJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUU7d0JBQ25CLFVBQVUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7O3dCQUd4RCxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTs7NEJBQ2hFLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQzs7NEJBQ3JCLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMzQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzs0QkFDbkMsYUFBYSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs0QkFDekMsYUFBYSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzs0QkFDdkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxZQUFZLEVBQUU7O2dDQUNuQyxZQUFZLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dDQUNqRSxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDMUQsSUFBSSxhQUFhLENBQUMsS0FBSyxHQUFHLFlBQVksRUFBRTtvQ0FDcEMsYUFBYSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztpQ0FDM0Y7cUNBQ0k7b0NBQ0QsYUFBYSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztpQ0FDNUY7NkJBQ0o7aUNBQ0k7O2dDQUNELFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dDQUM1QixhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs2QkFPN0Q7OzRCQUlELGFBQWEsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDOzRCQUNwQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLGNBQWMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7NEJBRzVELGNBQWMsR0FBRyxDQUFDLENBQUMsY0FBYyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDOzs0QkFHNUQsSUFBSSxTQUFTLENBQWU7NEJBQzVCLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxXQUFXLElBQUksYUFBYSxDQUFDLFdBQVcsR0FBQSxDQUFDLENBQUM7NEJBQ2hHLElBQUksU0FBUyxFQUFFOztnQ0FFWCxZQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsV0FBVyxHQUFBLENBQUMsQ0FBQzs2QkFDckg7NEJBQ0QsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7eUJBQ2pEOzs7cUJBSUo7O29CQUdELElBQUksY0FBYyxJQUFJLENBQUMsRUFBRTs7d0JBRXJCLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7O3dCQUN2RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSx1QkFBdUIsR0FBRyxjQUFjLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNwRyxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7NEJBQ2pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7eUJBQ3ZEOzt3QkFHRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLHVCQUF1QixHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDNUU7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLENBQUM7cUJBQ1o7aUJBRUo7Z0JBQUMsV0FBTTtvQkFDSixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNwQixPQUFPLENBQUMsQ0FBQztpQkFDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQVdMLDJDQUFvQjs7Ozs7Ozs7O1lBQXBCLFVBQXFCLFlBQXlCLEVBQUUsVUFBa0I7Z0JBQzlELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTs7b0JBQzFELElBQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7O29CQUcvQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7Ozt3QkFHaEIsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUU7NEJBQ3pDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQzs0QkFDeEMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzVFLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDO3lCQUNsQzs7cUJBRUo7O3lCQUVJOzs7d0JBR0QsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUU7NEJBQ3pDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQzs0QkFDeEMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzVFLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDO3lCQUNsQzs7cUJBRUo7O29CQUdELElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTt3QkFDakIsTUFBTTtxQkFDVDtpQkFDSjthQUNKOzs7Ozs7UUFHTSxxQ0FBYzs7Ozs7c0JBQUMsTUFBYyxFQUFFLFNBQWlCOztnQkFDbkQsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUM3QyxnQkFBZ0IsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2dCQUM1QyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUNoQyxPQUFPLGdCQUFnQixDQUFDOzs7Ozs7O1FBS2YsNENBQXFCOzs7OztzQkFBQyxXQUF1QixFQUFFLFNBQWM7Ozs7d0JBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxLQUFLLFdBQVcsQ0FBQyxhQUFhLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxNQUFNLElBQUksZUFBZSxHQUFBLENBQUMsQ0FBQyxFQUFFOzRCQUM1SCxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzs0QkFDbEUsV0FBVyxHQUFHLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDOzRCQUNqRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQ3ZDOzs7Ozs7Ozs7Ozs7UUFLUSx1Q0FBZ0I7Ozs7Ozs7c0JBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsU0FBYyxFQUFFLGVBQTJCOzs7Ozs7O2dDQUlqRyxlQUFlLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0NBR3pDLEtBQUssR0FBWSxJQUFJLENBQUM7Z0NBRTFCLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0NBRXJLLHFCQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUE7OztnQ0FBNUQsZ0JBQWdCLEdBQUcsU0FBeUMsQ0FBQzs7Z0NBRzdELEtBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDN0MsSUFBSSxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0NBQzdFLEtBQUssR0FBRyxLQUFLLENBQUM7d0NBQ2QsTUFBTTtxQ0FDVDtpQ0FDSjtnQ0FFRCxJQUFJLEtBQUssRUFBRTs7b0NBRVAsS0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3Q0FDbkQsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0Q0FDM0QsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVU7NENBQzNFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxFQUFFOzRDQUNuSyxLQUFLLEdBQUcsS0FBSyxDQUFDOzRDQUNkLE1BQU07eUNBQ1Q7cUNBQ0o7aUNBQ0o7Z0NBRUQsS0FBSyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztnQ0FDM0Qsc0JBQU8sS0FBSyxFQUFDOzs7Z0NBRWIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2dDQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUUsQ0FBQyxDQUFDO2dDQUNoQixLQUFLLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQ0FDOUMsc0JBQU8sS0FBSyxFQUFDOzs7Ozs7Ozs7Ozs7UUFPZCw4Q0FBdUI7Ozs7OztzQkFBQyxXQUF1QixFQUFFLGFBQXFCLEVBQUUsYUFBcUI7Z0JBQ2hHLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDdEYsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDOzs7Ozs7O1FBSW5GLDBDQUFtQjs7Ozs7c0JBQUMsTUFBTSxFQUFFLEtBQUs7O2dCQUNwQyxJQUFJLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxhQUFhLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDOUIsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBRTVCLE9BQU8sYUFBYSxDQUFDOzs7Ozs7Ozs7Ozs7UUFLbEIsOENBQXVCOzs7Ozs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsT0FBZSxFQUNuRSxTQUFjLEVBQUUsU0FBaUIsRUFBRSxTQUFtQixFQUFFLFlBQXNCLEVBQUUsU0FBUzs7Z0JBRXpGLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtvQkFFdEQsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBZSxDQUFDO29CQUM3QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7aUJBQzdHO3FCQUFNO29CQUNILElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTt3QkFFaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7NEJBQ3RELEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUc7Z0NBQ2pFLFdBQVcsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dDQUMvQixTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7NkJBQzFCLENBQUMsQ0FBQzt5QkFDTixDQUFDLENBQUM7cUJBQ047eUJBQU07d0JBQ0gsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOzRCQUN6QixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO3lCQUM3RSxDQUFDLENBQUM7d0JBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUM3RztpQkFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQUlFLDJDQUFvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxPQUFlLEVBQ2hFLFNBQWMsRUFBRSxTQUFpQixFQUFFLFNBQW1CLEVBQ3RELFlBQXNCLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFDekUsV0FBd0IsRUFBRSxXQUE4QixFQUFFLFlBQTZCOztnQkFBN0IsNkJBQUE7b0JBQUEsb0JBQTZCOztnQkFFdkYsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksYUFBYSxJQUFJLEtBQUssS0FBSyxZQUFZLEVBQUU7b0JBRWxHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxHQUFBLENBQUMsQ0FBQzs7b0JBRTFJLElBQUksYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ3RDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2lCQUNsSTtxQkFBTTs7b0JBRUgsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO3dCQUNoQixXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxVQUFVLElBQUksVUFBVSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksS0FBSyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7d0JBQ3pLLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ2xJO3lCQUFNO3dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxJQUFJOzRCQUN6SCxLQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQ3BKLENBQUMsQ0FBQztxQkFDTjtpQkFLSjs7Ozs7Ozs7Ozs7Ozs7O1FBUVEsb0NBQWE7Ozs7Ozs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFjLEVBQ2hHLFNBQWlCLEVBQUUsV0FBd0IsRUFBRSxXQUE4Qjs7Ozs7O2dDQUN6RSxTQUFTLEdBQWlCLElBQUksQ0FBQztnQ0FDL0IsWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7Z0NBQ3JDLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dDQUUvQixZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssR0FBQSxDQUFDLENBQUM7Z0NBQ3RILElBQUksWUFBWSxFQUFFO29DQUNkLFlBQVksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztpQ0FDcEQ7Z0NBR0QsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQ0FFN0kscUJBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUE7O2dDQUExRyxTQUFTLEdBQUcsU0FBOEYsQ0FBQztnQ0FDM0csWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dDQUM3RCxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dDQUMvSCxzQkFBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxFQUFDOzs7Ozs7Ozs7OztRQUdyRSw4Q0FBdUI7Ozs7OztZQUF2QixVQUF3QixXQUF1QixFQUFFLFVBQVUsRUFBRSxJQUFJO2dCQUM3RCxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLEdBQUEsQ0FBQyxDQUFBO2FBQ3pGOzs7Ozs7UUFHTSxrQ0FBVzs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxTQUF1QjtnQkFDL0QsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOzs7Ozs7UUFHM0osdUNBQWdCOzs7O3NCQUFDLFdBQXVCO2dCQUMzQyxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQzlELFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUEsQ0FBQzt3QkFDakcsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQTtpQkFDeEc7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLENBQUM7aUJBQ1o7Ozs7Ozs7UUFLRSxxQ0FBYzs7Ozs7c0JBQUMsV0FBdUIsRUFBRSxXQUFtQjs7O2dCQUU5RCxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLENBQUMsV0FBVyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRzt3QkFDbEYsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7cUJBQzFILENBQUMsQ0FBQztpQkFDTjs7Ozs7O1FBSUUsb0NBQWE7Ozs7c0JBQUMsV0FBdUI7Z0JBQ3hDLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSTtvQkFDaEgsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOzt3QkFDekIsSUFBSSxRQUFRLENBQWtCO3dCQUM5QixRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFNBQVMsR0FBQSxDQUFDLENBQUM7d0JBQ2xFLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFOzRCQUM1QyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQzt5QkFDeEI7cUJBQ0osQ0FBQyxDQUFBOzs7Ozs7UUFRSCxvQ0FBYTs7OztzQkFBQyxXQUF1Qjs7O2dCQUV4QyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDbEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOzt3QkFDN0IsSUFBSSxJQUFJLENBQXFCO3dCQUM3QixJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEdBQUEsQ0FBQyxDQUFDO3dCQUVuRSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTs0QkFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7Z0NBQ1osR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksVUFBVSxHQUFBLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzs2QkFDakgsQ0FBQyxDQUFDO3lCQUVOO3FCQUVKLENBQUMsQ0FBQztpQkFDTjs7Ozs7O1FBSUUsb0NBQWE7Ozs7c0JBQUMsV0FBdUI7Z0JBQ3hDLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSTtvQkFDaEgsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOzt3QkFDekIsSUFBSSxRQUFRLENBQWtCO3dCQUM5QixRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFNBQVMsR0FBQSxDQUFDLENBQUM7d0JBQ2xFLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFOzRCQUM1QyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQzt5QkFDeEI7cUJBQ0osQ0FBQyxDQUFBOzs7Ozs7Ozs7OztRQWNHLDhDQUF1Qjs7Ozs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsU0FBYyxFQUN4RSxZQUF5QixFQUFFLFlBQXlCLEVBQUUsT0FBZ0I7Ozs7b0NBRXRFLHFCQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUE7O2dDQUF6RixTQUF5RixDQUFDOzs7Ozs7Ozs7Ozs7OztRQU92Riw4Q0FBdUI7Ozs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsWUFBeUIsRUFBRSxXQUE4QixFQUFFLFNBQWM7Z0JBRTdILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQzs7Ozs7Ozs7O1FBR3ZFLHdDQUFpQjs7Ozs7OztzQkFBQyxXQUF1QixFQUFFLFlBQXlCLEVBQUUsV0FBOEIsRUFBRSxTQUFjO2dCQUN2SCxJQUFJOztvQkFDQSxJQUFJLG1CQUFtQixHQUFHLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDOztvQkFDbEUsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQzs7b0JBQ3RDLElBQUksUUFBUSxDQUFhOztvQkFDekIsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ25ELFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzFCLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQy9HLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBRWpHLElBQUksbUJBQW1CLElBQUksSUFBSSxFQUFFO3dCQUM3QixXQUFXLENBQUMsU0FBUyxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQzt3QkFDeEQsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO3FCQUN2RTtpQkFDSjtnQkFBQyxXQUFNO2lCQUVQOzs7Ozs7OztRQVFFLG1EQUE0Qjs7Ozs7O3NCQUFDLFdBQXVCLEVBQUUsbUJBQXVDOztnQkFDaEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7O29CQUNkLElBQUksYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ3ZDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7b0JBQzNHLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUU5QyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQ3JFLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUU5QyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7b0JBQzlELFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUNqRDs7Ozs7Ozs7O1FBTUMsMERBQW1DOzs7Ozs7WUFBekMsVUFBMEMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFdBQW1COzs7OztvQ0FDL0YscUJBQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBNUcsSUFBSSxHQUFHLFNBQXFHO2dDQUNoSCxzQkFBTyxJQUFJLEVBQUM7Ozs7YUFDZjs7Ozs7OztRQUVZLGdEQUF5Qjs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVOzs7Ozs7O2dDQUluRixxQkFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLCtCQUErQixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQXhHLElBQUksR0FBRyxTQUFpRyxDQUFDO2dDQUN6RyxzQkFBTyxJQUFJLEVBQUM7OztnQ0FHWixzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7Ozs7O1FBV2IsNkNBQXNCOzs7Ozs7OztzQkFBQyxPQUFxQixFQUFFLFFBQWdCLEVBQUUsWUFBd0IsRUFBRSxTQUFtQjs7Z0JBQ2hILElBQUksV0FBVyxHQUFlLFlBQVksQ0FBQzs7Z0JBQzNDLElBQUksb0JBQW9CLENBQXNCOztnQkFDOUMsSUFBSSxtQkFBbUIsQ0FBZTtnQkFDdEMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRWhELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzVGLElBQUksY0FBYyxFQUFFO29CQUNoQixjQUFjLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO29CQUM3RCxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDOUcsY0FBYyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDckc7cUJBQU07b0JBQ0gsb0JBQW9CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO29CQUNqRCxvQkFBb0IsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO29CQUN6QyxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDO29CQUMxRCxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDO29CQUMxRCxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3JHLG9CQUFvQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEcsb0JBQW9CLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUV4RyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7aUJBQzlEO2dCQUNELFlBQVksR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ25FLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7OztRQVEzQixrREFBMkI7Ozs7OztZQUEzQixVQUE0QixvQkFBeUMsRUFBRSxZQUF3Qjs7Z0JBQzNGLElBQUksY0FBYyxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxJQUFJLG9CQUFvQixDQUFDLFVBQVUsR0FBQSxDQUFDLENBQUM7Z0JBQ2pILElBQUksY0FBYyxFQUFFO29CQUNoQixjQUFjLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztvQkFDNUIsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7aUJBQzVCO2dCQUNELFlBQVksR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ25FLE9BQU8sWUFBWSxDQUFDO2FBQ3ZCOzs7Ozs7Ozs7O1FBTUQsdURBQWdDOzs7OztZQUFoQyxVQUFpQyxXQUF1QjtnQkFDcEQsV0FBVyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLG9CQUFvQjtvQkFDbEcsT0FBTyxJQUFJLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDO2lCQUM1QyxFQUFFLENBQUMsQ0FBQyxDQUFBO2dCQUNMLE9BQU8sV0FBVyxDQUFDO2FBQ3RCOzs7Ozs7Ozs7Ozs7UUFPRCw4Q0FBdUI7Ozs7OztZQUF2QixVQUF3Qix1QkFBbUQsRUFBRSxPQUFxQjs7Z0JBQzlGLElBQUksY0FBYyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUEsQ0FBQyxDQUFDO2dCQUN0RyxPQUFPLGNBQWMsQ0FBQzthQUN6Qjs7Ozs7Ozs7Ozs7O1FBT0QsMENBQW1COzs7Ozs7WUFBbkIsVUFBb0IsZUFBZSxFQUFFLGlCQUE2Qjs7Z0JBQzlELElBQUksUUFBUSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxJQUFJLGVBQWUsQ0FBQyxVQUFVLEdBQUEsQ0FBQyxDQUFDO2dCQUM3RixJQUFJLFFBQVEsRUFBRTtvQkFDVixRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7d0JBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7NEJBQ3BCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO3lCQUNuQjtxQkFDSixDQUFDLENBQUM7b0JBRUgsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO3dCQUM3QixHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFDZCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztxQkFDaEIsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7Ozs7Ozs7Ozs7UUFNRCxnREFBeUI7Ozs7O1lBQXpCLFVBQTBCLFdBQXVCOztnQkFDN0MsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDOztnQkFDbkIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDOztnQkFDaEUsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRTVFLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFILElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtvQkFDakIsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ3hEO3lCQUNJO3dCQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ3pEO2lCQUNKO2dCQUVELE9BQU8sV0FBVyxDQUFDO2FBQ3RCOzs7Ozs7Ozs7O1FBTUQsOENBQXVCOzs7OztZQUF2QixVQUF3QixXQUF1Qjs7Z0JBQzNDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztnQkFDeEIsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHOztvQkFDekIsSUFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsY0FBYyxJQUFJLFlBQVksR0FBQSxDQUFDLENBQUM7b0JBQ3pFLElBQUksWUFBWSxFQUFFO3dCQUNkLGVBQWUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7cUJBQzFDO2lCQUNKLENBQUMsQ0FBQztnQkFFSCxPQUFPLGVBQWUsQ0FBQzthQUMxQjs7Ozs7Ozs7OztRQU1ELG9EQUE2Qjs7Ozs7WUFBN0IsVUFBOEIsV0FBdUI7O2dCQUNqRCxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztnQkFDOUIsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO29CQUN6QixHQUFHLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7d0JBQ3hCLHFCQUFxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztxQkFDdkMsQ0FBQyxDQUFDO2lCQUNOLENBQUMsQ0FBQztnQkFFSCxPQUFPLHFCQUFxQixDQUFDO2FBQ2hDOzs7Ozs7Ozs7Ozs7UUFPRCw2Q0FBc0I7Ozs7OztZQUF0QixVQUF1QixVQUFrQixFQUFFLFdBQXVCOzs7Z0JBQzlELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7b0JBQ25CLEtBQWdCLElBQUEsS0FBQUEsU0FBQSxXQUFXLENBQUMsS0FBSyxDQUFBLGdCQUFBLDRCQUFFO3dCQUE5QixJQUFJLEdBQUcsV0FBQTs7NEJBQ1IsS0FBZ0IsSUFBQSxLQUFBQSxTQUFBLEdBQUcsQ0FBQyxZQUFZLENBQUEsZ0JBQUEsNEJBQUU7Z0NBQTdCLElBQUksR0FBRyxXQUFBO2dDQUNSLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtvQ0FDaEIsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztpQ0FDaEM7cUNBQ0k7b0NBQ0QsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztpQ0FDaEM7Z0NBQ0QsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0NBQ3RDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0NBQ2QsTUFBTTs2QkFDVDs7Ozs7Ozs7Ozs7Ozs7O3dCQUNELElBQUksTUFBTSxFQUFFOzRCQUNSLE1BQU07eUJBQ1Q7cUJBQ0o7Ozs7Ozs7Ozs7Ozs7OzthQUNKOzs7Ozs7Ozs7Ozs7UUFPRCw4Q0FBdUI7Ozs7OztZQUF2QixVQUF3QixVQUFrQixFQUFFLFdBQXVCOzs7Z0JBQy9ELElBQUksaUJBQWlCLENBQWtCOztvQkFDdkMsS0FBZ0IsSUFBQSxLQUFBQSxTQUFBLFdBQVcsQ0FBQyxLQUFLLENBQUEsZ0JBQUEsNEJBQUU7d0JBQTlCLElBQUksR0FBRyxXQUFBO3dCQUNSLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLGNBQWMsSUFBSSxZQUFZLEdBQUEsQ0FBQyxDQUFDO3dCQUMxRSxJQUFJLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTs0QkFDbkQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO2dDQUNoQixpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7NkJBQzFFO2lDQUNJO2dDQUNELGlCQUFpQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs2QkFDMUU7NEJBQ0QsTUFBTTt5QkFDVDtxQkFDSjs7Ozs7Ozs7Ozs7Ozs7O2FBQ0o7Ozs7Ozs7OztRQUVNLGtEQUEyQjs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDMUYsVUFBb0IsRUFBRSxXQUFxQjtnQkFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtvQkFDNUYsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsR0FBRztvQkFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzlDLENBQUMsQ0FBQzs7MkJBcHVFZjtRQXV1RUM7Ozs7OztBQ3B1RUQsUUFBQTs7Ozs7Ozs7Ozs7UUFHVyw0QkFBWTs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFNBQWMsRUFDL0UsVUFBb0IsRUFBRSxXQUFxQjtnQkFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRXBGLElBQUksV0FBVyxDQUFDO29CQUNoQixXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7d0JBQ2pELFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3RFO29CQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7O29CQUVDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNsQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O1FBVUosK0JBQWU7Ozs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUM3RSxVQUFvQixFQUFFLFdBQXFCO2dCQUMzQyxhQUFhLENBQUMsYUFBYSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFFbEYsSUFBSSxXQUFXLENBQUM7b0JBQ2hCLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ25CLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDbkQsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDMUU7b0JBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQUlKLDZCQUFhOzs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsU0FBYyxFQUNoRixVQUFvQixFQUFFLFdBQXFCOztnQkFHM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRXJGLElBQUksUUFBUSxDQUFDO29CQUNiLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBRWhCLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDL0MsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDbEU7b0JBRUQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSTt3QkFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7NEJBQy9CLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUNsQztxQkFDSixDQUFDLENBQUM7b0JBR0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN4QixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQU1KLHFDQUFxQjs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFlBQWlCLEVBQzNGLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRTNHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O29CQUV2QixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQixDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFLSiwrQkFBZTs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFlBQWlCLEVBQ3JGLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTNDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7b0JBRXJHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEIsRUFDRyxVQUFBLEdBQUc7b0JBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O29CQUV2QixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQixDQUFDLENBQUM7OztvQkExR2Y7UUE2R0M7Ozs7OztRQ3hHRDs7UUFPSSw0QkFBWSxVQUFlLEVBQUUsVUFBa0I7b0NBSFosSUFBSTs7WUFJbkMsSUFBSSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQTtZQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUN2Qjs7Ozs7O1FBR1ksNENBQWU7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsUUFBZ0I7Ozs7Ozs7Z0NBRW5FLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO2dDQUN2QixpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0NBRS9DLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7cUNBQy9DLENBQUMsV0FBVztvQ0FBWix3QkFBWTtnQ0FDRyxxQkFBTSxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEVBQUE7O2dDQUF2RixXQUFXLEdBQUcsU0FBeUUsQ0FBQztnQ0FDeEYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQTs7O2dDQUdwRCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDOztnQ0FFbEMsc0JBQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFDOzs7Z0NBRTdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBRSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7UUFPakIsa0RBQXFCOzs7Ozs7c0JBQUMsT0FBVyxFQUFFLFVBQWtCO2dCQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDOzs7Ozs7OztRQU1yRSx3REFBMkI7Ozs7OztzQkFBQyxPQUFXLEVBQUUsVUFBa0I7Z0JBQzlELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZCLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQzs7Ozs7Ozs7UUFNdEQsaURBQW9COzs7Ozs7c0JBQUMsVUFBa0I7O2dCQUMxQyxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQzs7Z0JBQzlELElBQUksUUFBUSxDQUFLO2dCQUNqQixJQUFHLFFBQVEsRUFBQztvQkFDUixRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxRQUFRLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sSUFBSSxDQUFDOzs7Ozs7UUFHVCx1REFBMEI7Ozs7c0JBQUMsVUFBa0I7O2dCQUNoRCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQzs7Z0JBQy9ELElBQUksUUFBUSxDQUFLO2dCQUNqQixJQUFHLFFBQVEsRUFBQztvQkFDUixRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxRQUFRLENBQUM7aUJBQ25CO2dCQUNELE9BQU8sSUFBSSxDQUFDOzs7Ozs7UUFJVCx3Q0FBVzs7OztzQkFBQyxXQUE4Qjs7Z0JBRTdDLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFO29CQUU1RyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTs7NEJBQzFILEtBQW1CLElBQUEsS0FBQUEsU0FBQSxXQUFXLENBQUMsV0FBVyxDQUFBLGdCQUFBLDRCQUFFO2dDQUF2QyxJQUFNLElBQUksV0FBQTtnQ0FDWCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDOzs2QkFFOUI7Ozs7Ozs7Ozs7Ozs7OztxQkFDSjtpQkFDSjs7Ozs7O1FBS0UsNENBQWU7Ozs7c0JBQUMsV0FBOEI7O2dCQUNqRCxJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7Z0JBQzNCLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDM0IsSUFBRzt3QkFDQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDckMsUUFBUSxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRTs0QkFDOUMsS0FBSyxTQUFTO2dDQUNWLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO2dDQUM5RSxNQUFNOzRCQUNWLEtBQUssV0FBVztnQ0FDWixLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQ0FDekcsTUFBTTs0QkFDVixLQUFLLFNBQVM7Z0NBQ1YsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dDQUNuRixNQUFNOzRCQUNWLEtBQUssS0FBSztnQ0FDTixLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQ0FDckcsTUFBTTs0QkFDVjtnQ0FDSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQ0FDM0ksTUFBTTt5QkFDYjtxQkFDSjtvQkFBQSxPQUFPLEVBQUUsRUFBQzt3QkFDUCxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQTtxQkFDaEM7aUJBQ0o7Z0JBQ0QsSUFBRyxLQUFLLEVBQUM7b0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUM7b0JBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2pDO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7O1FBR1Ysb0NBQU87Ozs7O3NCQUFDLE1BQU0sRUFBRSxNQUFNO2dCQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUU7b0JBQ2xCLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2dCQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7O1FBSUosa0RBQXFCOzs7OztzQkFBQyxhQUE0QixFQUFFLFFBQWdCOzs7Ozs7O2dDQUV6RSxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQ0FDdkIsaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dDQUUvQyxXQUFXLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxDQUFDO3FDQUNyRCxDQUFDLFdBQVc7b0NBQVosd0JBQVk7Z0NBQ0cscUJBQU0saUJBQWlCLENBQUMseUJBQXlCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxFQUFBOztnQ0FBeEYsV0FBVyxHQUFHLFNBQTBFLENBQUM7Z0NBQ3pGLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUMsUUFBUSxDQUFDLENBQUE7O29DQUcxRCxzQkFBTyxXQUFXLEVBQUM7OztnQ0FFbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFFLENBQUMsQ0FBQzs7Ozs7OztpQ0FqSjVCO1FBcUpDOzs7Ozs7QUNySkQsUUFBQTs7OzRCQUFBO1FBU0M7Ozs7OztBQ1RELFFBR0E7O3lCQVFtQixJQUFJLFlBQVksRUFBRTs7MkJBWHJDO1FBZ0JDOzs7Ozs7QUNoQkQsUUFBQTs7OytCQUFBO1FBR0M7Ozs7OztBQ0FELFFBQUE7OzBCQVdvQixJQUFJLEtBQUssRUFBVTs7MEJBZHZDO1FBa0JDOzs7Ozs7QUNoQkQsUUFBQTs7O2dDQUZBO1FBU0M7Ozs7OztBQ1BELFFBQUE7OzsyQkFGQTtRQVdDOzs7Ozs7QUNYRCxRQUFBOzs7OEJBQUE7UUFNQzs7Ozs7O0FDSkQsUUFBQTs7a0NBVW1DLEtBQUs7NEJBQ1gsS0FBSztrQ0FFQyxLQUFLOzhCQUNULEtBQUs7O3lCQWhCcEM7UUFvQkM7Ozs7OztBQ2pCRCxRQUFBO1FBR0ksNEJBQVksWUFBeUI7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7U0FDckM7Ozs7UUFFTSx5Q0FBWTs7OztnQkFDZixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7UUFHN0Msd0NBQVc7Ozs7Z0JBQ2QsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7Ozs7O1FBRzVDLG9DQUFPOzs7O2dCQUNWLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7OztRQUd4QyxtQ0FBTTs7OztnQkFDVCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O1FBSXRDLG1EQUFzQjs7OztzQkFBQyxRQUFnQjtnQkFDM0MsSUFBSTs7b0JBQ0EsSUFBSSxVQUFVLEdBQXFCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLEdBQUEsQ0FBQyxDQUFDO29CQUM3RyxJQUFJLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTt3QkFDaEQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO3FCQUMzQjtvQkFDRCxPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBQUEsV0FBSztvQkFDRixPQUFPLEtBQUssQ0FBQztpQkFDaEI7O2lDQXBDVDtRQXdDQzs7Ozs7O1FDN0JEO1FBVUkscUJBQVksVUFBa0IsRUFBRSxXQUF1QixFQUFFLFdBQWdCLEVBQUUsU0FBa0I7NkJBTmpFLEdBQUc7OEJBQ1YsSUFBSSxVQUFVLEVBQUU7NkJBSVQsS0FBSztZQUU3QixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztZQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztTQUM5Qjs7OztRQUVNLDBDQUFvQjs7OztnQkFDdkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Ozs7Ozs7OztRQUlwQixxQ0FBZTs7Ozs7OztzQkFBQyxlQUErQixFQUFFLGFBQTRCLEVBQUUsUUFBYSxFQUFFLFNBQWM7Ozs7OztnQ0FDckgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FFMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7b0NBQ2QsR0FBRyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7aUNBQ3hCO3FDQUNJO29DQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQ0FDdkM7Z0NBQ0csTUFBTSxHQUFrQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUU5QixxQkFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUE7O2dDQUFsRyxPQUFPLEdBQUcsU0FBd0Y7Z0NBRXRHLHNCQUFPLE9BQU8sRUFBQzs7Ozs7Ozs7Ozs7Ozs7O1FBVU4saURBQTJCOzs7Ozs7Ozs7O3NCQUFDLGVBQStCLEVBQUUsYUFBNEIsRUFBRSxRQUFhLEVBQUUsTUFBcUIsRUFBRSxZQUFnQyxFQUFFLE1BQW9CO2dCQUF0RCw2QkFBQTtvQkFBQSxtQkFBZ0M7O2dCQUFFLHVCQUFBO29CQUFBLFlBQW9COzs7Ozs7O2dDQUU1TCxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQ0FDdEIsS0FBSyxHQUFHLENBQUMsQ0FBQztnQ0FFVixpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0NBQzNDLGFBQWEsR0FBRyxJQUFJLFlBQVksQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQ0FFdEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0NBRVQsQ0FBQyxHQUFHLENBQUM7OztzQ0FBRSxDQUFDLEdBQUcsS0FBSyxDQUFBOztnQ0FDakIsSUFBSSxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztxQ0FDekIsSUFBSTtvQ0FBSix3QkFBSTtnQ0FFSixXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQ0FDbkMsSUFBSSxDQUFDLFNBQVM7b0NBQWQsd0JBQWM7Z0NBQ1YsSUFBSSxHQUFHLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7Z0NBQ2xGLHFCQUFNLGlCQUFpQixDQUFDLDhCQUE4QixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsRUFBQTs7Z0NBQWhILE9BQU8sR0FBRyxTQUFzRyxDQUFDOzs7Z0NBRWpILE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0NBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztzQ0FDcEQsWUFBWSxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUE7b0NBQXhDLHdCQUF3QztnQ0FDOUIscUJBQU0saUJBQWlCLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBQTs7Z0NBQXRKLE9BQU8sR0FBRyxTQUE0SSxDQUFDOztvQ0FHN0kscUJBQU0saUJBQWlCLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFBOztnQ0FBbEksT0FBTyxHQUFHLFNBQXdILENBQUM7OztnQ0FJM0ksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztnQ0FDN0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQzs7O2dDQUV4RixLQUFLLEVBQUUsQ0FBQztnQ0FDUixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO2dDQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQTs7O2dDQXhCdEMsQ0FBQyxFQUFFLENBQUE7O3FDQTBCOUIsc0JBQU8sSUFBSSxDQUFDLFVBQVUsRUFBQzs7Ozs7Ozs7OztRQUlwQix1Q0FBaUI7Ozs7O3NCQUFDLE9BQXFCLEVBQUUsV0FBdUI7Z0JBQ25FLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7b0JBQzFELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO29CQUNuRSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBQSxpQkFBaUI7d0JBQzdFLGlCQUFpQixDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO3FCQUNoRCxDQUFDLENBQUM7aUJBQ047Ozs7Ozs7Ozs7UUFJRSx1Q0FBaUI7Ozs7Ozs7O3NCQUFDLE9BQXFCLEVBQUUsV0FBdUIsRUFBRSxhQUEyQixFQUFFLFFBQWEsRUFBRSxZQUFnQztnQkFBaEMsNkJBQUE7b0JBQUEsbUJBQWdDOzs7Z0JBQ2pKLElBQUksWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLFlBQVksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztnQkFDOUMsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO29CQUN4QixZQUFZLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7aUJBQ3BEO2dCQUNELFlBQVksR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO29CQUduQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7b0JBRTVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUUvQztxQkFBTTtvQkFDSCxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQzdHO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7OztRQU9oQyx1Q0FBaUI7Ozs7O3NCQUFDLFdBQXVCO2dCQUM1QyxJQUFJOztvQkFDQSxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFBO29CQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ3ZDLElBQUksYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRTs0QkFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQWdCLENBQUM7eUJBQzdEO3dCQUNELGFBQWEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzt3QkFDN0MsYUFBYSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7cUJBQ3JEO2lCQUNKO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtvQkFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtpQkFDbEI7Ozs7Ozs7UUFPRSwrQ0FBeUI7Ozs7O3NCQUFDLFdBQXVCO2dCQUNwRCxJQUFJOztvQkFDQSxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO29CQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ3RDLElBQUksY0FBYyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRTs0QkFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQWlCLENBQUM7eUJBQzlEO3dCQUNELGNBQWMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDdkMsY0FBYyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUN2QyxjQUFjLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7d0JBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDdEQ7aUJBQ0o7Z0JBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO29CQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2lCQUNsQjs7Ozs7OztRQU9FLHNDQUFnQjs7Ozs7c0JBQUMsV0FBdUI7Z0JBQzNDLElBQUk7O29CQUNBLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUE7b0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzt3QkFDdEMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO3dCQUU3QyxnQkFBZ0IsQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzt3QkFDdkQsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O3FCQUV4RjtpQkFDSjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUE7b0JBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUJBQ2xCOzs7Ozs7UUFLRSwrQkFBUzs7OztzQkFBQyxTQUFjO2dCQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQzs7Ozs7O1FBTWxDLG1DQUFhOzs7O3NCQUFDLElBQVk7Z0JBQzdCLElBQUk7O29CQUNBLElBQUksV0FBVyxHQUFlLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDOztvQkFDbEosSUFBSSxPQUFPLEdBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUV4RCxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7d0JBQzdDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUM5Qzt5QkFBTTt3QkFDSCxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDOUM7b0JBRUQsT0FBTyxXQUFXLENBQUM7aUJBQ3RCO2dCQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsMENBQTBDLENBQUMsQ0FBQztvQkFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEIsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7Ozs7Ozs7UUFPRSxvQ0FBYzs7Ozs7c0JBQUMsT0FBc0I7O2dCQUN4QyxJQUFJLFFBQVEsR0FBZSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzs7Z0JBQ3BELElBQUksV0FBVyxHQUFlLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUVsSixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDdEMsUUFBUSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTt3QkFDMUIsS0FBSyxVQUFVOzRCQUNYLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUN0RCxNQUFNO3dCQUNWLEtBQUssUUFBUTs0QkFDVCxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDcEQsTUFBTTt3QkFDVixLQUFLLEtBQUs7NEJBQ04sV0FBVyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUNoRCxNQUFNO3dCQUNWLEtBQUssVUFBVTs7NEJBQ1gsSUFBSSxHQUFHLEdBQUcsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDOzRCQUN2RixXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDaEMsTUFBTTt3QkFDVixLQUFLLE9BQU87OzRCQUNSLElBQUksS0FBSyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzs0QkFDekYsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzlCLE1BQU07d0JBQ1YsS0FBSyxhQUFhOzs0QkFDZCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs0QkFDMUMsSUFBSSxJQUFJLEdBQVcsR0FBRyxDQUFDOzs0QkFDdkIsSUFBSSxJQUFJLENBQVM7NEJBRWpCLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dDQUM5QixJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDM0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQzlCO2lDQUFNO2dDQUNILElBQUksR0FBRyxLQUFLLENBQUM7NkJBQ2hCOzs0QkFFRCxJQUFJLE9BQU8sR0FBRyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOzRCQUMvRSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDbkMsTUFBTTt3QkFDVjs0QkFDSSxNQUFNO3FCQUNiO2lCQUNKO2dCQUNELE9BQU8sV0FBVyxDQUFDOzs7Ozs7O1FBT2hCLG9DQUFjOzs7OztzQkFBQyxPQUFzQjs7Z0JBQ3hDLElBQUksV0FBVyxHQUFlLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDOztnQkFHbEosSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtvQkFDckIsV0FBVyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hDO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RDO2dCQUVELElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3BDO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLFdBQVcsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN2QztnQkFDRCxPQUFPLFdBQVcsQ0FBQzs7MEJBclMzQjtRQXlTQzs7Ozs7O1FDL1JEOzs7Ozs7Ozs7Ozs7O1FBV2lCLGtFQUFrQzs7Ozs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsV0FBbUIsRUFDaEgsS0FBSyxFQUFFLElBQUksRUFBRSxlQUEyQjs7Ozs7O2dDQUVwQyxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUE7Z0NBQ2hDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO2dDQUNoQyxTQUFTLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQzs7OztnQ0FHdEIsY0FBYyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0NBQ3ZDLHFCQUFNLGNBQWMsQ0FBQyxtQ0FBbUMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFBOztnQ0FBckgsbUJBQW1CLEdBQUcsU0FBK0YsQ0FBQzs7Z0NBR3RILG1CQUFtQixDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7Z0NBQzlELG1CQUFtQixDQUFDLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUM7Z0NBRTdELHFCQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxFQUFBOztnQ0FBM0ksSUFBSSxHQUFHLFNBQW9JLENBQUM7Ozs7Z0NBSXJJLHFCQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxFQUFBOztnQ0FBakgsSUFBSSxHQUFHLFNBQTBHLENBQUM7O29DQUV0SCxzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7Ozs7OztRQVdILDREQUE0Qjs7Ozs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFNBQWlCLEVBQ3JGLEtBQVUsRUFBRSxJQUFTLEVBQUUsU0FBdUIsRUFBRSxlQUEyQjs7Ozs7O2dDQUczRSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQ0FDaEQsYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0NBQ3hELFFBQVEsR0FBRyxhQUFhLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQ0FDaEcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7O2dDQUd2QyxRQUFRLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztnQ0FDOUIsUUFBUSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7Z0NBRWxCLHFCQUFNLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBQTs7Z0NBQXRHLFVBQVUsR0FBRyxTQUF5RjtnQ0FDMUcsc0JBQU8sVUFBVSxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7O1FBWVQsaUVBQWlDOzs7Ozs7Ozs7OztzQkFBQyxhQUE0QixFQUFFLFVBQXNCLEVBQUUsU0FBaUIsRUFDbEgsS0FBVSxFQUFFLElBQVMsRUFBRSxTQUF1QixFQUFFLGVBQTJCOzs7Ozs7O2dDQUczRSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQ0FDaEQsYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0NBRXhELFFBQVEsR0FBRyxhQUFhLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQ0FDdEcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0NBRXRCLHFCQUFNLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBQTs7Z0NBQXRHLFVBQVUsR0FBRyxTQUF5RjtnQ0FDMUcsc0JBQU8sVUFBVSxFQUFDOzs7Ozs7Ozs7UUFHdEIsOENBQWM7Ozs7WUFBZCxVQUFlLGVBQTJCOztnQkFDdEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUNuQyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztvQkFDckIsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFBO2lCQUNuQyxDQUFDLENBQUE7Z0JBQ0YsT0FBTyxZQUFZLENBQUM7YUFDdkI7b0NBckdMO1FBdUdDOzs7Ozs7QUNyR0QsUUFBQTs7Ozs7Ozs7Ozs7OztRQUlXLHVDQUFlOzs7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUMsU0FBaUIsRUFBRSxVQUFpQixFQUFFLFVBQWlCLEVBQ3ZHLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO2dCQUN2RCxhQUFhLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztvQkFHakksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuQixFQUNHLFVBQUEsR0FBRzs7b0JBRUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNyQixDQUFHLENBQUM7OzRCQWhCakI7UUFtQkM7Ozs7OztBQ25CRCxRQUFBOzs7a0NBQUE7UUFJQzs7Ozs7O0FDSkQsUUFBQTs7OytCQUFBO1FBV0M7Ozs7OztBQ1hELFFBQUE7Ozs4QkFBQTtRQU1DOzs7Ozs7QUNIRCxRQUFBOzt1Q0FJaUMsSUFBSSxLQUFLLEVBQXVCOzBCQUd0QyxTQUFTOzs0QkFWcEM7UUFXQzs7Ozs7O0FDVEQsUUFBQTs7Ozs7Ozs7Ozs7O1FBVVcsNERBQW1DOzs7Ozs7Ozs7c0JBQUMsYUFBNEIsRUFBRSxRQUFnQixFQUFFLElBQVMsRUFDaEcsU0FBbUIsRUFBRSxZQUFzQjs7Z0JBRzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMseUNBQXlDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O29CQUNwRyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOztvQkFDMUMsSUFBSSxZQUFZLENBQVk7b0JBQzVCLElBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUM7d0JBQy9CLFlBQVksR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO3dCQUNoQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzFDO3lCQUFJO3dCQUNILFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztxQkFDdEM7b0JBRUQsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN6QixFQUNDLFVBQUEsR0FBRztvQkFDRCxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDakMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O1FBR0Esd0NBQWU7Ozs7Ozs7O3NCQUFDLGFBQTRCLEVBQUUsUUFBZ0IsRUFBRSxJQUFTLEVBQzlFLFNBQW1CLEVBQUUsWUFBc0I7O2dCQUczQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUNoRixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2pCLEVBQ0MsVUFBQSxHQUFHO29CQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbkIsQ0FBQyxDQUFDOzs2QkExQ2I7UUE0Q0M7Ozs7OztBQzVDRDtRQWVJOzRCQUhzQyxJQUFJRixlQUFZLEVBQUU7WUFJcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7O2dCQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1NBQ0o7Ozs7UUFJTSxtREFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7O1FBR1QsNEJBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7OztRQUkxQixvQ0FBVzs7Ozs7c0JBQUMsRUFBVSxFQUFFLFFBQWE7O2dCQUN4QyxRQUFRLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFFbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07b0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztvQkFDOUMsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUM1QixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0QyxFQUFFLFVBQUEsS0FBSztvQkFDSixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTt3QkFDdkIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3hCLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ3RDO3lCQUFNO3dCQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTs0QkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNqQixDQUFDLENBQUM7cUJBQ047aUJBQ0osQ0FBQyxDQUFDOzs7OztRQWFBLHFDQUFZOzs7O2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Ozs7O1FBR3JCLDBDQUFpQjs7OztnQkFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Ozs7O1FBR2pFLG1DQUFVOzs7O2dCQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFHbEQsaURBQXdCOzs7O2dCQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7Ozs7OztRQUduRCxnQ0FBTzs7OztzQkFBQyxVQUFtQjs7Z0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUEsUUFBUTtvQkFDakMsVUFBVSxDQUFDOzt3QkFDUCxJQUFJLE1BQU0sR0FBRyxLQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQzt3QkFDL0MsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEdBQUcsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQzlFLFVBQVUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDO3FCQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNaLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO29CQUNsQixVQUFVLENBQUMsRUFBQyxNQUFNLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO29CQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQixDQUFDLENBQUM7Ozs7O1FBRUEsc0NBQWE7Ozs7O2dCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU87b0JBQ3RELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHO3dCQUM3RSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDOUQsQ0FBQyxDQUFDO2lCQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxVQUFVO29CQUNkLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzdDLENBQUMsQ0FBQzs7Ozs7O1FBR0EsK0JBQU07Ozs7c0JBQUMsS0FBYTs7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07b0JBQ2hDLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDLENBQUMsQ0FBQzs7O29CQTVHVkgsYUFBVSxTQUFDO3dCQUNSLFVBQVUsRUFBRSxNQUFNO3FCQUNyQjs7Ozs7NkJBUkQ7Ozs7Ozs7QUNBQTtRQWdCSSxzQkFBbUIsaUJBQWtDO1lBQWxDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBaUI7NEJBSGYsSUFBSUcsZUFBWSxFQUFFO2tDQXFJakM7YUFFdEI7WUFuSUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7O2dCQUN0QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEdBQUcsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1NBQ0o7Ozs7UUFHTSxpREFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7O1FBR1QsMEJBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7OztRQUkxQixrQ0FBVzs7Ozs7c0JBQUMsRUFBVSxFQUFFLFFBQWE7O2dCQUN4QyxRQUFRLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFFbEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07b0JBQzNCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDNUIsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDdEMsRUFBRSxVQUFBLEtBQUs7b0JBQ0osSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRTt3QkFDdkIsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztxQkFDdkQ7eUJBQU07d0JBQ0gsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNOzRCQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ2pCLENBQUMsQ0FBQztxQkFDTjtpQkFDSixDQUFDLENBQUM7Ozs7OztRQUdBLDhCQUFPOzs7O3NCQUFDLFVBQW1COztnQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQSxRQUFRO29CQUNqQyxVQUFVLENBQUM7O3dCQUNQLElBQUksTUFBTSxHQUFHLEtBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO3dCQUMvQyxLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDOUUsVUFBVSxDQUFDLEVBQUMsTUFBTSxFQUFDLElBQUksRUFBQyxDQUFDLENBQUM7cUJBQzdCLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ1osQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUc7b0JBQ2xCLFVBQVUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7b0JBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BCLENBQUMsQ0FBQzs7Ozs7UUFHQSxvQ0FBYTs7OztnQkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Ozs7UUFHbkIsb0NBQWE7Ozs7Z0JBQ2hCLElBQUk7O29CQUNBLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO29CQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDakY7Z0JBQUMsV0FBSztpQkFFTjs7Ozs7UUFJRSx3Q0FBaUI7Ozs7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUdqRSxpQ0FBVTs7OztnQkFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Ozs7O1FBR2xELG9DQUFhOzs7OztnQkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxPQUFPO29CQUN0RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRzt3QkFDN0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQzlELENBQUMsQ0FBQztpQkFDTixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsVUFBVTtvQkFDZCxPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3QyxDQUFDLENBQUM7Ozs7Ozs7OztRQVFBLG9DQUFhOzs7Ozs7O3NCQUFDLE9BQWM7OztnQkFHL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQTtnQkFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxPQUFPO29CQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN0QixLQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE9BQU87d0JBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFBO3dCQUM3RCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQTt3QkFDdkUsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO3dCQUM5RixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO3FCQUN4SCxDQUFDLENBQUM7b0JBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTyxHQUFBLENBQUM7eUJBQzNKLEdBQUcsQ0FBRSxVQUFBLEdBQUc7O3dCQUVMLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUM5RCxDQUFDLENBQUM7aUJBQ04sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLFVBQVU7b0JBRWQsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDN0MsQ0FBQyxDQUFDOzs7Ozs7UUFJQSxtQ0FBWTs7OztzQkFBQyxZQUFpQjtnQkFDakMsSUFBSTs7b0JBQ0EsSUFBSSxNQUFNLENBQWE7b0JBQ3ZCLE1BQU0sR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRTVFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO2lCQUN6RjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQjs7Ozs7O1FBUUUsNkJBQU07Ozs7c0JBQUMsS0FBYTs7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07b0JBQ2hDLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3ZDLENBQUMsQ0FBQzs7O29CQW5KVkgsYUFBVSxTQUFDO3dCQUNSLFVBQVUsRUFBRSxNQUFNO3FCQUNyQjs7Ozs7d0JBTFFXLHFCQUFnQjs7OzsyQkFKekI7Ozs7Ozs7O1FDVUksMEJBQW9CLGVBQStCO1lBQS9CLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtTQUVsRDs7Ozs7Ozs7O1FBUU0sd0NBQWE7Ozs7Ozs7O3NCQUFDLFFBQVEsRUFBRSxTQUFpQixFQUFFLHNCQUFnQyxFQUFFLHlCQUFtQzs7Z0JBQ25ILElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7b0JBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRWYsc0JBQXNCLENBQUMsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDMUUsRUFBRSxVQUFBLEtBQUs7b0JBQ0oseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCLENBQUMsQ0FBQzs7Ozs7Ozs7UUFRQSwyQ0FBZ0I7Ozs7OztzQkFBQyxTQUFpQixFQUFFLFVBQXNCO2dCQUM3RCxJQUFJO29CQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3hCLElBQUksU0FBUyxJQUFJLEVBQUUsRUFBRTt3QkFDakIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDOzRCQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNmLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQ0FDWixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNO29DQUNsQixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxDQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQ0FDNUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUyxHQUFBLENBQUMsSUFBSSxJQUFJLENBQUE7NkJBQ2hFO2lDQUFNO2dDQUNILE9BQU8sS0FBSyxDQUFDOzZCQUNoQjt5QkFDSixDQUFDLENBQUM7d0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDM0IsQUFDQTtpQkFDSjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7b0JBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2hCLE9BQU8sVUFBVSxDQUFDO2lCQUNyQjtnQkFFRCxPQUFPLFVBQVUsQ0FBQzs7Ozs7O1FBR2Ysd0NBQWE7Ozs7c0JBQUMsR0FBVTtnQkFDM0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQVNsQyxrREFBdUI7Ozs7Ozs7O3NCQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsZUFBeUIsRUFBRSxrQkFBNEI7O2dCQUNuRyxJQUFJLEtBQUssQ0FBQTtnQkFDVCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO29CQUN2QyxJQUFJO3dCQUNBLEtBQUssR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7d0JBQzNCLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUEsQ0FBQyxDQUFDO3dCQUNsSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzFCO29CQUFDLFdBQUs7d0JBQ0gsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7d0JBQ3pCLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDMUI7aUJBRUosRUFBRSxVQUFBLEtBQUs7b0JBQ0osa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3RCLENBQUMsQ0FBQzs7Ozs7Ozs7OztRQVNBLHlDQUFjOzs7Ozs7OztzQkFBQyxRQUFnQixFQUFFLGNBQXNCLEVBQUUsaUJBQW1DLEVBQUUsU0FBbUI7O2dCQUVwSCxJQUFJLFlBQVksQ0FBQzs7Z0JBQ2pCLElBQUksbUJBQW1CLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztnQkFDbEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO29CQUNyRCxZQUFZLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQzFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFFM0IsRUFBRSxVQUFBLEtBQUs7b0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEIsQ0FBQyxDQUFDOzs7Ozs7OztRQWlDTSxvREFBeUI7Ozs7OztzQkFBQyxRQUFnQixFQUFFLEtBQUs7Ozs7Ozs7Z0NBSWxELEdBQUcsR0FBRyxXQUFXLENBQUM7Z0NBQ1gscUJBQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUE7O2dDQUE5QyxRQUFRLEdBQUcsU0FBbUMsQ0FBQztnQ0FDL0MsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFO29DQUNuRCxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQ0FDNUQ7cUNBQU07b0NBQ0gsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO2lDQUM1QztnQ0FFRyxXQUFXLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxHQUFBLENBQUMsRUFBRSxFQUFFLENBQUM7Z0NBQzFGLHNCQUFPLFdBQVcsRUFBQzs7O2dDQUVuQixzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7b0JBcEp2QlgsYUFBVSxTQUFDO3dCQUNSLFVBQVUsRUFBRSxNQUFNO3FCQUNyQjs7Ozs7d0JBUFEsY0FBYzs7OzsrQkFEdkI7Ozs7Ozs7O0lDUUEsSUFBTUksUUFBTSxHQUFHLE9BQU8sQ0FBQzs7O1FBUW5CLDJCQUFvQixlQUErQixFQUFVLGNBQTZCLEVBQzlFO1lBRFEsb0JBQWUsR0FBZixlQUFlLENBQWdCO1lBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWU7WUFDOUUsa0JBQWEsR0FBYixhQUFhO2tDQXNHRDthQUV2QjtTQXRHQTs7Ozs7Ozs7UUFRTSwwQ0FBYzs7Ozs7OztzQkFBQyxFQUFFLEVBQUUsd0JBQWtDLEVBQUUsMkJBQXFDOzs7Z0JBRS9GLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU87O29CQUVyQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDckMsRUFBRSxVQUFBLEtBQUs7OztvQkFFSixLQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLHdCQUF3QixFQUFFLDJCQUEyQixDQUFDLENBQUM7aUJBQ3pGLENBQUMsQ0FBQzs7Ozs7Ozs7UUFJQSxpREFBcUI7Ozs7OztzQkFBQyxFQUFFLEVBQUUsd0JBQWtDLEVBQUUsMkJBQXFDOzs7Z0JBR3RHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE9BQU87b0JBQ25DLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNyQyxFQUFFLFVBQUEsS0FBSztvQkFDSiwyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7UUFTQSxzQ0FBVTs7Ozs7OztzQkFBQyxRQUFnQixFQUFFLFlBQXdCLEVBQUUsd0JBQWtDOztnQkFFNUYsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO29CQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO2lCQUNoRTtxQkFBTTtvQkFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLEVBQUU7d0JBQ3pILFlBQVksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUN2QixLQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO3FCQUNoRSxDQUFDLENBQUM7aUJBQ047Ozs7Ozs7O1FBR0UsMkNBQWU7Ozs7OztzQkFBQyxZQUF3QixFQUFFLHdCQUFrQyxFQUFFLE9BQVc7O2dCQUFYLHdCQUFBO29CQUFBLFdBQVc7O2dCQUM1RixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7b0JBQy9FLEtBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O29CQU96SCxLQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDOztpQkFHOUQsRUFBRSxVQUFBLEtBQUs7b0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ25CLElBQUksU0FBUyxHQUFXQSxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO29CQUNwRSxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbEssSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFO3dCQUNkLEtBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ25DLEtBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQyxDQUFDO3FCQUNuRTt5QkFBTTt3QkFDSCx3QkFBd0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSxDQUFDLENBQUE7cUJBQ3BGO2lCQUNKLENBQUMsQ0FBQzs7Ozs7Ozs7O1FBT0EseUNBQWE7Ozs7Ozs7c0JBQUMsWUFBd0IsRUFBRSx3QkFBa0MsRUFBRSxPQUFtQjs7Z0JBQW5CLHdCQUFBO29CQUFBLFdBQW1COzs7OztnQkFJbEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO29CQUM3RSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNmLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0MsRUFBRSxVQUFBLEtBQUs7b0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ25CLElBQUksU0FBUyxHQUFXQSxRQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO29CQUNwRSxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hLLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRTt3QkFDZCxLQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNuQyxLQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDakU7eUJBQU07d0JBQ0gsd0JBQXdCLENBQUMsRUFBRSxPQUFPLEVBQUUsMENBQTBDLEVBQUUsQ0FBQyxDQUFBO3FCQUNwRjtpQkFDSixDQUFDLENBQUM7Ozs7O1FBVUEsK0NBQW1COzs7O2dCQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDOzs7OztRQUloQyx5Q0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDOzs7Ozs7UUFJcEMsNkNBQWlCOzs7O3NCQUFDLEVBQUU7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7Ozs7UUFNL0IseUNBQWE7Ozs7O3NCQUFDLEVBQUU7O2dCQUNuQixJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSTs7b0JBQ2hDLElBQUksT0FBTyxHQUFlLElBQUksQ0FBQztvQkFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUMvQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7d0JBQ25DLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFDL0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO3FCQUN6QztvQkFDRCxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDeEIsS0FBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ3JDLENBQUMsQ0FBQzs7Ozs7O1FBR0EseUNBQWE7Ozs7c0JBQUMsV0FBcUI7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Ozs7OztRQUc1Qyx5Q0FBYTs7OztzQkFBQyxXQUFxQjtnQkFDdEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzs7Ozs7O1FBRzlDLHNDQUFVOzs7O3NCQUFDLElBQVk7O2dCQVMxQixJQUFJLE1BQU0sQ0FBQzs7Z0JBQ1gsSUFBSSxNQUFNLENBQUM7Z0JBQ1gsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDckIsSUFBSSxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQzs7Ozs7Ozs7OztRQVNULHNDQUFVOzs7Ozs7OztzQkFBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLHdCQUFrQyxFQUFFLE9BQVc7O2dCQUFYLHdCQUFBO29CQUFBLFdBQVc7O2dCQUUvRSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQzs7O29CQUVoRSxLQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO2lCQUM5RCxFQUFFLFVBQUEsS0FBSzs7b0JBQ0osSUFBSSxTQUFTLEdBQVdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7b0JBQ3BFLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDN0osSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFO3dCQUNkLEtBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ25DLEtBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDbEU7eUJBQU07d0JBQ0gsd0JBQXdCLENBQUMsRUFBRSxPQUFPLEVBQUUsMENBQTBDLEVBQUUsQ0FBQyxDQUFBO3FCQUNwRjtpQkFDSixDQUFDLENBQUM7Ozs7Ozs7O1FBU00sMkNBQWU7Ozs7OztzQkFBQyxFQUFFLEVBQUUsWUFBWTs7OztvQ0FDekMscUJBQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFBOztnQ0FBbkUsU0FBbUUsQ0FBQztnQ0FDcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Ozs7Ozs7OztRQUdwQyxvREFBd0I7Ozs7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDOzs7Ozs7Ozs7UUFHM0QsaURBQXFCOzs7Ozs7O1lBQXJCLFVBQXNCLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBYyxFQUFFLFdBQXFCOztnQkFDMUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQWMsQ0FBQzs7Z0JBQzFDLElBQUksYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRTNELElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNwQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUUxQixhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7d0JBQy9GLElBQUksQ0FBQyxFQUFFOzRCQUNILFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7eUJBQzNCOzZCQUFNOzRCQUNILFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7eUJBQzVCO3FCQUNKLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO3dCQUNsQixXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO3FCQUMzQixDQUFDLENBQUM7aUJBQ047YUFDSjs7Ozs7Ozs7UUFNTSwyREFBK0I7Ozs7Ozs7c0JBQUMsUUFBUSxFQUFFLFNBQWMsRUFBRSxXQUFxQjs7O2dCQUVsRixJQUFJLFdBQVcsR0FBRyxJQUFJLEtBQUssRUFBYyxDQUFDOztnQkFDMUMsSUFBSSxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNOztvQkFFekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFOzs0QkFDekMsSUFBSSxTQUFTLEdBQWUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7NEJBQy9DLElBQUksS0FBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dDQUN0QyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7NkJBQ3hDO3lCQUNKO3FCQUNKOztvQkFFRCxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEtBQUksQ0FBQyxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUM7Ozt3QkFHL0YsSUFBSSxDQUFDLEVBQUU7Ozs0QkFFSCxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDOzRCQUNyQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUMzQjs2QkFBTTs7Ozs0QkFJSCxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUM1QjtxQkFDSixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRzt3QkFDbEIsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztxQkFDM0IsQ0FBQyxDQUFDO2lCQUNOLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO29CQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUMzQixDQUFDLENBQUM7Ozs7Ozs7UUFPQSxnREFBb0I7Ozs7O3NCQUFDLFNBQXFCOztnQkFDN0MsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDO2dCQUM3QixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsWUFBWSxJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQztvQkFDbkgsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDakQsUUFBUSxHQUFHLEtBQUssQ0FBQztpQkFDcEI7Z0JBQ0QsT0FBTyxRQUFRLENBQUM7Ozs7OztRQUliLHVEQUEyQjs7OztzQkFBQyxXQUF1QjtnQkFDdEQsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTs7b0JBQ2xDLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUEsQ0FBQzt3QkFDakgsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdEcsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO3dCQUNoQixPQUFPLENBQUMsQ0FBQztxQkFDWjt5QkFBTTt3QkFDSCxPQUFPLFNBQVMsQ0FBQztxQkFDcEI7aUJBQ0o7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLENBQUM7aUJBQ1o7Ozs7OztRQVFRLDZDQUFpQjs7Ozs7Ozs7Ozs7Z0NBRWxCLFdBQVcsR0FBRyxJQUFJLEtBQUssRUFBYyxDQUFDO2dDQUM3QixxQkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxFQUFBOztnQ0FBaEQsTUFBTSxHQUFHLFNBQXVDO2dDQUNwRCxLQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29DQUN6QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFFBQVEsRUFBRTt3Q0FDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FDQUN4QztpQ0FDSjtnQ0FDRCxzQkFBTyxXQUFXLEVBQUM7OztnQ0FFbkIsc0JBQU8sSUFBSSxFQUFDOzs7Ozs7Ozs7O1FBUWIsb0RBQXdCOzs7OztnQkFDM0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Ozs7Ozs7UUFHN0Msd0NBQVk7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsR0FBVzs7Z0JBQzlDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ25FLE9BQU8sSUFBSSxDQUFDOzs7Ozs7O1FBR1Qsd0NBQVk7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsR0FBVztnQkFDOUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBOzs7Ozs7Ozs7O1FBT3pELG9EQUF3Qjs7Ozs7Ozs7c0JBQUMsT0FBZSxFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUFFLFdBQXFCOztnQkFDcEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEVBQUU7O3dCQUNILElBQUksaUJBQWlCLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO3dCQUMvQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQzFIO2lCQUNKLENBQUMsQ0FBQTs7Ozs7Ozs7O1FBU08sMkNBQWU7Ozs7Ozs7c0JBQUMsU0FBaUIsRUFBRSxHQUFXLEVBQUUsVUFBa0I7Ozs7OztnQ0FDdkUsS0FBSyxHQUFXLEdBQUcsQ0FBQzs7OztnQ0FFUixxQkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFBOztnQ0FBbkUsS0FBSyxHQUFHLFNBQTJEO2dDQUN2RSxJQUFJLEtBQUssRUFBRTtvQ0FDSCxXQUFXLEdBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsU0FBUyxJQUFJLFVBQVUsR0FBQSxDQUFDLENBQUM7b0NBQ3pFLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTt3Q0FDbkIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FDQUMxQztpQ0FDSjs7Ozs7b0NBRUwsc0JBQU8sS0FBSyxFQUFDOzs7Ozs7Ozs7Ozs7O1FBUVYsb0NBQVE7Ozs7Ozs7O3NCQUFDLEtBQWEsRUFBRSxVQUFrQixFQUFFLFNBQWlCLEVBQUUsR0FBVzs7Z0JBQzdFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSTs7b0JBQzNELElBQUksS0FBSyxHQUFlLElBQUksQ0FBQyxNQUFNLENBQUM7O29CQUNwQyxJQUFJLFdBQVcsR0FBUSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFNBQVMsSUFBSSxVQUFVLEdBQUEsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLFdBQVcsRUFBRTs7d0JBQ2IsSUFBSSxRQUFRLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7d0JBQy9DLElBQUksUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbkMsSUFBSSxRQUFRLEdBQUcsUUFBUSxFQUFFOzRCQUNyQixXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt5QkFDN0I7cUJBQ0o7eUJBQU07d0JBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7cUJBQzFEO29CQUNELEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxFQUFFO3dCQUMzQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNuRDtpQkFDSixFQUFFLFVBQUEsS0FBSzs7b0JBQ0osSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQztvQkFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7b0JBQ3ZELEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksYUFBYSxFQUFFO3dCQUMzQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNuRDtpQkFDSixDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFPQyxzQ0FBVTs7Ozs7Ozs7c0JBQUMsS0FBaUIsRUFBRSxTQUFpQixFQUFFLEdBQVcsRUFBRSxPQUFXOztnQkFBWCx3QkFBQTtvQkFBQSxXQUFXOzs7Z0JBQzdFLElBQUksU0FBUyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFBO2dCQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO29CQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNyQixFQUFFLFVBQUEsS0FBSzs7b0JBQ0osSUFBSSxTQUFTLEdBQVdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7b0JBQ3BFLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdEksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbkIsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFO3dCQUNkLEtBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7cUJBQzVDO2lCQUNKLENBQUMsQ0FBQzs7Ozs7O1FBR0EseUNBQWE7Ozs7c0JBQUMsT0FBZTtnQkFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7Ozs7Ozs7Ozs7UUFPL0IsMENBQWM7Ozs7Ozs7O3NCQUFDLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLEdBQVc7Ozs7Ozs7Z0NBSTVFLHFCQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUE7O2dDQUF2RSxTQUFTLEdBQUcsU0FBMkQsQ0FBQztnQ0FDcEUsV0FBVyxHQUFRLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFNBQVMsSUFBSSxTQUFTLEdBQUEsQ0FBQyxDQUFDO2dDQUM1RSxJQUFJLFdBQVcsRUFBRTtvQ0FDYixJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztvQ0FDekIsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lDQUNwRDtxQ0FBTTs7O29DQUlILElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lDQUM3RDs7Ozs7O2dDQUlELElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztvQ0FFOUQsc0JBQU8sSUFBSSxFQUFDOzs7Ozs7Ozs7O1FBSWhCLCtDQUFtQjs7Ozs7WUFBbkIsVUFBb0IsSUFBSSxFQUFFLFNBQVM7Z0JBQy9CLElBQUksU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLGFBQWEsRUFBRTs7b0JBQzFDLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFOzt3QkFDcEIsSUFBSSxTQUFTLEdBQVdBLFFBQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7d0JBQ3BFLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM3QixZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzNIO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7Ozs7Ozs7O1FBRWEsb0NBQVE7Ozs7Ozs7c0JBQUMsUUFBZ0IsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsR0FBVzs7Ozs7O2dDQUNsRixpQkFBaUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0NBRXRDLHFCQUFNLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUE7O2dDQUE1RyxNQUFNLEdBQUcsU0FBbUcsQ0FBQztnQ0FDN0csc0JBQU8sTUFBTSxFQUFDOzs7Ozs7Ozs7OztRQVNYLGtDQUFNOzs7Ozs7c0JBQUMsSUFBSSxFQUFFLEdBQUc7Z0JBQ25CLE9BQU8sU0FBUyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7OztvQkExZHJDSixhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7Ozt3QkFYUSxjQUFjO3dCQUdkLGFBQWE7d0JBRWIsWUFBWTs7OztnQ0FOckI7Ozs7Ozs7O1FDT0Usd0JBQW9CLGNBQTZCO1lBQTdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1NBQ2hEOzs7Ozs7O1FBTVksd0RBQStCOzs7Ozs7c0JBQUMsU0FBaUIsRUFBRSxTQUFjOzs7Ozs7O2dDQUUvRCxxQkFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxvREFBb0QsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUF2SSxJQUFJLEdBQUcsU0FBZ0k7Z0NBQzNJLHNCQUFPLElBQUksRUFBQzs7O2dDQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7OztRQVNILG1FQUEwQzs7Ozs7OztzQkFBQyxTQUFpQixFQUFFLFNBQWMsRUFBRSxPQUFlOzs7Ozs7O2dDQUUzRixxQkFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLG9EQUFvRCxHQUFHLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O2dDQUF2SixJQUFJLEdBQUcsU0FBZ0o7Z0NBQzNKLHNCQUFPLElBQUksRUFBQzs7O2dDQUdaLHNCQUFPLElBQUksRUFBQzs7Ozs7Ozs7Ozs7O1FBU0gseURBQWdDOzs7Ozs7c0JBQUMsU0FBaUIsRUFBRSxJQUFTOzs7Ozs7OztnQ0FHM0QscUJBQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMscURBQXFELEdBQUcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOztnQ0FBbkksSUFBSSxHQUFHLFNBQTRIO2dDQUNuSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUMzQyxzQkFBTyxJQUFJLEVBQUM7OztnQ0FHWixzQkFBTyxJQUFJLEVBQUM7Ozs7Ozs7Ozs7Ozs7O1FBSWhCLDZEQUFvQzs7Ozs7Ozs7WUFBcEMsVUFBcUNPLGdCQUE0QixFQUFFLFNBQWlCLEVBQUUsSUFBUyxFQUFFLFVBQW9CLEVBQUUsV0FBcUI7Z0JBRTFJQSxnQkFBYSxDQUFDLHdCQUF3QixDQUFDLHlEQUF5RCxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO29CQUN2SSxVQUFVLEVBQUUsQ0FBQztpQkFDZCxFQUNDLFVBQUEsS0FBSztvQkFDSCxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUJBQzdCLENBQUMsQ0FBQzthQUNOOztvQkE3REZQLGFBQVUsU0FBQzt3QkFDVixVQUFVLEVBQUUsTUFBTTtxQkFDbkI7Ozs7O3dCQUpRLGFBQWE7Ozs7NkJBRHRCOzs7Ozs7O0FDQUEsUUFBQTs7OzJCQUFBO1FBU0M7Ozs7OztBQ1RELFFBQUE7OzsrQkFBQTtRQUlDOzs7Ozs7O1FDTUcscUJBQW1CTyxnQkFBNEI7WUFBNUIsa0JBQWEsR0FBYkEsZ0JBQWEsQ0FBZTtTQUU5Qzs7Ozs7OztRQVNZLDRDQUFzQjs7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsSUFBUzs7Ozs7b0NBQ2pELHFCQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHFDQUFxQyxHQUFHLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7Z0NBQWxILElBQUksR0FBRyxTQUEyRztnQ0FDdEgsc0JBQU8sSUFBSSxFQUFDOzs7Ozs7Ozs7Ozs7O1FBR2hCLHVEQUFpQzs7Ozs7Ozs7WUFBakMsVUFBa0NBLGdCQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUN2RixVQUFvQixFQUFFLFdBQXFCO2dCQUMzQ0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsdUNBQXVDLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQ2xHLFVBQVUsRUFBRSxDQUFDO2lCQUNkLEVBQ0MsVUFBQSxLQUFLO29CQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDOUMsQ0FBQyxDQUFDO2FBQ047Ozs7Ozs7OztRQUVELDJDQUFxQjs7Ozs7Ozs7WUFBckIsVUFBc0JBLGdCQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUMvRSxVQUFvQixFQUFFLFdBQXFCO2dCQUN6Q0EsZ0JBQWEsQ0FBQyxhQUFhLENBQUMsb0NBQW9DLEdBQUcsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7b0JBQzVJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbEIsRUFDQyxVQUFBLEtBQUs7b0JBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM5QyxDQUNGLENBQUE7YUFDSjs7b0JBekNKUCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7Ozt3QkFMUSxhQUFhOzs7OzBCQUR0Qjs7Ozs7OztBQ0FBLFFBQUE7Ozs0QkFBQTtRQUtDOzs7Ozs7O1FDVUc7NEJBSnNDLElBQUlHLGVBQVksRUFBRTtvQ0FDN0IsSUFBSTsrQkFDVCxLQUFLO1lBR3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2FBQ25DO1NBQ0o7Ozs7UUFFRCwyQ0FBZ0I7OztZQUFoQjs7Z0JBQ0ksSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Z0JBQ3ZELElBQUksV0FBVyxDQUFDOztnQkFDaEIsSUFBSSxJQUFJLEdBQVksSUFBSSxDQUFDOztnQkFDekIsSUFBSSxNQUFNLENBQUM7Z0JBRVgsSUFBSSxXQUFXLEVBQUU7b0JBQ2IsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO3dCQUNwRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUV6RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksU0FBUyxFQUFFOzRCQUNuRSxJQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzt5QkFDL0I7cUJBQ0o7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZjs7OztRQUVNLG1EQUF3Qjs7OztnQkFFM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBR3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtnQkFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUdBQWlHLENBQUMsQ0FBQTs7Ozs7UUFJbEgsMENBQWU7OztZQUFmO2dCQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs7b0JBQ2xCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxTQUFTLEVBQUU7d0JBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsT0FBTyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO3FCQUN6Rjt5QkFDSTt3QkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO3FCQUN2RTtpQkFDSjtxQkFDSTtvQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2lCQUN2RTthQUNKOzs7O1FBRUQsb0NBQVM7OztZQUFUO2dCQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNoQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztpQkFDbkM7cUJBQ0k7b0JBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO2lCQUN6QjthQUNKOzs7O1FBRUQsdUNBQVk7OztZQUFaOztnQkFDSSxJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDOztnQkFDdkQsSUFBSSxXQUFXLENBQUM7Z0JBRWhCLElBQUksV0FBVyxFQUFFO29CQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUU7d0JBQ3pCLE9BQU8sV0FBVyxDQUFDLFdBQVcsQ0FBQztxQkFDbEM7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZjs7OztRQUVNLG9DQUFTOzs7OztnQkFFWixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztnQkFDdkQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDOzs7OztRQUluQixxREFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7UUFJVCxpREFBc0I7Ozs7O2dCQUN6QixJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ2hGLElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFOztvQkFDeEMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTs7d0JBQzVELElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxHQUFBLENBQUMsQ0FBQzt3QkFDbEYsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUU7NEJBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO3lCQUMzQjtxQkFDSjtpQkFDSjs7Ozs7O1FBR1Esa0NBQU87Ozs7c0JBQUMsUUFBUTs7Ozs7b0NBRWIscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBQTs7Z0NBQXpDLFNBQVMsR0FBRyxTQUE2QixDQUFBO2dDQUN6QyxzQkFBTyxTQUFTLEVBQUE7Ozs7Ozs7OztRQUtiLCtCQUFJOzs7O3NCQUFDLE1BQWM7O2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O2dCQUNoRCxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDekMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQzNCLEtBQUssRUFBRSxJQUFJO2lCQUNkLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTtvQkFFcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3R0FBd0csQ0FBQyxDQUFBO2lCQUN4SCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07b0JBQ2xCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7aUJBQ3RILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTs7aUJBRXZCLENBQUMsQ0FBQzs7Ozs7O1FBR0EsOEJBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFHMUIsZ0NBQUs7Ozs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUdsRCx3Q0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUduRCxrQ0FBTzs7OztnQkFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Ozs7O1FBR3pCLDRDQUFpQjs7OztnQkFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7Ozs7UUFHbEIsb0NBQVM7Ozs7c0JBQUMsRUFBRTs7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsTUFBTTtvQkFDN0IsT0FBTyxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDdkMsQ0FBQyxDQUFDOzs7OztRQUdBLHdDQUFhOzs7OztnQkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxPQUFPO29CQUN0RCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRzt3QkFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQzlELENBQUMsQ0FBQztpQkFDTixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUEsVUFBVTtvQkFDZCxPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3QyxDQUFDLENBQUM7OztvQkF4TFZILGFBQVUsU0FBQzt3QkFDUixVQUFVLEVBQUUsTUFBTTtxQkFDckI7Ozs7OytCQUxEOzs7Ozs7OztRQ2NJOzRCQUpzQyxJQUFJRyxlQUFZLEVBQUU7b0NBRTdCLElBQUk7WUFHM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO2FBQ2xDO1NBQ0o7Ozs7UUFFRCwrQ0FBZ0I7OztZQUFoQjs7Z0JBQ0ksSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQzs7Z0JBQ3ZELElBQUksV0FBVyxDQUFDOztnQkFDaEIsSUFBSSxJQUFJLEdBQVksSUFBSSxDQUFDOztnQkFDekIsSUFBSSxNQUFNLENBQUM7Z0JBRVgsSUFBSSxXQUFXLEVBQUU7b0JBQ2IsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFO3dCQUNwRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUV6RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksU0FBUyxFQUFFOzRCQUNuRSxJQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQzt5QkFDL0I7cUJBQ0o7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7YUFDZjs7OztRQUVNLHVEQUF3Qjs7OztnQkFFM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLGlHQUFpRyxDQUFDLENBQUE7Ozs7O1FBSWxILHdDQUFTOzs7WUFBVDtnQkFDSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7aUJBQ25DO3FCQUNJO29CQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7aUJBQzFFO2FBQ0o7Ozs7UUFFTSx3Q0FBUzs7Ozs7Z0JBRVosSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7UUFJbkIseURBQTBCOzs7OztnQkFDN0IsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQzs7Z0JBQzdELElBQUksY0FBYyxDQUFDO2dCQUNuQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtvQkFDeEQsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTt3QkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztxQkFDakQ7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7OztRQUdULG1DQUFJOzs7O3NCQUFDLE1BQWM7O2dCQUN0QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O2dCQUNoRCxJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDekMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7b0JBQzNCLEtBQUssRUFBRSxJQUFJO2lCQUNkLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTtvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2R0FBNkcsQ0FBQyxDQUFBO2lCQUM3SCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07b0JBQ2xCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLDJHQUEyRyxDQUFDLENBQUE7aUJBQzNILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTs7aUJBRXZCLENBQUMsQ0FBQzs7Ozs7O1FBR0Esa0NBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFHMUIsb0NBQUs7Ozs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUdsRCw0Q0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUduRCxnREFBaUI7Ozs7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7UUFLWixzQ0FBTzs7Ozs7Ozs7b0NBRUoscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBQTs7Z0NBQXpDLFNBQVMsR0FBRyxTQUE2QixDQUFBO2dDQUN6QyxzQkFBTyxTQUFTLEVBQUE7Ozs7OztvQkFwSHZCSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7OzttQ0FMRDs7Ozs7Ozs7UUNhSTs0QkFIc0MsSUFBSUcsZUFBWSxFQUFFOzhCQUNoQixJQUFJQSxlQUFZLEVBQUU7WUFHdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxjQUFjLEdBQUcsU0FBUyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7O2dCQUNuRixJQUFJLFNBQVMsQ0FBUzs7Z0JBR3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLG1HQUFtRyxDQUFDLENBQUE7YUFDbkg7U0FDSjs7Ozs7UUFFTSwyQ0FBUzs7OztzQkFBQyxTQUFTOztnQkFFdEIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFjLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7OztRQUk5RCw0REFBMEI7Ozs7O2dCQUM3QixJQUFJLGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOztnQkFDN0QsSUFBSSxjQUFjLENBQUM7Z0JBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO29CQUN4RCxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO3dCQUN4RyxPQUFPLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO3FCQUNqRDtpQkFDSjtnQkFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7O1FBR1Qsc0NBQUk7Ozs7c0JBQUMsTUFBYzs7O2dCQUN0QixJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDekMsSUFBSSxFQUFFLElBQUk7b0JBQ1YsS0FBSyxFQUFFLElBQUk7aUJBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBQSxNQUFNO29CQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLDBHQUEwRyxDQUFDLENBQUE7aUJBQzFILENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQUEsTUFBTTtvQkFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0dBQXdHLENBQUMsQ0FBQTtpQkFDeEgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxHQUFHO29CQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBOztpQkFFbkIsQ0FBQyxDQUFDOzs7Ozs7UUFHQSw0Q0FBVTs7OztzQkFBQyxjQUF1Qjs7Z0JBRXJDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3pDLElBQUksRUFBRSxJQUFJO29CQUNWLEtBQUssRUFBRSxJQUFJO2lCQUNkLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTtvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywwR0FBMEcsQ0FBQyxDQUFBO2lCQUMxSCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07b0JBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3BCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHdHQUF3RyxDQUFDLENBQUE7aUJBQ3hILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTs7aUJBRW5CLENBQUMsQ0FBQzs7Ozs7O1FBSU0sMkNBQVM7Ozs7c0JBQUMsTUFBYzs7Ozs7OztnQ0FDN0IsY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dDQUVwRSxxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQ2xELENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTt3Q0FFcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3Q0FDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywwR0FBMEcsQ0FBQyxDQUFBO3dDQUN2SCxLQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO3FDQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUc7d0NBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7d0NBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7O3FDQUVuQixDQUFDLEVBQUE7O2dDQVZGLFNBVUUsQ0FBQztnQ0FFSCxxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFBOztnQ0FBN0IsU0FBNkIsQ0FBQzs7Ozs7Ozs7OztRQXNCM0IscUNBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7O1FBRzFCLHdDQUFNOzs7O3NCQUFDLEVBQVU7O2dCQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHO29CQUMxQixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNwQyxDQUFDLENBQUM7Ozs7O1FBR0EsdUNBQUs7Ozs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUdsRCwrQ0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUduRCxtREFBaUI7Ozs7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7UUFHbEIsZ0RBQWM7Ozs7O2dCQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQ3RFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO29CQUNoQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7d0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3BCLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUNoQzs7aUJBRUosQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzs7Ozs7UUFHdkMsbURBQWlCOzs7O2dCQUNwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7OztvQkF4SjlCSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7OztzQ0FMRDs7Ozs7OztBQ0FBO1FBYUk7NEJBSHNDLElBQUlHLGVBQVksRUFBRTswQkFDcEIsSUFBSUEsZUFBWSxFQUFFO1lBR2xELElBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixTQUFTLEdBQUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsY0FBYyxHQUFHLFNBQVMsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOztnQkFDbkYsSUFBSSxTQUFTLENBQVE7Z0JBRXJCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLGNBQWMsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUdBQW1HLENBQUMsQ0FBQTthQUNuSDtTQUNKOzs7O1FBRU0sMkNBQVM7Ozs7O2dCQUVaLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7O1FBSW5CLDREQUEwQjs7Ozs7Z0JBQzdCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O2dCQUM3RCxJQUFJLGNBQWMsQ0FBQztnQkFDbkIsSUFBRyxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUM7b0JBQ3RELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7d0JBQ3hHLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7cUJBQ2pEO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDOzs7Ozs7UUFHVCxzQ0FBSTs7OztzQkFBQyxNQUFjOzs7Z0JBQ3RCLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN6QyxJQUFJLEVBQUUsSUFBSTtvQkFDVixLQUFLLEVBQUUsSUFBSTtpQkFDZCxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFBLE1BQU07b0JBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEdBQTBHLENBQUMsQ0FBQTtpQkFDMUgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO29CQUNsQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3R0FBd0csQ0FBQyxDQUFBO2lCQUN4SCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUc7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7O2lCQUV2QixDQUFDLENBQUM7Ozs7O1FBR0EsNENBQVU7Ozs7O2dCQUNiLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztxQkFDdEUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07O29CQUVaLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3BCLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7aUJBR2hDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Ozs7OztRQUd2QyxxQ0FBRzs7OztzQkFBQyxFQUFVO2dCQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUcxQix1Q0FBSzs7OztnQkFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Ozs7O1FBR2hELCtDQUFhOzs7O2dCQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7Ozs7O1FBR2pELG1EQUFpQjs7OztnQkFDcEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDOzs7OztRQUdsQiwyQ0FBUzs7OztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7OztvQkF2RjFCSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ25COzs7OztzQ0FMSDs7Ozs7OztBQ0FBO1FBZUk7NEJBRnNDLElBQUlHLGVBQVksRUFBRTtZQUdwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs7Z0JBQ3RCLElBQUksU0FBUyxDQUFTO2dCQUN0QixTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzNHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzthQUM5QjtTQUNKOzs7O1FBR00sd0RBQTBCOzs7OztnQkFDN0IsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQzs7Z0JBQzdELElBQUksY0FBYyxDQUFDO2dCQUNuQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtvQkFDeEQsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTt3QkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztxQkFDakQ7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7O1FBR1QsdUNBQVM7Ozs7O2dCQUVaLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7OztRQUduQixpQ0FBRzs7OztzQkFBQyxFQUFVO2dCQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7UUFJMUIsNENBQWM7Ozs7c0JBQUMsS0FBYTtnQkFDL0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7UUFJN0IsK0NBQWlCOzs7O2dCQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztRQUdsQixrQ0FBSTs7OztzQkFBQyxNQUFjOzs7Z0JBRXRCLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN6QyxJQUFJLEVBQUUsSUFBSTtvQkFDVixLQUFLLEVBQUUsSUFBSTtpQkFDZCxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFBLE1BQU07b0JBRXBCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEdBQTBHLENBQUMsQ0FBQTtpQkFDMUgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO29CQUNsQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3R0FBd0csQ0FBQyxDQUFBO2lCQUN4SCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUc7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7O2lCQUV2QixDQUFDLENBQUM7Ozs7Ozs7UUFJQSwrQ0FBaUI7Ozs7O3NCQUFDLFVBQWtCLEVBQUUsV0FBbUI7Z0JBQzVELE9BQU8sVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7OztvQkExRTdDSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7OztrQ0FQRDs7Ozs7OztBQ0dBOzs2QkFRd0I7Z0JBQ2hCLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQSxFQUFFO2dCQUN2QyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsRUFBRTtnQkFDdkMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBLEVBQUU7Z0JBQ3pDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxFQUFFO2dCQUN6QyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO2dCQUMxQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO2dCQUN6QyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxFQUFFO2dCQUN4QyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO2dCQUN4QyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO2dCQUN2QyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFBLEVBQUU7Z0JBQ3BDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTthQUVqRDs7Ozs7Ozs7UUFRTSw0Q0FBZTs7Ozs7O3NCQUFDLFNBQXVCLEVBQUUsUUFBc0I7Z0JBQ2xFLElBQUk7b0JBQ0EsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksR0FBQSxDQUFDLEVBQUU7d0JBQzlELE9BQU8sSUFBSSxDQUFDO3FCQUNmO3lCQUFNO3dCQUNILE9BQU8sS0FBSyxDQUFDO3FCQUNoQjtpQkFDSjtnQkFBQyxXQUFLO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjs7Ozs7Ozs7O1FBV0UsK0NBQWtCOzs7Ozs7O3NCQUFDLFNBQXVCLEVBQUUsUUFBc0IsRUFBRSxZQUF5QjtnQkFDaEcsSUFBSTs7b0JBQ0EsSUFBSSxLQUFLLEdBQVcsSUFBSSxDQUFDOztvQkFDekIsSUFBSSxhQUFhLEdBQW9CLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxHQUFBLENBQUMsQ0FBQztvQkFDbEcsSUFBSSxhQUFhLEVBQUU7d0JBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7OzRCQUNwRCxJQUFJLGVBQWUsR0FBbUIsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7NEJBRXBFLElBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFDO2dDQUN4SixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQzs2QkFDL0Q7aUNBQUk7Z0NBQ0QsS0FBSyxHQUFHLEtBQUssQ0FBQzs2QkFDakI7eUJBQ0o7cUJBQ0o7aUJBQ0o7Z0JBQUMsV0FBSztpQkFFTjtnQkFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7UUFPVCw2Q0FBZ0I7Ozs7OztzQkFBQyxPQUFjLEVBQUUsWUFBd0I7Z0JBQzdELElBQUc7b0JBQ0MsSUFBRyxPQUFPLElBQUksRUFBRSxFQUFFOzt3QkFDZCxJQUFJLE9BQU8sR0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUN0QyxJQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUM7NEJBQ2QsUUFBTyxPQUFPLENBQUMsTUFBTTtnQ0FDakIsS0FBSyxVQUFVO29DQUNYLFlBQVksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztvQ0FDdkMsTUFBTTs2QkFDYjt5QkFDSjtxQkFDSjtpQkFDSjtnQkFBQSxPQUFNLEVBQUUsRUFBQztpQkFFVDs7Ozs7Ozs7UUFZRywwQ0FBYTs7Ozs7O3NCQUFDLFNBQWlCLEVBQUUsUUFBc0I7O2dCQUMzRCxJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUM7Z0JBQ3hCLElBQUk7O29CQUNBLElBQUksS0FBSyxHQUFXLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRTt3QkFDdkIsS0FBSyxLQUFLOzRCQUNOLE1BQU0sR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQyxLQUFLLENBQUM7NEJBQzVGLE1BQU07d0JBQ1YsS0FBSyxPQUFPOzRCQUNSLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNqQyxNQUFNO3dCQUNWOzRCQUNJLElBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQ0FDdEMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQzlDOzRCQUNELE1BQU07cUJBQ2I7aUJBQ0o7Z0JBQUMsV0FBSztpQkFFTjtnQkFDRCxPQUFPLE1BQU0sQ0FBQzs7O29CQXRIckJBLGFBQVUsU0FBQzt3QkFDUixVQUFVLEVBQUUsTUFBTTtxQkFDckI7OztpQ0FQRDs7Ozs7OztBQ0FBO0lBRUEsSUFBTUksUUFBTSxHQUFHLE9BQU8sQ0FBQztBQUV2QixRQUFBOzs7Ozs7OztRQUNXLGlEQUFrQjs7Ozs7c0JBQUMsSUFBSSxFQUFFLFFBQWtCO2dCQUM5QyxJQUFJOztvQkFDQSxJQUFJLElBQUksQ0FBYTs7b0JBRXJCLElBQUksTUFBTSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O29CQUNuRCxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFFakIsSUFBSSxNQUFNLElBQUksTUFBTSxFQUFFOzt3QkFDbEIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7d0JBQzNDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7d0JBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7d0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzs0QkFDbEMsSUFBSSxHQUFHLEdBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs0QkFDM0IsSUFBSSxHQUFHLEVBQUU7O2dDQUNMLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dDQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dDQUN0QixJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFOztvQ0FFbkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lDQUNqQjs2QkFDSjt5QkFDSjtxQkFDSjtpQkFFSjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUE7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUJBQ2xCOzs7Ozs7OztRQU1FLDZDQUFjOzs7Ozs7c0JBQUMsSUFBSSxFQUFFLE1BQWMsRUFBRSxRQUFrQjtnQkFDMUQsSUFBSTs7b0JBQ0EsSUFBSSxJQUFJLENBQWE7b0JBRXJCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7d0JBQ2xDLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7d0JBQzNCLElBQUksR0FBRyxFQUFFOzRCQUNMLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFOztnQ0FFcEYsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNqQjt5QkFDSjtxQkFDSjtpQkFFSjtnQkFBQyxPQUFPLEVBQUUsRUFBRTtvQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUE7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUJBQ2xCOzs7Ozs7UUFNRyw2Q0FBYzs7OztzQkFBQyxLQUFhOztnQkFFaEMsSUFBSSxDQUFDLEdBQUdBLFFBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBRXpDLE9BQU8sQ0FBQyxDQUFDOzttQ0FwRWpCO1FBc0VDOzs7Ozs7O1FDekRHOzRCQUZzQyxJQUFJRCxlQUFZLEVBQUU7WUFHcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO2FBQ2xDO1NBQ0o7Ozs7UUFFTSwrQ0FBd0I7Ozs7Z0JBRTNCLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7O2dCQUNoRixJQUFJLFNBQVMsQ0FBUztnQkFFdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnR0FBZ0csQ0FBQyxDQUFBOzs7OztRQUkxRyxnQ0FBUzs7Ozs7Z0JBRVosSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7UUFJbkIsaURBQTBCOzs7OztnQkFDN0IsSUFBSSxjQUFjLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQzs7Z0JBQzdELElBQUksY0FBYyxDQUFDO2dCQUNuQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtvQkFDeEQsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTt3QkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztxQkFDakQ7aUJBQ0o7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7OztRQUdULDJCQUFJOzs7O3NCQUFDLE1BQWM7OztnQkFDdEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBRXBFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3pDLElBQUksRUFBRSxLQUFLO29CQUNYLEtBQUssRUFBRSxLQUFLO2lCQUNmLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQUEsTUFBTTtvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1R0FBdUcsQ0FBQyxDQUFBO2lCQUN2SCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07b0JBQ2xCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHFHQUFxRyxDQUFDLENBQUE7aUJBQ3JILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsR0FBRztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTs7aUJBRXZCLENBQUMsQ0FBQzs7Ozs7O1FBR0EsMEJBQUc7Ozs7c0JBQUMsRUFBVTtnQkFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFHMUIsNEJBQUs7Ozs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUdsRCxvQ0FBYTs7OztnQkFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzs7OztRQUduRCx3Q0FBaUI7Ozs7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7UUFLWiw4QkFBTzs7Ozs7Ozs7b0NBRUoscUJBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBQTs7Z0NBQXpDLFNBQVMsR0FBRyxTQUE2QixDQUFBO2dDQUN6QyxzQkFBTyxTQUFTLEVBQUE7Ozs7OztvQkFyRnZCSCxhQUFVLFNBQUM7d0JBQ1IsVUFBVSxFQUFFLE1BQU07cUJBQ3JCOzs7OzsyQkFMRDs7Ozs7Ozs7UUNhSTs0QkFGc0MsSUFBSUcsZUFBWSxFQUFFO1lBR3BELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTthQUNqQztTQUNKOzs7O1FBRU0sdURBQXdCOzs7O2dCQUUzQixTQUFTLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOztnQkFDbEYsSUFBSSxTQUFTLENBQVM7Z0JBRXRCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLGFBQWEsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUdBQW1HLENBQUMsQ0FBQTs7Ozs7UUFJN0csd0NBQVM7Ozs7O2dCQUVaLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7O1FBSW5CLHlEQUEwQjs7Ozs7Z0JBQzdCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O2dCQUM3RCxJQUFJLGNBQWMsQ0FBQztnQkFDbkIsSUFBSSxjQUFjLEtBQUssU0FBUyxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7b0JBQ3hELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7d0JBQ3hHLE9BQU8sY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7cUJBQ2pEO2lCQUNKO2dCQUNELE9BQU8sSUFBSSxDQUFDOzs7Ozs7UUFHVCxtQ0FBSTs7OztzQkFBQyxNQUFjOzs7Z0JBQ3RCLElBQUksY0FBYyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO29CQUN6QyxJQUFJLEVBQUUsS0FBSztvQkFDWCxLQUFLLEVBQUUsS0FBSztpQkFDZixDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFBLE1BQU07b0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEdBQTBHLENBQUMsQ0FBQTtpQkFDMUgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQSxNQUFNO29CQUNsQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3R0FBd0csQ0FBQyxDQUFBO2lCQUN4SCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLEdBQUc7b0JBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7O2lCQUV2QixDQUFDLENBQUM7Ozs7OztRQUdBLGtDQUFHOzs7O3NCQUFDLEVBQVU7Z0JBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7O1FBRzFCLG9DQUFLOzs7O2dCQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7Ozs7UUFHbEQsNENBQWE7Ozs7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQzs7Ozs7UUFHakQsZ0RBQWlCOzs7O2dCQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7O1FBS1osc0NBQU87Ozs7Ozs7O29DQUVMLHFCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUE7O2dDQUF4QyxTQUFTLEdBQUUsU0FBNkIsQ0FBQTtnQ0FDeEMsc0JBQU8sU0FBUyxFQUFBOzs7Ozs7b0JBckZ2QkgsYUFBVSxTQUFDO3dCQUNSLFVBQVUsRUFBRSxNQUFNO3FCQUNyQjs7Ozs7bUNBTEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==
|