sf-reglanegociom3 1.0.12-beta86 → 1.0.12-beta87
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 +1 -1
- package/bundles/sf-reglanegociom3.umd.js.map +1 -1
- package/bundles/sf-reglanegociom3.umd.min.js.map +1 -1
- package/esm2015/lib/rnm3/Offline/service-m3-proceso-offline.js +1 -1
- package/esm5/lib/rnm3/Offline/service-m3-proceso-offline.js +1 -1
- package/fesm2015/sf-reglanegociom3.js +1 -1
- package/fesm2015/sf-reglanegociom3.js.map +1 -1
- package/fesm5/sf-reglanegociom3.js +1 -1
- package/fesm5/sf-reglanegociom3.js.map +1 -1
- package/lib/rnm3/Offline/service-m3-proceso-offline.d.ts +1 -1
- package/package.json +1 -1
|
@@ -16808,4 +16808,4 @@ var CouchDinamByProcesos = /** @class */ (function () {
|
|
|
16808
16808
|
|
|
16809
16809
|
export { PostServiceM3, xmlToJsonTF, M3CouchMaestro, M3Data, Filtros, M3PrdAdicionales, M3PrdGeneral, M3PRDImpuestos, TypeM3PrdGrp, TypeImpuestosPRD, M3PrdLista, M3PImpuestos, M3PDetalleItems, M3PItemsWEB, M3PDetalleCupon, M3PDinamicas, M3PEncFP, M3PEncItems, M3PEnvios, M3Procesos, M3PRecepcion, M3PerXProceso, M3OtClasificaciones, ServiceM3FE, M3ProcesoService, M3RegService, M3Trx, ServiceM3Maestro, ServiceListaPrecio, ServiceLoadListaPrecio, M3DinProcesos, M3PrdPackDet, M3UbiAdicionales, M3Ubicacion, promocionesService, M3CONDIAGRUPACION, M3CONDIPROMO, M3DETCONDIPROMO, M3ENCPROMO, PromocionProcesada, PromocionesAsociadas, PromocionCombinada, M3UbicacionService, M3RegMasivo, M3RegMasivoAKZService, M3ReversoServ, M3PDinamByActividad, M3DinByActividad, M3SaldosXCuenta, M3RegistroTrx, cuponesService, ServiceOffLine, bdOffLineLog, M3MaestroOffline, M3ProcesosOffline, M3NotifService, ModelM3Notif, M3Presentaciones, M3Consultas, TECLASRAPIDAS, CouchPRDSService, CouchConfigLPService, CouchCodsPRDSService, CouchPromocionesService, CouchUbicacionesService, M3NotificacionesAPP, MathTF, ServiceM3PackByipo, FiltrosDiarioOffLine, CouchPerxipo, CouchDinamByProcesos };
|
|
16810
16810
|
|
|
16811
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtcmVnbGFuZWdvY2lvbTMuanMubWFwIiwic291cmNlcyI6WyJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvQ29udmVydC94bWxUb0pTb24uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL0RhdGEvbTMtY291Y2gtbWFlc3Ryby50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvRGF0YS9tMy1kYXRhLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL2ZpbHRyb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkTGlzdGEudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdycC50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBkaW5hbWljYXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtZnAudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXAtZW52aW9zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1mLXRyYWJham8udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXByb2Nlc29zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wcmVjZXBjaW9uLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWZlLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXByb2Nlc28uaW50ZXJmYWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29uZmlnbHAuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLXNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXRyeC5pbnRlcmZhY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1wcm9jZXNvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZFBhY2tEZXQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpQWRpY2lvbmFsZXMudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUHJvbW9jaW9uZXMvTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtdWJpY2FjaW9uLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1tYXNpdm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLW1hc2l2by1ha3ouc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmV2ZXJzby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZGluYW0tYnktYWN0aXZpZGFkLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1ieS1hY3RpdmlkYWQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXNhbGRvcy14LWN1ZW50YS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcmVnLXRyeC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvQ3Vwb25lcy9jdXBvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtbWFlc3Ryby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtcHJvY2Vzby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1ub3RpZmljYWNpb25lcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL05vdGlmaWNhY2lvbmVzL00zTm9maXRpY2FjaW9uZXMubW9kZWwudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL0NvbnN1bHRhc00zL20zLWNvbnN1bHRhcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL1ViaWNhY2lvbi9tMy10ZWNsYXMtcmFwaWRhcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1wcmRzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29kc3ByZC5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXByb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtdWJpY2FjaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTm90aWZpY2FjaW9uZXMvbm90aWZpY2FjaW9uZXMtbTMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcGFjay1ieS10aXBvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9maWx0cm9zLWRpYXJpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXBlcnh0aXBvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLWRpbmFteHByb2Nlc29zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHAsIFJlcXVlc3RPcHRpb25zLCBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCdcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCdcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cC9zcmMvc3RhdGljX3Jlc3BvbnNlJ1xyXG5pbXBvcnQgeyB0aW1lb3V0LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBvc3RTZXJ2aWNlTTMge1xyXG4gICAgaWRrYXRpb3M6IHN0cmluZ1xyXG4gICAgc2Vydmlkb3I6IHN0cmluZztcclxuICAgIHNlcnZpZG9yUGVyc29uYXM6IHN0cmluZztcclxuICAgIHNlcnZpZG9yR2VuZXJhbGVzOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvck0zOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckZFTVg6IHN0cmluZztcclxuICAgIHNlcnZpZG9yRG9jdW1lbnRvczogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JDb250YWJsZTogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JQcmVzdGFtbzogc3RyaW5nO1xyXG4gICAgV2ViQmFzZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5jYXJnYUluaWNpYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FyZ2FJbmljaWFsKCkge1xyXG5cclxuICAgICAgICB2YXIganNvbjogYW55O1xyXG4gICAgICAgIGxldCBzQ29uZmlnSlNPTiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpO1xyXG4gICAgICAgIGlmIChzQ29uZmlnSlNPTikge1xyXG4gICAgICAgICAgICBsZXQgakNvbmZpZ0pTT04gPSBKU09OLnBhcnNlKHNDb25maWdKU09OKTtcclxuICAgICAgICAgICAgaWYgKGpDb25maWdKU09OLlNlcnZpZG9yUGVyc29uYXMpIHtcclxuICAgICAgICAgICAgICAgIGpzb24gPSBqQ29uZmlnSlNPTjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvbmZpZ0pzb24oaWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgdGhpcy5nZXRXaXRoQm9keUdlbmVyYWxlcygnR2VuZXJhbGVzL2dldENvbmZpZ0pzb24vJyArIGlkS2F0aW9zLCBudWxsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BPa19nZXRDb25maWdKc29uKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzcE9rX2dldENvbmZpZ0pzb24oanNvbikge1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVSTFNlcnZlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWRvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVUkxTZXJ2ZXJEb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGlTZXJ2aWRvciArIHVybEdldCkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0V2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0KS5waXBlKFxyXG4gICAgICAgICAgICB0aW1lb3V0KHRpbWVvdXRUaW1lKVxyXG4gICAgICAgICkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBHZXRXaXRoQm9keSh1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRyb3NcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBodHRwR2V0V2l0aEJvZHlUaW1lT3V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQodGltZW91dFRpbWUpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cF9nZXRfYmxvYih1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpOyAgICAgICAgXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnUmVzcG9uc2UgVHlvZScsICdibG9iJyk7XHJcblxyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGlTZXJ2aWRvciArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBfZ2V0X2FycmF5YnVmZmVyKHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7ICAgICAgICBcclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdSZXNwb25zZSBUeW9lJywgJ2Jsb2InKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYXJyYXlidWZmZXJcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZ2V0UHJlc3RhbW8odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0KHVybEdldCwgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2l0aEJvZHlNM1RpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5VGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgcGFyYW1zLCB0aW1lb3V0VGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlQcmVzdGFtbyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8sIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdpdGhCb2R5TTModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5UGVyc29uYXModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvclBlcnNvbmFzLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5R2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoQm9keSh1cmxHZXQsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlEb2N1bWVudG8odXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ3Jlc3BvbnNlVHlwZScsICdSZXNwb25zZUNvbnRlbnRUeXBlLkJsb2InKTtcclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldCh0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2Jsb2JfRG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwX2dldF9ibG9iKHVybEdldCwgdGhpcy5zZXJ2aWRvckRvY3VtZW50b3MsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2FycmF5YnVmZmVyX0RvY3VtZW50b3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cF9nZXRfYXJyYXlidWZmZXIodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3N0cyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQZXJzb25hcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yUGVyc29uYXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdlbmVyYWxlcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNMyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE0zV2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoVGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgdGltZU91dCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgZ2V0RG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENvbnRhYmxlKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JDb250YWJsZSk7XHJcbiAgICB9XHJcbiAgICAvLy9FbmQgaHR0cEdldFxyXG5cclxuICAgIGdldFBvc3RzV2l0aE91dEpzb24odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8vcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBcclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwUHJlc3RhbW9zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVJlc3BvbnNlSHR0cENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwXHJcblxyXG5cclxuICAgIC8vL3Bvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChpU2Vydmlkb3IgKyB1cmxHZXQsIHBhcmFtcywgb3B0aW9ucykubWFwKFxyXG4gICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwT3B0aW9ucyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zTTModXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaGVhZGVycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgaGVhZGVycywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zRG9jcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuXHJcbiAgICAvLy9wb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaVNlcnZpZG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQZXJzb25hcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JQZXJzb25hcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JGRU1YKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsR2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQcmVzdGFtb3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuICAgIC8vL0VuZCBwb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZVdlYkFwaSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zLCBvcHRpb25zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIHhtbFRvSnNvblRGe1xyXG5cclxuICAgIGNvbnZlcnRYbWxUb0pzb24oaW5wdXRYbWwpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gcmVxdWlyZSgneG1sMmpzJykucGFyc2VTdHJpbmc7XHJcbiAgICAgICAgY29uc3QgeG1sID0gaW5wdXRYbWw7XHJcbiAgICAgICAgbGV0IHJlc3VsdGFkbztcclxuICAgICAgICBwYXJzZVN0cmluZyh4bWwsIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHRhZG89IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcGxhY2VDaGFyWG1sKGlucHV0WG1sKXtcclxuICAgICAgICBsZXQgZ3QgPSAvJmd0Oy9naTsgICAgICAgIFxyXG4gICAgICAgIGxldCBsdCA9IC8mbHQ7L2dpO1xyXG4gICAgICAgIGxldCBxdW90ID0gLyZxdW90Oy9naTtcclxuICAgICAgICBsZXQgcmVzdWx0YWRvID0gaW5wdXRYbWwucmVwbGFjZShndCxcIj5cIik7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gcmVzdWx0YWRvLnJlcGxhY2UobHQsXCI8XCIpO1xyXG4gICAgICAgIHJlc3VsdGFkbyA9IHJlc3VsdGFkby5yZXBsYWNlKHF1b3QsXCInXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zQ291Y2hNYWVzdHJvIHtcclxuICAgIHB1YmxpYyBvRGF0YU0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIHNUaXBvSHViOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgc1RpcG9IdWIgPSB0aGlzLkdldFRpcG9IdWJGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICBpZiAoc0lka2F0aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc1RpcG9IdWIgJiYgc1RpcG9IdWIudG9VcHBlckNhc2UoKS50cmltKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tRWNjX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21FY2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0VFQ0MhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Z1bmNpb24gcXVlIHRyYWVyYSBlbCB0aXBvIGRlIGh1YlxyXG4gICAgcHVibGljIEdldFRpcG9IdWJGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uTTNIVUJTWzBdLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIC8vICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAvLyAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAvLyAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgLy8gICAgIG9wdGlvbnMyXHJcbiAgICAgICAgLy8gfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJDb21wbGV0bzpcIiArIGNoYW5nZSlcclxuICAgICAgICAvLyB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgLy8gfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM0RhdGEge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIkNhcnJpdG9Db21wcmFzXCIsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaCwgQXN5bmMuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KGlkKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJREthdGlvcywgdGRvYyB5IG5kb2MuXHJcbiAgICBwdWJsaWMgR2V0S2V5Q2Fycml0b0NvbXByYXMoaXNJREthdGlvczogc3RyaW5nLCBpc1Rkb2M6IHN0cmluZywgaXNOZG9jOiBzdHJpbmcsIGlzVWJpY2FjaW9uOiBzdHJpbmcsIGlzSWRIdWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBcIkNDP1wiICsgaXNJREthdGlvcyArIFwiP1wiICsgaXNVYmljYWNpb24gKyBcIj9cIiArIGlzSWRIdWIgKyBcIj9cIiArIGlzVGRvYyArIFwiP1wiICsgaXNOZG9jO1xyXG4gICAgfVxyXG5cclxuICAgIC8vRGVzdHJ1aXIgeSByZWNvbnN0cnVpciBsYSBiYXNlIGRlIGRhdG9zIHBvdWNoREJcclxuICAgIHB1YmxpYyBSZXNlckJEKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQignQ2Fycml0b0NvbXByYXMnLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBGaWx0cm9zIHtcclxuICAgIHB1YmxpYyBBdHJpYnV0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlzQXRyaWJ1dG86c3RyaW5nLCBpc1ZhbG9yOnN0cmluZyl7XHJcbiAgICAgICAgdGhpcy5BdHJpYnV0byA9IGlzQXRyaWJ1dG87XHJcbiAgICAgICAgdGhpcy5WYWxvciA9IGlzVmFsb3I7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUHJkQWRpY2lvbmFsZXN7XHJcbiAgICBTS1AxOnN0cmluZztcclxuICAgIEFUUklCVVRPOnN0cmluZztcclxuICAgIFZBTE9SOnN0cmluZztcclxuICAgIE5JVkVMMTpudW1iZXI7XHJcbiAgICBOSVZFTDI6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcmRMaXN0YXtcclxuICAgIElETElTVEE6c3RyaW5nO1xyXG4gICAgU0tVOnN0cmluZztcclxuICAgIExPVEU6c3RyaW5nO1xyXG4gICAgUFJFQ0lPOm51bWJlcjtcclxuICAgIExCOiBudW1iZXI7XHJcbiAgICBMQzogbnVtYmVyO1xyXG4gICAgTEQ6IG51bWJlcjtcclxuICAgIFNVQklORElDRTogc3RyaW5nO1xyXG4gICAgUE9SSUdJTkFMOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgTTNQcmVzZW50YWNpb25lcyA9IG5ldyBBcnJheTxNM1ByZXNlbnRhY2lvbmVzPigpO1xyXG59IiwiaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNDb2RzWFBSRCB9IGZyb20gXCIuL00zQ29kc1hQUkQudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tSZWdsYXMgfSBmcm9tIFwiLi9NM1ByZFBhY2tSZWdsYXNcIjtcclxuZXhwb3J0IGNsYXNzIE0zUHJkR2VuZXJhbCB7XHJcbiAgICBTS1U6IHN0cmluZztcclxuICAgIExPVEU6IHN0cmluZztcclxuICAgIE5PTUJSRTE6IHN0cmluZztcclxuICAgIE5PTUJSRUxBUkdPOiBzdHJpbmc7XHJcbiAgICBBQ1QxQ1RCTDogc3RyaW5nO1xyXG4gICAgQUNUMkNUQkw6IHN0cmluZztcclxuICAgIENUQkxEUFJEOiBzdHJpbmc7XHJcbiAgICBDVEJMRElNUFBSRDogc3RyaW5nO1xyXG4gICAgU0tQMTogc3RyaW5nO1xyXG4gICAgU0tQMjogc3RyaW5nO1xyXG4gICAgU0tQMzogc3RyaW5nO1xyXG4gICAgU0tQNDogc3RyaW5nO1xyXG4gICAgU0tQNTogc3RyaW5nO1xyXG4gICAgRElTUE9OSUJMRTogbnVtYmVyO1xyXG4gICAgRElTUE9OSUJMRVJlZjogbnVtYmVyO1xyXG4gICAgTTNQQUNLOiBBcnJheTxNM1ByZFBhY2tEZXQ+ID0gbnVsbDtcclxuICAgIE0zUGFja1JlZ2xhczogQXJyYXk8TTNQcmRQYWNrUmVnbGFzPiA9IG51bGw7XHJcbiAgICBMb00zTGlzdGFQcmVjaW8gPSBuZXcgQXJyYXk8TTNQcmRMaXN0YT4oKTtcclxuICAgIExvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICBNM0NvZHMgPSBuZXcgQXJyYXk8TTNDb2RzWFBSRD4oKTtcclxuICAgIEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BSREltcHVlc3Rvcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJESW1wdWVzdG9zIHtcclxuICAgIENvZEltcDogc3RyaW5nO1xyXG4gICAgTWV0b2RvbG9naWE6IHN0cmluZztcclxuICAgIFZhbG9yOiBudW1iZXI7XHJcbn0iLCJpbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0J5VGlwbyB9IGZyb20gXCIuL20zLXBhY2stYnktdGlwb1wiO1xyXG5pbXBvcnQgeyBNM1BVbmlkTWVkaWRhIH0gZnJvbSBcIi4vbTNwLXVuaWQtbWVkaWRhXCI7XHJcbmltcG9ydCB7IE0zUHJkR3JwQXNvY2lhZG8gfSBmcm9tIFwiLi9NM1ByZEdycEFzb2NpYWRvXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZU0zUHJkR3JwIHtcclxuICAgIFNLUDE6IHN0cmluZztcclxuICAgIFJBVElORzogbnVtYmVyO1xyXG4gICAgRklDSEFURUNOSUNBOiBzdHJpbmc7XHJcbiAgICBNQVJDQTogc3RyaW5nO1xyXG4gICAgQ0xBU0lGSUNBQ0lPTjogc3RyaW5nO1xyXG4gICAgTk9NQlJFOiBzdHJpbmc7XHJcbiAgICBUSVBPOiBzdHJpbmc7XHJcbiAgICBDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgQ2FtcG9zQWRpY2lvbmFsZXM6IHN0cmluZztcclxuICAgIExvTTNQcmRHZW5lcmFsID0gbmV3IEFycmF5PE0zUHJkR2VuZXJhbD4oKTtcclxuICAgIExvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBBcnJheTxNM1ByZEFkaWNpb25hbGVzPigpO1xyXG4gICAgTTNQQUNLQllUSVBPID0gbmV3IEFycmF5PE0zUHJkUGFja0J5VGlwbz4oKTtcclxuICAgIE0zUHJkR3JwQXNvY2lhZG86QXJyYXk8TTNQcmRHcnBBc29jaWFkbz4gPSBudWxsO1xyXG5cclxuICAgIGxpc3RJbWFnZW5lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICBJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8VHlwZUltcHVlc3Rvc1BSRD4oKTtcclxuICAgIE0zUFVuaWRNZWRpZGE6IE0zUFVuaWRNZWRpZGE7XHJcblxyXG4gICAgZW5jb250cmFkb0xvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZUltcHVlc3Rvc1BSRCB7XHJcbiAgICBDb2RJbXA6IHN0cmluZztcclxuICAgIE1ldG9kb2xvZ2lhOiBzdHJpbmc7XHJcbiAgICBWYWxvcjogc3RyaW5nXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQSW1wdWVzdG9ze1xyXG4gICAgcHVibGljIFBvcmNlbnRhamU6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBMaW1pdGVPcHVlc3RvOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb2RJbXB1ZXN0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQmFzZTpudW1iZXI7XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICBwdWJsaWMgTm9tYnJlQ29uY2VwdG86IHN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQSXRlbXNXRUIge1xyXG4gICAgcHVibGljIGRDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHVibGljIGRQcmVjaW9Ub3RhbDogbnVtYmVyO1xyXG4gICAgcHVibGljIEJpc1Byb2R1Y3RvUHJvbW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBCaXNPYnNlcXVpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRTUlY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgSWRQcm9jZXNvOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9ic2VydmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBTdWJFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBQYXRoSW1hZ2VuOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBJREVuY1JlcGV0aWRvOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBJREVuY1Byb2Nlc2FkbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgSURFbmNQYWRyZTogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgVGlwb0FncnVwYWNpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ29kaWdvQmFycmFzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENhbXBvc0FkaWNpb25hbGVzID0gW107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BEZXRhbGxlQ3Vwb24ge1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZDogbnVtYmVyO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1BEaW5hbWljYXMge1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbmNGUCB7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyO1xyXG4gICAgcHVibGljIERlc2NyaXBjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG86c3RyaW5nO1xyXG4gICAgcHVibGljIElkVGlwb1BhZ286bnVtYmVyOyAvLzE6IEVmZWN0aXZvIDI6IFRhcmpldGEgZGUgY3LDg8KpZGl0byAzOiBUYXJqZXRhIERlYml0byA0OiBQU0VcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsQ2FtYmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxPdHJhQ2xhc2k6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcblxyXG4gICAgLy9WYXJpYWJsZXMgU29sb0Zyb250XHJcbiAgICBwdWJsaWMgQVBMQ2FtYmlvOnN0cmluZztcclxuICAgIHB1YmxpYyBBUExGaWRlbGl6YWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIGRlamFyX2JvcnJhcjpib29sZWFuID0gdHJ1ZTtcclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BFbnZpb3MgfSBmcm9tIFwiLi9tMy1wLWVudmlvc1wiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVuY0l0ZW1zIHtcclxuICAgIHB1YmxpYyBJZFByb2R1Y3RvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTG90ZTogc3RyaW5nO1xyXG4gICAgcHVibGljIElEOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgT3JkZW46IG51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6IHN0cmluZztcclxuICAgIHB1YmxpYyBDb2RpZ29CYXJyYXM6IHN0cmluZztcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBESVNQT05JQkxFOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIFBhdGhJbWFnZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNERVQgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPigpOyAgICBcclxuICAgIHB1YmxpYyBNM0RldEN1cG9uZXMgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG4gICAgcHVibGljIE0zUEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BJbXB1ZXN0b3M+KCk7XHJcbiAgICBwdWJsaWMgTTNQRGluYW1CeUFjdGl2aWRhZCA9IG5ldyBBcnJheTxNM1BEaW5hbUJ5QWN0aXZpZGFkPigpO1xyXG5cclxuICAgIC8vRXN0YXMgcHJvcGllZGFkZXMgbm8gc29uIHJlcGxpY2EgYSBiYXNlIGRlIGRhdG9zLCBzb24gcGFyYSB1c28gaW50ZXJuby5cclxuICAgIHB1YmxpYyBQcm9tb0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG5cclxuICAgIHB1YmxpYyBJZEVuY1BhZHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvQWdydXBhY2lvbjpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWFcclxuICAgIHB1YmxpYyBHZXRQcmljZVVuaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGVsIHByZWNpbyB1bml0YXJpYSwgY29uIGRlc2N1ZW50b3MgaW5jbHVpZG9zXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VVbml0TmV0bygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWEsIGNvbiBkZXNjdWVudG9zIGluY2x1aWRvc1xyXG4gICAgcHVibGljIFNldFByaWNlVW5pdE5ldG8oaVZhbG9yKSB7XHJcbiAgICAgICAgdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBpVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdG90YWwuXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VUb3RhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVudmlvc3tcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEZvcm1hRW52aW86bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZUZFbnZpbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGlyZWNjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBQYWlzOnN0cmluZztcclxuICAgIHB1YmxpYyBDaXVkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxufSIsImV4cG9ydCBjbGFzcyBNM0ZUcmFiYWpve1xyXG4gICAgcHVibGljIElkSHViOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWM6bnVtYmVyO1xyXG4gICAgcHVibGljIElkSHViUHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWNQcmU6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0ZQIH0gZnJvbSBcIi4vbTMtcGVuYy1mcFwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSBcIi4vbTMtcHJvbS1jb21iXCI7XHJcbmltcG9ydCB7IE0zRlRyYWJham8gfSBmcm9tIFwiLi9tMy1mLXRyYWJham9cIjtcclxuaW1wb3J0IHsgTTNQRW52aW9zIH0gZnJvbSBcIi4vbTMtcC1lbnZpb3NcIjtcclxuaW1wb3J0IHsgTTNQUmVjZXBjaW9uIH0gZnJvbSBcIi4vbTMtcHJlY2VwY2lvblwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQZXJYUHJvY2VzbyB9IGZyb20gXCIuL20zLXBlci14LXByb2Nlc29cIjtcclxuaW1wb3J0IHsgTTNSZWdpc3Ryb1RyeCB9IGZyb20gXCIuL20zLXJlZy10cnhcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvcyB7XHJcbiAgICBwdWJsaWMgSWRNMzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRmVjaGE6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9UZXJjZXJvOm51bWJlcjtcclxuICAgIHB1YmxpYyBURG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBORG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBVYmljMTpudW1iZXI7XHJcbiAgICBwdWJsaWMgVWJpYzI6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yTmV0bzpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFZhbE90cmFDbGFzaTpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgU3ViRXN0YWRvRGVzOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG9EZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIFN1YkVzdGFkb0FudDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvQW50OnN0cmluZztcclxuICAgIHB1YmxpYyBUTUlkUHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUREaWFyaW86c3RyaW5nO1xyXG4gICAgcHVibGljIElERGlhcmlvQ2llcnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBJREh1YjpudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1RSWDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICBwdWJsaWMgTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPigpO1xyXG4gICAgcHVibGljIGxNM1BEaW5hbWljYXMgPSBuZXcgQXJyYXk8TTNQRGluYW1pY2FzPigpO1xyXG4gICAgcHVibGljIE0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgIHB1YmxpYyBsTTNQRW5jRlAgPSBuZXcgQXJyYXk8TTNQRW5jRlA+KCk7XHJcbiAgICBwdWJsaWMgTTNGVHJhYmFqbyA9IG5ldyBNM0ZUcmFiYWpvKCk7XHJcbiAgICBwdWJsaWMgTTNQRW52aW9zID0gbmV3IEFycmF5PE0zUEVudmlvcz4oKTtcclxuICAgIHB1YmxpYyBNM1BSZWNlcGNpb24gPSBuZXcgQXJyYXk8TTNQUmVjZXBjaW9uPigpO1xyXG4gICAgcHVibGljIGxNM1JlZ2lzdHJvVHJ4ID0gbmV3IEFycmF5PE0zUmVnaXN0cm9Ucng+KCk7XHJcbiAgICBwdWJsaWMgZXNwZXJhOiBib29sZWFuO1xyXG4gICAgcHVibGljIGZlY2hhSG9yYTogRGF0ZTtcclxuICAgIFxyXG4gICAgcHVibGljIEZlY2hhSG9yYUVzdGFkbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFc3RhZG86c3RyaW5nO1xyXG5cclxuXHJcbiAgICAvL0VzdGFzIHByb3BpZWRhZGVzIG5vIHNvbiByZXBsaWNhIGEgYmFzZSBkZSBkYXRvcywgc29uIHBhcmEgdXNvIGludGVybm8uXHJcbiAgICAvL3B1YmxpYyBsTTNQcm9tQ29tYmluYWRhID0gbmV3IEFycmF5PE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvPigpO1xyXG5cclxuICAgIHB1YmxpYyBQcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuXHJcbiAgICBwdWJsaWMgQXBsUGFnb0VuTGluZWE6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBBcGxEZXNkZVNlcnZlcjpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIG5kb2NVQWN0aXZvOnN0cmluZzsgLy9KQUdNIDIwMTkxMDE3IE51ZXZvcyBwYXJhbWV0cm9zLHBhcmEgbGxldmFyIGVsIHJlZ2lzdHJvIGRlbCB1c3VhcmlvIGFjdGl2bywgcXVlIGNyZW8gZXN0ZSBwcm9jZXNvXHJcbiAgICBwdWJsaWMgdGRvY1VBY3Rpdm86c3RyaW5nOy8vSkFHTSAyMDE5MTAxNyBOdWV2b3MgcGFyYW1ldHJvcyxwYXJhIGxsZXZhciBlbCByZWdpc3RybyBkZWwgdXN1YXJpbyBhY3Rpdm8sIHF1ZSBjcmVvIGVzdGUgcHJvY2Vzb1xyXG4gICAgLy9wdWJsaWMgYkFQTENvbWJpbmFkYXNBY3VtOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuRmVjaGEgPW1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJlY2VwY2lvbntcclxuICAgIHB1YmxpYyBJZFJlY2VwY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRFbmM6bnVtYmVyO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBGZWNoYTpEYXRlOyAgICBcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcbiAgICBwdWJsaWMgRXN0YWRvOiBzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQZXJYUHJvY2Vzb3tcclxuICAgIHB1YmxpYyBUaXBvUGVyc29uYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGRvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTmRvYzpzdHJpbmc7ICAgIFxyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGVzY1RpcG9QOnN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgIE0zT3RDbGFzaWZpY2FjaW9uZXN7XHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIElkUHJvZHVjdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBPcmRlbjpudW1iZXI7Ly9WYXJpYWJsZSBkZSBvcmRlbmFtaWVudG8gZW4gZWwgZnJvbnRcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VNM0ZFIHtcclxuXHJcbiAgICBwdWJsaWMgYWRkX3Byb2Nlc29fZ2VuZXJhckZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvYWRkX3Byb2Nlc29fZ2VuZXJhckZFL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvX2dlbmVyYXJOQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM0ZFL2FkZF9wcm9jZXNvX2dlbmVyYXJOQy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGRQcm9jZXNvR2VuZXJhckZFQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQganNvbjtcclxuICAgICAgICBsZXQgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9hZGRfcHJvY2Vzb19nZW5lcmFyRkUvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJDYXJ0YVBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZG0zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJDYXJ0YVBvcnRlL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBpZG0zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJGRUFudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWChcIkZFTVgvZ2VuZXJhckZFQW50aWNpcG9zL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJOQ0FudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJOQ0FudGljaXBvcy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEluZm9GYWN0dXJhRWxlY3Ryb25pY2EoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogaWRfa2F0aW9zLnRyaW0oKSB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zRkUvZ2V0SW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSW5mbylcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRIdG1sRnJvbUZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGlkTTM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZXNwO1xyXG4gICAgICAgIGxldCBkYXRhID0geyAnaWRNMyc6IGlkTTMgfTtcclxuICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM0ZFL2dldEh0bWxGcm9tRkUvJyArIGlkS2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBJVV9JbmZvRmFjdHVyYUVsZWN0cm9uaWNhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRmFjdHVyYTogYW55LCB1VEFjdGl2bzogc3RyaW5nLCB1TkFjdGl2bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCksICdvRmFjdHVyYSc6IG9GYWN0dXJhLCAndVRBY3Rpdm8nOiB1VEFjdGl2bywgJ3VOQWN0aXZvJzogdU5BY3Rpdm8gfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zRkUvSVVfSW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsSW5zU2VyaWVzeFViaWMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9kZWxJbnNTZXJpZXN4VWJpYy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTsgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyW1wiX2JvZHlcIl0pLk1lc3NhZ2UpLlJFU1BVRVNUQVtcIjBcIl0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvRUEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiUHJvY2Vzb3NNMy9hZGRfcHJvY2Vzb0VBL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBNM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnUHJvY2Vzb3NNMy9NM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkLycgKyBzSURLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9sUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3MgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9sUHJvY2Vzb3MuUkVTUFVFU1RBLlRQLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCA9IG5ldyBBcnJheShvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBsYSBsaXN0YSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhLCB1biBhcnJheSBkZSBmaWx0cm9zLlxyXG4gICAgcHVibGljIE0zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgLy9TaSBsYXMgYWN0aXZpZGFkZXMgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIGlmIChvbFByb2Nlc29zLlJFU1BVRVNUQS5BQ1RJVklEQURFUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMgPSBuZXcgQXJyYXkob2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxvcyBwcm9jZXNvcyBubyB2aWVuZW4gY29tbyB1biBhcnJheSwgY29udmVydGlybG9cclxuICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMuZm9yRWFjaChBY3RpdmlkYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjdGl2aWRhZC5QUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIEFjdGl2aWRhZC5QUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEFjdGl2aWRhZC5QUk9DRVNPUyA9IG5ldyBBcnJheShBY3RpdmlkYWQuUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgbGlzdGEgZGUgcHJvZHVjdG8sIHRlbmllbmRvIGVuIGN1ZW50YSwgdW4gYXJyYXkgZGUgZmlsdHJvcy5cclxuICAgIHB1YmxpYyBNM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIHNJZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28vJyArIHNJREthdGlvcyArICcvJyArIHNJZFByb2Nlc28sIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zTTM7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGFzIGFjdGl2aWRhZGVzIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBpZiAob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zTTMuUkVTUFVFU1RBLlNVQkVTVEFET1MgPSBuZXcgQXJyYXkob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsb3MgcHJvY2Vzb3Mgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUy5mb3JFYWNoKHN1YnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YnMuTTNQUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIHN1YnMuTTNQUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnMuTTNQUk9DRVNPUyA9IG5ldyBBcnJheShzdWJzLk0zUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvc00zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgTTNwcm9jZXNvcywgZGVzZGUgZWwgaWRkaWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TTNQcm9jZXNvc0J5SWREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZERpYXJpbzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZERpYXJpb1wiOiBzSWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldE0zUHJvY2Vzb3NCeUlkRGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIE0zcHJvY2Vzb3MsIFRlbmllbmRvIGVsIElETTMuICAgIFxyXG4gICAgcHVibGljIE0zR2V0X00zUHJvY2Vzb3NCeUlkTTMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJRE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIHViaWNFeHRlcm5vID0gZmFsc2UsIGJBUExQYWdvc1BEID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgdmFyIG9EYXRhO1xyXG4gICAgICAgIG9EYXRhID0geyBcIklkTTNcIjogc0lETTMsIFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28gfTtcclxuICAgICAgICBpZiAoYkFQTFBhZ29zUEQpIHtcclxuICAgICAgICAgICAgb0RhdGEuYkFQTFBhZ29zUEQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldFByb2Nlc29NM0J5SWRNMy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgLy9WYWxpZGFyIHF1ZSBsYSB1YmljYWNpb24gYWN0dWFsZXMgdmFsaWRhIHBhcmEgZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICAvL3BjYXN0cm8sIHNlIGNvbWVudGFyZWEgcG9ycXVlIG5vIGZ1bmNpb25hIGNvbiB0ZiwgcmV0b3JuYSBwYXJhIFRGIFNJRU1QUkUgTlVMTCwgbm8gc2UgbWFuZWphIHViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIC8vU2UgY29sb2NhIGRpZiBhIDAsIHBvciB2ZXJzaW9uIFRGLCBxdWUgbm8gdXRpbGl6YSBmdW5jaW9uYWxpZGFkIGRlIFViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZS50b1N0cmluZygpICE9IFwiMFwiICYmIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlLnRvU3RyaW5nKCkgIT0gc1ViaWNhY2lvbi50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXViaWNFeHRlcm5vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b21hIGVsIHByb2Nlc28gcXVlIHRpZW5lIHBvciBkaW5hbWljYSBfSURNM1JldG9tYWRvIGVsIGlkbTMgZW52YWlkbyBwb3IgcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lETTM6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJpZE0zUmV0b21hZG9cIjogc0lETTMgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL2dldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkby8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkIE0zIHkgSWRwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBzVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHZXRfTTNQcm9jZXNvc0J5SWRNM0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSURNMzogc3RyaW5nLFxyXG4gICAgICAgIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLCBiQVBMUGFnb3NQRDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZE0zXCI6IHNJRE0zLCBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH07XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcbiAgICAgICAgaWYgKGJBUExQYWdvc1BEKSB7XHJcbiAgICAgICAgICAgIG9EYXRhLmJBUExQYWdvc1BEID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRQcm9jZXNvTTNCeUlkTTMvJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkRGlhcmlvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWREaWFyaW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtM19nZXRQcm9jZXNvTTNCeUlkRGlhcmlvQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGlkRGlhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiaWREaWFyaW9cIjogaWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgcmVzcDogYW55ID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldFByb2Nlc29NM0J5SWREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIGVzdHVyY3R1cmFzIGRlIGxhcyBjYXB0dXJhcyBkaW5hbWljYXMgYXNvY2lhZGFzIGF1biBwcm9jZW9zIHkgdW4gaWRwcm9jZXNvXHJcbiAgICBwdWJsaWMgbTNfZ2V0X2RhdGFfY2FwdF9kaW5hbShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy8vb0RhdGEgPSB7XCJpZF9wcm9jZXNvXCI6XCJcIixcImlkX3N1Yl9wcm9jZXNvXCI6XCJcIn07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldF9kYXRhX2NhcHRfZGluYW0vJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIFJldG9ybmEgZWwgUlBUZW1wbGF0ZSBwYXJhIGVsIGFybWFkbyBkZWwgUmVwb3J0ZVxyXG4gICAgLy8gICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAvLyAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgLy8gICogQHBhcmFtIGlkX3JlcCBcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGFzeW5jIGdldF90ZW1wbGF0ZV9yZXBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9yZXA6IHN0cmluZykge1xyXG4gICAgLy8gICAgIHZhciBvRGF0YTtcclxuICAgIC8vICAgICB2YXIgcmVzcDtcclxuICAgIC8vICAgICB2YXIgb0pzb247XHJcbiAgICAvLyAgICAgb0RhdGEgPSB7IFwiaWRfcmVwXCI6IGlkX3JlcCB9O1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvZ2V0X3RlbXBsYXRlX3JlcG9ydGUvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgLy8gICAgICAgICBvSnNvbiA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvSnNvbjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY2F0Y2h7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbG9zIHByb2Nlc29zIGFzb2NpYWRvcyBhIHVuYSBwZXJzb25hXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5UGVyc29uYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0UHJvY2Vzb0J5UGVyc29uYS8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5SWREaWFyaW9DaWVycmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldFByb2Nlc29CeUlkRGlhcmlvQ2llcnJlLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb2Nlc29zIE9mZiBsaW5lXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb3NPZmZMaW5lKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRQcm9jZXNvc09mZkxpbmUvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9lbmEgZWwgVERldGFsbGVQcm9jZXNvIGRlIHVuIHByb2Nlc28gZGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9tM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2Vzby8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKS5SRVNQVUVTVEEuRGV0YWxsZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RlbmNpYVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL3ZhbGlkYXJFeGlzdGVuY2lhUHJvY2Vzby8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Qcm9kdWN0bzogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgIHB1YmxpYyBQcmVjaW9Ub3RhbDogbnVtYmVyOyAvL1ByZWNpbyBpbmNsdXllbmRvIGxhcyBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIFByZWNpb1RvdGFsUHJvbW9jaW9uOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JUb3RhbE1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIExpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgIHB1YmxpYyBJRFByb21vY2lvbjogbnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTtcclxuICAgIHB1YmxpYyBWYWxvcjtcclxuICAgIHB1YmxpYyBWYWxvclBvcmNlbnRhamUgPSAwO1xyXG4gICAgcHVibGljIExpc3RPYnNTS1UgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhID0gbnVsbDtcclxuICAgIHB1YmxpYyBWYWxvck1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZyA9IG51bGw7XHJcbiAgICBwdWJsaWMgUmVnbGE6IHN0cmluZztcclxuICAgIHB1YmxpYyBBcGxpY2FkYTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBUaXBvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVnbGFPYnNlcTogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkT2JzZXE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBmbGFncyA9IHsgZm9ybWFQYWdvOiBmYWxzZSB9O1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vOiBBcnJheTxudW1iZXI+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvbW9jaW9uQ29tYmluYWRhIHtcclxuICAgIHB1YmxpYyBJZFByb21vY2lvblhQcm9jZXNvOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb25Db21iaW5hZGE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvMjogc3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTogc3RyaW5nO1xyXG4gICAgcHVibGljIEFjY2lvbjogYW55O1xyXG4gICAgLy9wdWJsaWMgSWRDb25kaWNpb246c3RyaW5nOyAvL0VzdG8gcGFyYSBhZ3J1cGFjaW9uIGRlIGxhIHByb21vY2lvbiBkZSBjb21iby5cclxufSIsImV4cG9ydCBjbGFzcyBNYXRoVEYge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByb3VuZChhOiBhbnksIGRlY2ltYWxzOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgbXVsdGlwbG9EZTEwID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgrYSAqIG11bHRpcGxvRGUxMCkgLyBtdWx0aXBsb0RlMTA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJvdW5kVjIoYTogYW55LCBkZWNpbWFsczogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKCsoTWF0aC5yb3VuZCgrKGEgKyAnZScgKyBkZWNpbWFscykpICsgJ2UnICsgLWRlY2ltYWxzKSkudG9GaXhlZChkZWNpbWFscykpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgdG9GaXhlZChudW1iZXIsIGRlY2ltYWxzKSB7XHJcbiAgICAgICAgdmFyIHggPSBNYXRoLnBvdygxMCwgTnVtYmVyKGRlY2ltYWxzKSArIDEpO1xyXG4gICAgICAgIHJldHVybiAoTnVtYmVyKG51bWJlcikgKyAoMSAvIHgpKS50b0ZpeGVkKGRlY2ltYWxzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDg8Kzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw4PCs24gZXN0YSBkaXNlw4PCsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDg8KxYWRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9MaXN0YVByZWNpb1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG8ob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob00zUHJkR2VuZXJhbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBkZSBwcm9kdWN0byBhZ3J1cGFkby5cclxuICAgICAqIEBwYXJhbSBvVHlwZU0zUHJkR3JwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob1R5cGVNM1ByZEdycFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBhZGljaW9uYWwsIGVzdGEgaW5mb3JtYWNpb24gYWRpY2lvbmFsIGVzdGEgZW4gdW5hIHZhcmlhYmxlIGdsb2JhbDogZ29EYXRhQWRpY2lvbmFsXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIk1PRFwiICYmICt0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dID4gK2NvbmRpY2lvbi5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gY29udHJhIHVzdWFyaW8gZGF0YS5cclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uaW5jbHVkZXMoJywnKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uc3BsaXQoJywnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShlbGVtZW50LCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbnRyYSBlbCBkZXRhbGxlIGRlIGxhIGNvbmRpY2nDg8KzblxyXG4gICAgcHVibGljIFZlcmlmaWNhY2lvbk0zRGV0YWxsZUNvbmRpY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLFxyXG4gICAgICAgIGRldENvbmRpY2lvbmVzOiBBcnJheTxNM0RFVENPTkRJUFJPTU8+LCBjb25jZXB0b0NvbmRpY2lvbjogc3RyaW5nLCBqQWRpY2lvbmFsZXNDb25kaWNpb24pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIG9kZXRDb25kaWNpb25lc0ZpbmRlZDtcclxuICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnRyaW0oKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDFcIjpcclxuXHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvVHlwZU0zUHJkR3JwLlNLUDEpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9TS1AxKzJcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSArIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tQMikpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLVVwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLlNLVS50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX0RJU1BcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUudG9TdHJpbmcoKSwgZGV0LlZhbG9yLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfVElQT1wiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLlRJUE8udG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiUEVSX1BST0NFU09cIjovLyogU29sbyB2YWxpZGEgdW5hIGRldENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgbGV0IHBlclhQcm9jZXNvOiBNM1BlclhQcm9jZXNvO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcGVyWFByb2Nlc28gPSBvTTNQcm9jZXNvcy5NM1BlclhQcm9jZXNvLmZpbmQoeCA9PiB4LlRpcG9QZXJzb25hID09IGRldENvbmRpY2lvbmVzWzBdLlZhbG9yLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJFTlwiICYmIHBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiRElGRlwiICYmICFwZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUxNQUNFTlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvTTNVYmljYWNpb24uSURVYmljYWNpb24udG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiSE9SQVJJT19IT1JBXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgb1RpbWVOb3c6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVGltZU5vdy5nZXRIb3VycygpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkxvTTNQcmRBZGljaW9uYWxlc1wiOlxyXG4gICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuQ29uY2VwdG8gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWbHJBZGkgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0bykuVkFMT1JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgVmxyQWRpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgLy9Qcm9jZXNvc1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMF0udHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb00zUHJvY2Vzb3NbcHJvcGVydHldKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVU0VSXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVsxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtwcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBFbnRybyBwb3IgRGV0YWxsZSFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgcmVzcHVlc3RhLCBjb24gb2JqZXRvIGEgdmFsaWRhclxyXG4gICAgcHVibGljIFZhbGlkYXJSZXNwdWVzdGEob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICBpZiAob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShvYmplY3RWYWxpZGF0ZS5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjUgQWdyZWdhciBzZWNjaW9uIGRlIHZhbGlkYWNpb25lcy5cclxuICAgICAgICAgICAgdmFyIGJSZXNwID0gdGhpcy5WYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9TZSBlbnZpYSBlbiBhZGljaW9uYWxlcywgZWwganNvbiBkZSBsYSBpbmZvcm1hY2lvbiBlbmNvbnRyYWRhIGRlbCBkZXRhbGxlLlxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcmVnbGFzIGNvbmZpZ3VyYWRhcyBkZXNkZSBKU09OIGRlIEFkaWNpb25hbGVzXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXMoakFkaWNpb25hbGVzOiBhbnkpIHtcclxuICAgICAgICB2YXIgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzXCIpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTICYmIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlZJR0VOQ0lBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5WYWxpZGFyVmlnZW5jaWEoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDEsIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5WQUwyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRXJyb3JcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyVmlnZW5jaWEodmFsMTogRGF0ZSwgdmFsMjogRGF0ZSkge1xyXG5cclxuICAgICAgICB2YXIgRmVjaGFBY3R1YWwgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMilcclxuXHJcbiAgICAgICAgLy8gdmFyIGRWYWwxID0gbmV3IERhdGUodmFsMSk7XHJcbiAgICAgICAgLy8gdmFyIGRWYWwyID0gbmV3IERhdGUodmFsMik7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwxKVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwyKVxyXG5cclxuXHJcbiAgICAgICAgdmFyIG5GZWNoYUFjdHVhbDogbnVtYmVyID0gK3RoaXMuR2V0RmVjaGFOdW1iZXIoRmVjaGFBY3R1YWwpOyAvLysoRmVjaGFBY3R1YWwuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBGZWNoYUFjdHVhbC5nZXRNb250aCgpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldERhdGUoKSk7XHJcbiAgICAgICAgdmFyIG5WYWwxOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwxKTsgLy8rKGRWYWwxLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZFZhbDEuZ2V0TW9udGgoKSArIFwiXCIgKyAoK2RWYWwxLmdldERhdGUoKSArIDEpICk7XHJcbiAgICAgICAgdmFyIG5WYWwyOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwyKSAvLysoZFZhbDIuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMi5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDIuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICBpZiAobkZlY2hhQWN0dWFsID49IG5WYWwxICYmIG5GZWNoYUFjdHVhbCA8PSBuVmFsMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RmVjaGFOdW1iZXIoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHZhciBkID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuICAgICAgICByZXR1cm4gZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIGFjY2lvbiwgc2kgbm8gdGllbmUgY2FyZ2FkYSB1bmEuIEVzdGEgYWNjaW9uIHNlIGNhcmdhIGplcmFycXVpY2FtZW50ZS5cclxuICAgIHB1YmxpYyBWYWxpZGFyQWNjaW9uKGpSZXNwLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIganNvbkFkaWMgPSBKU09OLnBhcnNlKGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsICYmIGpzb25BZGljLlJPT1QuQWNjaW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgalJlc3AuQWNjaW9uID0ganNvbkFkaWMuUk9PVC5BY2Npb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUmV0b21hciBpbmZvcm1hY2nDg8KzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDg8KzbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIGFwbGljYXIgbGEgcHJvbW9jaW9uIHkgbGFzIHByb21vY2lvbmVzIGEgYXBsaWNhclxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9jaW9uKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGdzSWRLYXRpb3MgPSBudWxsKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICB2YXIgb0xpc3RhRmluZGVkID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxDO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDg8KhIGEgZmx1am8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG1vbmVkZXJvOiBudW1iZXIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIGxldCBwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8gPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAvL1NpIGVsIHByb2R1Y3RvIGVzdGEgcmVzdHJpbmdpZG8gbGUgZGEgbWF5b3IgcHJpb3JpZGFkIGEgZXN0YSBwcm9tb2Npw4PCs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW8uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vLy8vLy9GVU5DSU9OQUxJREFEIFBST0RSSUEgRlVOQ0lPTkFSIE3Dg8KBUyBBREVMQU5URSwgU0kgU0UgUVVJRVJFIEFHUlVQQVIgTEFTIFBST01PQ0lPTkVTIEFDTSBZIEVYQ1xyXG4gICAgICAgICAgICAvLyBpZihkUHJvbW9BQ00gPT0gMCAmJiBkUHJvbW9FWEMgPT0gMCl7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGVuY29udHJhcm9uIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgaWYoZFByb21vQUNNID4gZFByb21vRVhDKXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgYWN1bXVsYXRpdmFzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5mb3JFYWNoKHggPT4geC5BcGxpY2FkYSA9IHRydWUpOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jOy8vLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIilcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3JNb25lZGVybyksIDApO1xyXG4gICAgICAgICAgICAvLyAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGV4Y2x1eWVudGVzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4ocHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9FWEM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9tb0V4YzogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9FWEMgPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vRXhjID0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSB2YWxvclByb21vRVhDIHx8IHguVmFsb3JNb25lZGVybyA9PSB2YWxvclByb21vRVhDKTtcclxuICAgICAgICAgICAgcHJvbW9FeGMuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tb0V4Yy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFwbGljYVByb21vQUNNRElOKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vQUNNRElOOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0FDTURJTiA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhID09IFwiQUNNRElOXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyB2YWxvclByb21vQUNNRElOKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBtYXhpbW8gdmFsb3Igc2VndW4gbGEgcmVnbGEgYSBjb21wYXJhclxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgXHJcbiAgICAgKiBAcGFyYW0gc1JlZ2xhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgc1JlZ2xhOiBzdHJpbmcsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3dpdGNoIChzUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJBQ01cIjpcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXN1bHQgPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICF4LmZsYWdzLmZvcm1hUGFnbykucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvciksIDApO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFDTURJTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVjaW9BY3R1YWwgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclRvdGFsRGVzY3VlbnRvID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTURJTlwiICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9IChwcmVjaW9BY3R1YWwgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbG9yVG90YWxEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRVhDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKS5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8uVmFsb3IgPiBvLlZhbG9yTW9uZWRlcm8gPyBvLlZhbG9yIDogby5WYWxvck1vbmVkZXJvOyB9KSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbiBzZWd1biBlbCB0aXBvIFxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uOiBhbnksIFByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgQWNjaW9uO1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IFByb21vY2lvbmVzQXNvY2lhZGFzKCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLlByb21vY2lvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbiA9IHByb21vY2lvbi5Qcm9tb2Npb24uSUQ7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlID0gcHJvbW9jaW9uLlByb21vY2lvbi5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICBBY2Npb24gPSBwcm9tb2Npb24uQWNjaW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5SZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IEFjY2lvbi5SZWdsYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gXCJFWENcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMjtcclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArQWNjaW9uLlZhbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCtBY2Npb24uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAreC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNhbnRpZGFkT2JzcSA9IHNWYWxvckNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgIC8vIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIC8vIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgakFkaWM6YW55ID0gSlNPTi5wYXJzZShwcm9tby5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2xhc2lmaWNhY2lvbiA9IGpBZGljLlJPT1QuQWNjaW9uLkNhcmFjdGVyaXN0aWNhO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcyA9IHByb21vLk0zQ09ORElBR1JVUEFDSU9OWzBdLk0zQ09ORElQUk9NTy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLklEQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uSWRDb25kaWNpb24gPSBwcm9tb2Npb24uSURDb25kaWNpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEZpbiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5Qcm9tb0NvbWJpbmFkYXNWMihvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb2Nlc2FyQ29tYmluYWRhXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVjIgQ09NQklOQURBXHJcbiAgICAvKipcclxuICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzIGRlIE0zUHJvY2Vzb3NcclxuICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gT2JqZXRvIE0zIFByb2Nlc29zLCBlbCBjdWFsIHNlIHJlY29ycmVyw4PCoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDg8KzbiBzaSBsYSBwcm9tb2Npw4PCs24gcXVlIGxsZWdhIGNvbW8gcGFyYW1ldHJvLCBlcyBhY3VtdWxhYmxlIG8gbm9cclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRFc0FjdW11bGFibGVQcm9tbyhwcm9tb2Npb246IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uLlJlZ2xhICYmIHByb21vY2lvbi5BY2Npb24uUmVnbGEgPT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldEVzQWN1bXVsYWJsZVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgbGV0IHByb2RzQXBsRGVzY3VlbnRvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgc2t1QXBsRGVzY3VlbnRvczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjOyAvL1t7U0tVOlwiWFhYWFhYXCJ9LCB7U0tVOlwiWVlZWVlZWVwifV1cclxuICAgICAgICBsZXQgbWF4TnVtRGVzY3VlbnRvcyA9ICtjb21iaS5BY2Npb24ubWF4TnVtRGVzYztcclxuICAgICAgICBsZXQgY29udERlc2NBcGxpY2Fkb3MgPSAwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyArY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB9LCAwKSAqIG1heE51bURlc2N1ZW50b3M7XHJcblxyXG4gICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28uTTNFTkMuZm9yRWFjaChvTTNQRW5jSXRlbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy9BcGxpY2EgdGFudG9zIGRlc2N1ZW50b3Mgc2UgcHVlZGFuIGEgcGxhaWNhciBhIGNhZGEgdmFsb3IgZGUgbFByZWNpb1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kc0FwbERlc2N1ZW50bywgY29tYmksIHRydWUsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvcyBlbiBlbCBjaWVycmVcclxuICAgICAqIFZhbGlkYSB0b2RhIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICogVmFsaWRhIGxhIHByb21vY2nDg8KzbiwgcG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcywgY3XDg8KhbnRvcyBvYnNlcXVpb3Mgc2UgcHVlZGVuIGRhci5cclxuICAgICAqIFRyYWUgdG9kb3MgbG9zIG9ic2VxdWlvcyBxdWUgc2UgaW5ncmVzYXJvbiBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXMsIGxvcyBsaXN0YVxyXG4gICAgICogY29sb2NhIGVuIHZhbG9yIDAgbG9zIG9ic2VxdWlvcyBxdWUgc2VsZWNjaW9ubyBhdXRvbWF0aWNhbWVudGUgZWwgYWxnb3JpdG1vXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcywgaW1wdWVzdG9zIHkgZGVtYXMgdmFsb3JlcyB0b3RhbGVzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgbG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zIGFsIGNhcnJpdG8gcXVlIHRpZW5lbiBvYnNlcXVpb1xyXG4gICAgICogQHBhcmFtIGNvbWJpIEluZm9ybWFjacODwrNuIGRlIHByb21vY2nDg8KzbiBkZSBvYnNlcXVpb3NcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBQcm9jZXNvIGNvbiB0b2RvcyBsb3MgcHJvZHVjdG9zIGUgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vT2JzcUNpZXJyZShvTGlzdEVuY2FiOiBBcnJheTxhbnk+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29bJ1Byb2R1Y3Rvc0NvbWJpJ10gPSBbXTtcclxuICAgICAgICBsZXQgY2FudFBvck9icyA9ICtjb21iaS5BY2Npb24uQ2FudGlkYWRPYnNxOyAvL1BvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGNvbiBsYSBwcm9tb2Npw4PCs24gc2UgZGFyw4PCoSBlbCBvYnNlcXVpby5cclxuICAgICAgICBsZXQgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBtM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NDYW50aWRhZCA9IDBcclxuICAgICAgICAvLyB2YXIgY2FudE9ic2VxdWlvczogbnVtYmVyID0gMDsgLy9DYW50aWRhZCBkZSBvYnNlcXVpb3MgcXVlIHNlIGRhcsODwqEgcG9yIGVzdGEgY29tcHJhLlxyXG5cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0byBvZiBvTGlzdEVuY2FiKSB7XHJcbiAgICAgICAgICAgIHN1bWFWYWxvclByb2R1Y3RvcyArPSBwcm9kdWN0by5QVU5JVE5FVE87XHJcbiAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSsrO1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9SZXZpc2FkbyA9IHByb2R1Y3Rvc1JldmlzYWRvcy5maW5kKHggPT4geC5JZCA9PSBwcm9kdWN0by5JRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0b1JldmlzYWRvKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBwcm9kdWN0by5JRCwgQ2FudGlkYWQ6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW50QWdyZWdhZGEgPT09IGNhbnRQb3JPYnMpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJvZHVjdG9zUmV2aXNhZG9zKTtcclxuICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb21iaS5BY2Npb24uQ29kaWdvKSBjb25zb2xlLmVycm9yKCdFbCBjw4PCs2RpZ28gZGVsIGNvbWJvIG5vIGVzdGEgY29uZmlndXJhZG8gZW4gTTNERVRDT05ESVBST01PJylcclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwICYmIGNvbWJpLkFjY2lvbi5Db2RpZ28pIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDg8KhIHkgc2Ugb3JkZW5hcsODwqEgZGUgbWF5b3IgYSBtZW5vclxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWMobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgICAgICB2YXIgaXg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGl5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgICAgICAgICB4ID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy9TZSBpdGVyYSBlbCBhcnJlZ2xvIGRlIHByaW5jaXBpbyBhIGZpbiB5IGRlIGZpbiBhIHByaW5jaXBpby4uLiBcclxuICAgICAgICAvLy9Db25mb3JtZSBzZSByZWNvcnJlIGVsIGFycmVnbG8gZGUgZmluIGEgcHJpbmljaW8sIHNlIHZhIGRhbmRvIGxhIHByb21vY2nDg8KzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacODwrNuIGVzdGEgaW5jb21wbGV0YSwgbG9zIHByb2R1Y3RvcyBkZSBsYSBtaXRhZCBxdWVkYW4gc2luIHByb21vY2nDg8KzbiBcclxuICAgICAgICB2YXIgaTogbnVtYmVyID0gMDtcclxuICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgaiA9ICtsUHJlY2lvcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxQcmVjaW9zLmxlbmd0aCAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpeCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpeSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl4IDwgeCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpeCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeSA8IHkgJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSArbFByZWNpb3Nbal0uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXkrKztcclxuICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICAgICAgLy9KR0FNIDIwMTkxMDIzLCBmdW5jaW9uYWxpZGFkIGRlIHF1ZSBzb2xvIGVudHJhIGFjw4PCoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDg8KzbiBcclxuICAgICAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yIC0gcHJlY2lvVG90YWxBbnRlcmlvcilcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxvclByb21vY2lvbmVzKGVuYywgZFZhbG9yQWN0ICsgZFZhbG9yUHJvbW9BbnQpO1xyXG4gICAgICAgICAgICB0aGlzLkFncmVnYXJMaXN0YVByb21vKGVuYywgY29tYmksIGRWYWxvckFjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb1VuaXRGcm9tVG90YWwoZW5jLCBkUHJlY2lvTnVldm8pO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST01PQ19cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmlsdGVyKHggPT4geC5Ob21icmVDb25jZXB0by50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJWQUxfUFJPX0NPTUJJX1wiKSkuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpbyB1bml0YXJpbywgYSBwYXJ0aXIgZGUgdW4gbnVldm8gcHJlY2lvIFRvdGFsLlxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBuZXdQcmljZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYzogTTNQRW5jSXRlbXMsIG5ld1ByaWNlOiBudW1iZXIpIHtcclxuICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gKCtuZXdQcmljZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIHRvZG9zIGxvcyBwcmVjaW9zIGRlIHVuIHByb2R1Y3RvIHNlIGNhbWJpYXJvbiBvIG5vLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGNvbiB0b2RvcyBsb3MgaXRlbXNcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgLy9DaGVjaywgc2kgYWxndW5vIGRlIGxhIGxpc3RhIGRlIHByZWNpbyBlcyBpZ3VhbCBhbCBwcmVjaW8gYW50ZXJpb3JcclxuICAgICAgICB2YXIgcHJlY2lvQW50ZXJpb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuZmluZCh4ID0+IHguUFVOSVRORVRPID09IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgaWYgKHByZWNpb0FudGVyaW9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yZXMgZGUgcHJvbW9jaW9uZXMgZGVwZW5kaWVuZG8gZGVsIG51bWVybyBkZSBpdGVtcyBxdWUgbm8gc2UgbW9kaWZpY2Fyb25cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3M6IEFycmF5PGFueT4sIGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFZhbG9yID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgbnVtZXJvSXRlbXMgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGRVbml0UHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK251bWVyb0l0ZW1zICogK2RVbml0UHJvbW87XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgZGUgbGEgcHJvbW9jaW9uIHF1ZSBzZSBlc3RhIHByb2Nlc2FuZG8gYWN0dWFsbWVudGVcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3JQcm9tb0FudCBcclxuICAgICAqIEBwYXJhbSB2YWxvdFRvdGFsTnVldm8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQUN0KGVuYzogTTNQRW5jSXRlbXMsIHZhbG9yUHJvbW9BbnQ6IG51bWJlciwgdmFsb3RUb3RhbE51ZXZvOiBudW1iZXIsIHByZWNpb1RvdGFsQW50OiBudW1iZXIsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JUb3RhbFNpbkR0bzogbnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQcm9tb0FjdDogbnVtYmVyO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2kgdmllbmUgYWN1bXVsYWJsZSB1dGlsaXphciBlbCBwcmVjaW8gYW50ZXJpb3IsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBkdG8uXHJcbiAgICAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvclRvdGFsU2luRHRvID0gcHJlY2lvVG90YWxBbnQ7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3JQcm9tb0FudCAtICt2YWxvdFRvdGFsTnVldm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3JQcm9tb0FjdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldFZhbG9yUHJvbW9BQ3Q6IFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lcyhlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvbmRlbyBkZWwgdmFsb3IgZGUgcHJvbW9jaW9uXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYxOCBTZSBhZ3JlZ2EgZWwgdmFsb3IgdW5pdGFyaW8gZGUgbGEgcHJvbW9jacODwrNuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yID0gKCsoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gIC8qKlxyXG4gICAgLy8gICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgLy8gICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzRnJvbUxpc3RhUHJlY2lvcyhlbmM6IE0zUEVuY0l0ZW1zLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKVxyXG4gICAgLy8gICAgIH0gY2F0Y2h7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjQmV0YShsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAvLyAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgLy8gICAgICAgICB2YXIgaVNpemVQcmVjOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAvLyAgICAgICAgIHZhciBpTWl0YWQ6IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAvLyAgICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAvLyAgICAgICAgIHZhciBpRHRvOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAvLyAgICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSAoK3kpIC8gKCtpU2l6ZVByZWMpO1xyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSBNYXRoLmNlaWwoKCtpTWl0YWQpICogKCt4KSkgLSAxO1xyXG5cclxuICAgIC8vICAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgaVggPSAwO1xyXG4gICAgLy8gICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaUR0byA9IGlNaXRhZDtcclxuICAgIC8vICAgICAgICAgICAgIHdoaWxlIChpRHRvIDwgaVNpemVQcmVjKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlKGlYIDwgeCl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlYKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gaVggPSAwO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAvLyAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGxpc3RhIGRlIGRldGFsbGUgZWw6ICBOT01CX1BST01PQywgVkFMX1BST01PQyB5IElEX1BST01PQ1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJMaXN0YVByb21vKGVuYzogTTNQRW5jSXRlbXMsIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGRWYWxvclByb21vQ29tYmk6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkZXROb21icmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldFZhbG9yZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0SWRzOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zTmFtZXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zVmFsczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNJZHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIik7XHJcblxyXG4gICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLk5vbWJyZUNvbmNlcHRvID0gXCJOT01CX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLk5vbWJyZUNvbmNlcHRvID0gXCJWQUxfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5Ob21icmVDb25jZXB0byA9IFwiSURfUFJPX0NPTUJJXCJcclxuXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBcIlwiXHJcblxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNWYWxzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zSWRzKVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgKyBjb21iaS5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciArIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciArIGRWYWxvclByb21vQ29tYmkudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw4PCs24gcmVkb25kZWFkb3MgaGFjw4PCrWEgYWJham9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF90b3RhbF9maWRlbGl6YWNpb24ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgdG90YWxfZmlkZWxpemFjaW9uID0gMDtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvdGFsX2ZpZGVsaXphY2lvbiA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoKCgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkZJREVMSVpBQ0lPTlwiKS5WYWxvcikgLyAxMDApICogKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWRvbmRlYXJhIG5vIGFjYSBzaW5vIGVuIGxhIHN1bWEgdG90YWwgZGVsIGZpZGVsaXphY2lvbiBkZSBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAgICByZXR1cm4gdG90YWxfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuIHByb2Nlc28sIGV2YWx1YW5kbyBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPikge1xyXG5cclxuICAgICAgICB2YXIgcGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIgPSBwcm9jZXNvLlZhbG9yTmV0bztcclxuICAgICAgICAvL3ZhciBtYXhfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSB0aGlzLmdldF90b3RhbF9maWRlbGl6YWNpb24ocHJvY2Vzbyk7XHJcbiAgICAgICAgdmFyIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vLCBcIlBBR09cIiwgXCJNT05FREVST1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHByb2Nlc28ubE0zUEVuY0ZQKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9jZXNvLmxNM1BFbmNGUC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtYV9wYWdvOiBNM1BFbmNGUCA9IHByb2Nlc28ubE0zUEVuY0ZQW19pXTtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9tb0FwbGljYWRhOiBNM0NPTkRJUFJPTU87XHJcbiAgICAgICAgICAgICAgICBsZXQgYXBsaWNhX2ZpZGVsaXphY2lvbiA9IHRoaXMudmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvLCBsaXN0X2NvbmRpX3Byb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsaWNhX2ZpZGVsaXphY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUGFnbyA9IGZvcm1hX3BhZ28uVmFsb3IgLSBmb3JtYV9wYWdvLlZhbENhbWJpbztcclxuICAgICAgICAgICAgICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiArPSB0aGlzLmNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc28sIHByb2Nlc28uTTNFTkMsIHZhbG9yUGFnbywgYXBsaWNhX2ZpZGVsaXphY2lvbiwgbGlzdF9lbmNfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAocmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPiBtYXhfdmFsdWVfZmlkZWxpemFjaW9uKSB7XHJcbiAgICAgICAgLy8gICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uID0gbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLm9NYXRoVEYucm91bmQocmVhbF92YWx1ZV9maWRlbGl6YWNpb24sIDIpO1xyXG4gICAgICAgIHJldHVybiByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBkZSB0aXBvIGRlIHBhZ28gYSBwYXJ0aXIgZGUgQXJyYXk8TTNDT05ESVBST01PPlxyXG4gICAgICogQHBhcmFtIGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyAuXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0TTNFbmNJdGVtOiBBcnJheTxNM1BFbmNJdGVtcz4pOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICBsZXQgcmVzdHJpY2Npb25lc0FjdGl2YXMgPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIGlmIChsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdE0zRW5jSXRlbS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0TTNEZXQgPSBsaXN0TTNFbmNJdGVtW19pXS5NM0RFVDtcclxuICAgICAgICAgICAgICAgIGlmICgrbGlzdE0zRW5jSXRlbVtfaV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW9jaW9uZXMgPSBsaXN0TTNEZXQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9NT0NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkUHJvbW9jaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW8gPSBpZFByb21vY2lvbmVzLlZhbG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGlkUHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSAraWRQcm9tb1tfa107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlQcm9tbyA9IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlQcm9tbyAmJiAhcmVzdHJpY2Npb25lc0FjdGl2YXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gcHJvbW8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY2Npb25lc0FjdGl2YXMucHVzaChjb25kaVByb21vKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN0cmljY2lvbmVzQWN0aXZhcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBwYXJhIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gYWN0dWFsXHJcbiAgICAgKiBAcGFyYW0gbGlzdEVuY1Byb21vIFxyXG4gICAgICogQHBhcmFtIGxpc3RNM0VuY0l0ZW0gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZXN0cmljY2lvbmVzVGlwb1BhZ29BY3RpdmFzRnJvbUVuY1Byb21vKGxpc3RFbmNQcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGxldCBsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0RW5jUHJvbW8sIFwiUEFHT1wiLCBcIlJFU1RSSUNDSU9OX1BBR09cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLCBsaXN0TTNFbmNJdGVtKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBtb3ZpbWllbnRvcyByZWFsaXphZG9zIHBvciB1biBtM3NhbGRvc3hjdWVudGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbW92cyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BfbW92czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYgKCFtb3ZzLk1PVlMuTU9WLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgIHJlc3BfbW92cy5wdXNoKG1vdnMuTU9WUy5NT1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbW92cy5NT1ZTLk1PVjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3BfbW92cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGxhIGZvcm1hIGRlIHBhZ28gY3VtcGxlIGFsZ3VuYSBjb25kaWNpb24gZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFfcGFnbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2NvbmRpX3Byb21vOiBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIGRlIGZpZGVsaXphY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvOiBNM1BFbmNGUCwgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPikge1xyXG4gICAgICAgIC8vcmV0dXJuIGxpc3RfY29uZGlfcHJvbW9bMF07XHJcbiAgICAgICAgbGV0IHByb21vc0FwbGljYWRhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RfY29uZGlfcHJvbW8ubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaV9wcm9tbyA9IGxpc3RfY29uZGlfcHJvbW9bX2ldO1xyXG4gICAgICAgICAgICB2YXIgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShjb25kaV9wcm9tby5KQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjb25kaV9wcm9tby5Db25jZXB0by50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlbCBvcGVyYWRvciBlcyBESUZGIGNyZWEgdW5hIGV4cHJlc2lvbiByZWd1bGEgcGFyYSBleGNsdWlyIGxvIHRpcG9kZXBhZ28gY29uZmlndXJhZG9zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEgJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oPyEoXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKVxcXFxiKVxcXFx3KyRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpX3Byb21vLlZhbG9yID0gXCJeKFwiICsgY29uZGlfcHJvbW8uVmFsb3IgKyBcIikkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoY29uZGlfcHJvbW8uVmFsb3IsIFwiaVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUudGVzdChmb3JtYV9wYWdvLklkVGlwb1BhZ28udG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW9zQXBsaWNhZGFzLnB1c2goY29uZGlfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvbW9zQXBsaWNhZGFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIHZhbGlkYXMgcGFyYSB1bmEgYWN0aXZpZGFkIGRhZGFcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGFjdGl2aWRhZDogc3RyaW5nLCB0aXBvMjogc3RyaW5nKTogQXJyYXk8TTNDT05ESVBST01PPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW86IEFycmF5PE0zQ09ORElQUk9NTz4gPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAobGlzdF9lbmNfcHJvbW8pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGxpc3RfZW5jX3Byb21vLmxlbmd0aDsgX2srKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuY2FiZXphZG9Qcm9tbyA9IGxpc3RfZW5jX3Byb21vW19rXTtcclxuICAgICAgICAgICAgICAgIHZhciBkVmlnZW5jaWEgPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uVmlnZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRJbmljaW8gPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uSW5pY2lvKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXN0YWRvICYmIGRWaWdlbmNpYSA+PSBob3kgJiYgZEluaWNpbyA8PSBob3kgJiYgZW5jYWJlemFkb1Byb21vLlRpcG8yID09IHRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX2FncnVwYWNpb24gPSBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT05bX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2ogPSAwOyBfaiA8IGNvbmRpX2FncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgX2orKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX3Byb21vID0gY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9bX2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gYWN0aXZpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfY29uZGlfcHJvbW8ucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jb25kaV9wcm9tbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGEgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1bmEgZm9ybWEgZGUgcGFnbyBkZSBhY3VlcmRvIGEgc3UgcG9yY2VudGFqZSByZXNwZWN0byBlbCB2YWxvciB0b3RhbCBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHBhZ29fdG90YWxfcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uIFxyXG4gICAgICogQHBhcmFtIHZhbHVlX2Zvcm1hX3BhZ28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIsIGxpc3RNM0VuYzogTTNQRW5jSXRlbXNbXSwgdmFsdWVfZm9ybWFfcGFnbzogbnVtYmVyLCBwcm9tb3NBcGxpY2FkYTogQXJyYXk8TTNDT05ESVBST01PPiwgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RQcm9tb3NBcGxpY2FkYXM7XHJcbiAgICAgICAgbGV0IGRldGFsbGVJZFByb21vYztcclxuICAgICAgICBsZXQgdmFsb3JGaWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGxldCBwZXJjZW50X2Zvcm1hX3BhZ286IG51bWJlciA9IHZhbHVlX2Zvcm1hX3BhZ28gLyBwYWdvX3RvdGFsX3Byb2Nlc287XHJcbiAgICAgICAgdmFyIHByZWNpb1Byb2R1Y3RvID0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdE0zRW5jKSB7XHJcbiAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZGV0YWxsZUlkUHJvbW9jID0gaXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSAraXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByZWNpb1NSID0gaXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9TUlwiKTtcclxuICAgICAgICAgICAgaWYgKHByZWNpb1NSICE9IG51bGwgJiYgcHJlY2lvU1IuVmFsb3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSArcHJlY2lvU1IuVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRldGFsbGVJZFByb21vYyAmJiBkZXRhbGxlSWRQcm9tb2MuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBkZXRhbGxlSWRQcm9tb2MuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW9BcGwgb2YgcHJvbW9zQXBsaWNhZGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0UHJvbW9zQXBsaWNhZGFzLmZpbmQoeCA9PiAreCA9PSBwcm9tb0FwbC5JZFByb21vY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSBsaXN0X2VuY19wcm9tby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tb0FwbC5JZFByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yID0gdGhpcy52YWxpZGFyUmVkb25kZW8ocHJvbW8sIHByZWNpb1Byb2R1Y3RvICogdGhpcy5nZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSAvIDEwMCkgKiAocGVyY2VudF9mb3JtYV9wYWdvKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckZpZGVsaXphY2lvbiArPSB2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JGaWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9yY2VudGFqZUZpZGVsaXphY2lvbkZyb21FbmNQcm9tbyhwcm9tbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJSZWRvbmRlbyhwcm9tbywgdmFsb3I6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yLCArakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hIHVuYSBkaW5hbWljYSBjb24gZWwgdmFsb3IgZGUgbGEgZmlkZWxpemFjacODwrNuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoQ29uZmlnTFBTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJDb25maWdMUF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgLy8gdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIHRoaXMuc3luY0NvdWNoKCk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIENPTkZJR0xQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgIC8vICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgLy8gICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgIC8vICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvbmZpZ2xwX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VWJpY2FjaW9uKCkge1xyXG4gICAgICAgIGxldCBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIGxldCBvU1ViaWNhY2lvbjtcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIC8vIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgLy8gICAgIHZhciBLYXRpb3MgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgLy8gICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zTTMuYXBsUGFxcykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hcGxQYXF1ZXRlcyA9IGpLYXRpb3NNMy5LYXRpb3NNMy5hcGxQYXFzXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koaWRrYXRpb3MpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09ORklHTFAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUxwKGlkKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBDb3VjaENvbmZpZ0xQU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLWNvbmZpZ2xwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIHtcclxuICAgIHByaXZhdGUgb01hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgZ3NpZGthdGlvczogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBhcGxQcmVjaW9zRGluYW1pY29zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWRrYXRpb3MpIHtcclxuICAgICAgICB0aGlzLmdzaWRrYXRpb3MgPSBpZGthdGlvcztcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICBsZXQgS2F0aW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuZ3NpZGthdGlvcy50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoS2F0aW9zICE9PSB1bmRlZmluZWQgJiYgS2F0aW9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIGpLYXRpb3NNMyA9IEpTT04ucGFyc2UoS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYgKGpLYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zICYmIGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhcGwgPSBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zLmZpbmQoeCA9PiB4LkxsYXZlLnRvVXBwZXJDYXNlKCkgPT0gXCJBUExMUERJTkFNSUNPU1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcGwgJiYgYXBsLlZhbG9yID09IFwiMVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGxQcmVjaW9zRGluYW1pY29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9Bc2lnbmFyIGxpc3RhIGRlIHByZWNpb3MsIHNlZ3VuIGxpc3RhIGRlIHByZWNpb3MgYXNvY2lhZG8gYSB1c3VhcmlvIHBvciBjYWRhIHVqbm8gZGUgIGxvcyBwcm9kdWN0b3MgaGlqb3NcclxuICAgIHB1YmxpYyBhc3luYyBBc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvOiBUeXBlTTNQcmRHcnAsIG9EYXRhVXNlcjogYW55LCBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1ByZEdycEFzb2NpYWRvIG9mIFByb2R1Y3RvTWFlc3Ryby5NM1ByZEdycEFzb2NpYWRvKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuQXNpZ25hckxpc3RhUHJlY2lvKG9NM1ByZEdycEFzb2NpYWRvLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmRHZW5lcmFsIG9mIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG0zUGFjayBvZiBwcmRHZW5lcmFsLk0zUEFDSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW8obTNQYWNrLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL0FzaWduYXIgbGlzdGEgZGUgcHJlY2lvcywgc2VndW4gbGlzdGEgZGUgcHJlY2lvcyBhc29jaWFkbyBhIHVzdWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgQXNpZ25hckxpc3RhUHJlY2lvKFByb2R1Y3RvTWFlc3RybzogVHlwZU0zUHJkR3JwLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT09IHVuZGVmaW5lZCAmJiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvICE9IC0xICYmIFByb2R1Y3RvTWFlc3Rybykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZEdybCA9IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbFtpXTtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8uc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBsUHJlY2lvc0RpbmFtaWNvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0UHJlY2lvWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTEJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MaXN0YUZpbmRlZC5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9Db3VjaENvbmZpZ0xQU2VydmljZSA9IG5ldyBDb3VjaENvbmZpZ0xQU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RhQ291Y2ggPSBhd2FpdCBvQ291Y2hDb25maWdMUFNlcnZpY2UuZ2V0KHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpDb25maWdMUCA9IEpTT04ucGFyc2UobGlzdGFDb3VjaC5KQ29uZmlndXJhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakNvbmZpZ0xQICYmIGpDb25maWdMUC5GYWN0b3JlcyAmJiBqQ29uZmlnTFAuRmFjdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmYWN0b3IgPSBwYXJzZUZsb2F0KGpDb25maWdMUC5GYWN0b3Jlcy5maW5kKHggPT4geC5Ob21icmUgPT0gc3BsaXRQcmVjaW9bMV0pLkZhY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IHRoaXMub01hdGhURi5yb3VuZChvTGlzdGFGaW5kZWQuUFJFQ0lPICogZmFjdG9yLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKHByZXNlbnRhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhY2lvbi5WQUxPUiA9IHRoaXMub01hdGhURi5yb3VuZChwcmVzZW50YWNpb24uVkFMT1IgKiBmYWN0b3IsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGVuIGFzaWduYXJsaXN0YXByZWNpbzogXCIgKyBFeC5tZXNzYWdlICsgXCIgLSBcIiArIHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTGlzdGFGaW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZEdybC5Mb00zUHJkTGlzdGEgPSBvTGlzdGFGaW5kZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuVmFsaWRhckRhdGFGcm9tSW52ZW50YXJpbyhwcmRHcmwsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBNM1ByZEFkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgICAgIG9NM1ByZEFkaWNpb25hbGVzLkFUUklCVVRPID0gXCJMSVNUQVBSRUNJT1wiO1xyXG4gICAgICAgICAgICBvTTNQcmRBZGljaW9uYWxlcy5WQUxPUiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW87XHJcbiAgICAgICAgICAgIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkQWRpY2lvbmFsZXMucHVzaChvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChQcm9kdWN0b01hZXN0cm8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb0FHZW5lcmFsKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvKTtcclxuICAgICAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb0xpc3RhRmluZGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5WYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybCwgb0RhdGFVc2VyLCBvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB2YXIgc0xpc3RhOiBzdHJpbmcgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vVmFsaWRhciBzaSBlcyB1biB2YWxvciBkZSBpbnZlbnRhcmlvLlxyXG4gICAgICAgIGlmIChzTGlzdGEuc3BsaXQoJ18nKVswXSA9PSBcIklOVlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBqRGF0YTogYW55ID0geyBcInViaWNhY2lvblwiOiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcInNrdVwiOiBwcmRHcmwuU0tVLCBcImxvdGVcIjogcHJkR3JsLkxPVEUsIFwiY29uY2VwdG9cIjogc0xpc3RhLnNwbGl0KCdfJylbMV0gfTtcclxuICAgICAgICAgICAgdmFyIHByZWNpbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UuR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihvUG9zdFNlcnZpY2VNMywgdGhpcy5nc2lka2F0aW9zLCBqRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwcmVjaW8gJiYgcHJlY2lvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmRMaXN0YS5JRExJU1RBID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLkxPVEUgPSBwcmRHcmwuTE9URTtcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlBSRUNJTyA9IHByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlNLVSA9IHByZEdybC5TS1U7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb00zUHJkTGlzdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IHNlc3Npb25XRTggfSBmcm9tIFwiLi4vLi4vLi4vU2Vzc2lvbi9zZXNzaW9uLmNsYXNzXCI7XHJcbmltcG9ydCB7IEZpbHRyb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9maWx0cm9zXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyDDicK1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNNYWVzdHJvIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NQb3JDcmVkaXRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRNM1Byb2Nlc29zUG9yQ3JlZGl0by8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb0J5SWRQcmVzdGFtbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkUHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcmVzdGFtbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG4gICAgLy9yYWUgZWwgVElQTywgU0tQMSwgTk9NQlJFIGRlIGxhIHRhYmxhIHByZGdycFxyXG4gICAgcHVibGljIG0zR2V0UFJER1JQKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0TTNQUkRHUlAvJyArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgY2FudGlkYWQgZGlzcG9uaWJsZSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIFNLUDEgeSBsYSB1YmljYWNpw4PCs24uXHJcbiAgICAvL0xhIGRhdGEgZGViZSB0ZW5lciB1bmEgZXN0cnVjdHVyYToge1wiVUJJQ0FDSU9OXCI6XCIxMTExXCIsIFwiU0tQMVwiOlwiOTk5OWFcIn1cclxuICAgIHB1YmxpYyBNM0dldENhbnRpZGFkQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXRDYW50aWRhZEJ5U0tQMS8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIGdvRGF0YURpc3A6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmIChvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vTm8gZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIGdvRGF0YURpc3AgPSBuZXcgQXJyYXk8YW55PihvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ29EYXRhRGlzcCA9IG9EYXRhLlJFU1BVRVNUQS5ESVNQT05JQklMSURBRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnb0RhdGFEaXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhnb0RhdGFEaXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBHZXRMaXN0YVByZFhGaWx0cm9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9sRmlsdHJvczogQXJyYXk8RmlsdHJvcz4sIHNJRExpc3RhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGlkVWJpY2FjaW9uID0gXCItMVwiLCBAT3B0aW9uYWwoKSBhcGxVbHRpbW9GaWx0cm8gPSB0cnVlLCBAT3B0aW9uYWwoKSB0b3BMaW1pdCA9IFwiMFwiLCBAT3B0aW9uYWwoKSBmaWx0cmFySW52VWJpYyA9IFwiMFwiKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwiRmlsdHJvc1wiOiBKU09OLnN0cmluZ2lmeShvbEZpbHRyb3MpLCBcIklkTGlzdGFcIjogc0lETGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiYXBsVWx0aW1vRmlsdHJvXCI6IGFwbFVsdGltb0ZpbHRybywgXCJ0b3BMaW1pdFwiOiB0b3BMaW1pdCwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIGlmIChvbEZpbHRyb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTGlzdFBSREZpbHRyb3MvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwLCBvbEZpbHRyb3MpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihcIk5vIGhheSBmaWx0cm9zIHBhcmEgbGEgYnVzcXVlZGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0NhdGVnb3JpYTogc3RyaW5nLCBvRGF0YUNsYXNpZmljYWNpb24sIElkTGlzdGE6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgQE9wdGlvbmFsKCkgaWRVYmljYWNpb24gPSBcIi0xXCIsIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG4gICAgICAgIHZhciBvbEZpbHRyb3M6IEFycmF5PEZpbHRyb3M+O1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb2xGaWx0cm9zID0gdGhpcy5GaW5kRmlsdGVySW5DbGFzaWZpY2FjaW9uKHNDYXRlZ29yaWEsIHNJREthdGlvcywgb0RhdGFDbGFzaWZpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcIkZpbHRyb3NcIjogSlNPTi5zdHJpbmdpZnkob2xGaWx0cm9zKSwgXCJJZExpc3RhXCI6IElkTGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiZmlsdHJhckludlViaWNcIjogZmlsdHJhckludlViaWMgfTtcclxuICAgICAgICBpZiAob2xGaWx0cm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vR2V0X0xpc3RQUkRGaWx0cm9zLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgb2xGaWx0cm9zKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiTm8gaGF5IGZpbHRyb3MgcGFyYSBsYSBidXNxdWVkYVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfS8vRW5kIEdldExpc3RhUHJkWENhdGVnb3JpYVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWFXaXRoT3V0RmlsdGVycyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzQ2F0ZWdvcmlhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlDbGFzaWZpY2FjaW9uLycgKyBzSURLYXRpb3MgKyAnLycgKyBzQ2F0ZWdvcmlhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0TGlzdGFQcmRYQ2F0ZWdvcmlhXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBlbCBub21icmUgbyBkZXNjcmlwY2nDg8Kzbi5cclxuICAgIEdldExpc3RhUHJkWE5vbWJyZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FyZ2FyTGlzdFByZEJ5R2VuZXJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2Nhcmdhckxpc3RQcmRCeUdlbmVyaWMvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2FyZ2FyIGluZm9ybWFjaW9uIGRlIGNsYXNpZmljYWNpb25cclxuICAgIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqc29uUmVzcCxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vdmFyIG9zZXNzaW9uV0U4ID0gbmV3IHNlc3Npb25XRTgoKTtcclxuXHJcbiAgICAgICAgLy9qc29uUmVzcCA9IG9zZXNzaW9uV0U4LkdldERhdGFDTEFTSUZJQ0FDSU9OKHNJREthdGlvcyk7XHJcbiAgICAgICAgaWYgKGpzb25SZXNwID09PSB1bmRlZmluZWQgfHwganNvblJlc3AgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL00zR2V0Q2xhc2lmaWNhY2lvbi9cIiArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAganNvblJlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQXJyYXlDbGFzaWZpY2FjaW9uKGpzb25SZXNwKTtcclxuICAgICAgICAgICAgICAgIC8vb3Nlc3Npb25XRTguU2V0RGF0YUNMQVNJRklDQUNJT04oanNvblJlc3AsIHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfS8vRW5kIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uXHJcblxyXG4gICAgLy9WYWxpZGFyIHF1ZSBsYSBjbGFzaWZpY2FjaW9uLCBlc3RlbiBjb21vIGFycmF5LlxyXG4gICAgVmFsaWRhckFycmF5Q2xhc2lmaWNhY2lvbihvRGF0YUNsYXMpIHtcclxuICAgICAgICB0aGlzLlJlY3Vyc2l2ZUNvbnZlcnRBcnJheShvRGF0YUNsYXMuUkVTUFVFU1RBLkNMQVNJRklDQUNJT05FUyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQXBsaWNhciBmaWx0cm9zIGEgbGEgY2F0ZWdvcmlhIGVudHJhbnRlLlxyXG4gICAgRmluZEZpbHRlckluQ2xhc2lmaWNhY2lvbihzQ2xhc0ZpbmQ6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhQ2xhc2lmaWNhY2lvbikge1xyXG4gICAgICAgIHZhciBzQ2xhc2lmaWNhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgb0RhdGFGaWx0cmFkYTtcclxuICAgICAgICAvL3ZhciBvc2Vzc2lvbldFOCA9IG5ldyBzZXNzaW9uV0U4KCk7XHJcbiAgICAgICAgdmFyIG9sRmlsdHJvcyA9IG5ldyBBcnJheTxGaWx0cm9zPigpO1xyXG4gICAgICAgIHZhciBvRmlsdHJvczogRmlsdHJvcztcclxuICAgICAgICB2YXIgZmlsdHJvQXRyaWJ1dG86IHN0cmluZztcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzQ2xhc0ZpbmQpO1xyXG4gICAgICAgIC8vb0RhdGFDbGFzaWZpY2FjaW9uID0gb3Nlc3Npb25XRTguR2V0RGF0YUNMQVNJRklDQUNJT04oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgb0RhdGFGaWx0cmFkYSA9IG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTO1xyXG5cclxuICAgICAgICBpZiAoc0NsYXNGaW5kLmxlbmd0aCAlIDMgPT0gMCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoc0NsYXNGaW5kICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBzQ2xhc2lmaWNhY2lvbiA9IHNDbGFzaWZpY2FjaW9uICsgc0NsYXNGaW5kLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICAgICAgICAgIHNDbGFzRmluZCA9IHNDbGFzRmluZC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgICAgICBvRGF0YUZpbHRyYWRhID0gb0RhdGFGaWx0cmFkYS5DQVRFR09SSUEuZmluZChmaWx0cm8gPT4gZmlsdHJvLkNMQVNJRklDQUNJT04udG9TdHJpbmcoKSA9PSBzQ2xhc2lmaWNhY2lvbi50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0cm9BdHJpYnV0byA9IG9EYXRhRmlsdHJhZGEuQVRSSUJVVE87XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRyb0F0cmlidXRvLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJST09UXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0ZpbHRyb3MgPSBuZXcgRmlsdHJvcyhvRGF0YUZpbHRyYWRhLkFUUklCVVRPLCBvRGF0YUZpbHRyYWRhLkRlc2NyaXBjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvbEZpbHRyb3MucHVzaChvRmlsdHJvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vb0RhdGFSZXNwQ2xhID0gdGhpcy5SZWN1cnNpdmVDbGFzaWZpY2FjaW9uKG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTLkNBVEVHT1JJQSwgc0NsYXNGaW5kKTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFSZXNwQ2xhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2xGaWx0cm9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjdXJzaXZpZGFkLCBwYXJhIHZhbGlkYXIgcXVlIHRvZG9zIGxvcyBub2Rvcywgc2VhbiB0aXBvIGFycmF5XHJcbiAgICBSZWN1cnNpdmVDb252ZXJ0QXJyYXkob0RhdGFDbGFzKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhQ2xhcy5DQVRFR09SSUEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob0RhdGFDbGFzLkNBVEVHT1JJQS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQSA9IG5ldyBBcnJheShvRGF0YUNsYXMuQ0FURUdPUklBKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KG9EYXRhQ2xhcy5DQVRFR09SSUFbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQS5mb3JFYWNoKGNsYXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KGNsYXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYSB1biBwcm9kdWN0b1xyXG4gICAgbTNBZGRQcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgdGRvY1VBY3Rpdm86IHN0cmluZywgbmRvY1VBY3Rpdm86IHN0cmluZywgb00zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIGRpc2FibGVkV2ViOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBkYXRhID0geyAnc1Rkb2NVc3VhcmlvJzogdGRvY1VBY3Rpdm8sICdzTmRvY1VzdWFyaW8nOiBuZG9jVUFjdGl2bywgJ29NM1ByZEdycCc6IG9NM1ByZEdycCwgJ2Rpc2FibGVkV2ViJzogZGlzYWJsZWRXZWIgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vYWRkUHJvZHVjdG8vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gcG9yIFNLUDEuXHJcbiAgICBNM0dldFByb2R1Y3RvQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vTTNHZXRQcm9kdWN0b0J5U0tQMS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHJhbmRvbSBwb3IgU0tQMS5cclxuICAgIE0zR2V0UHJvZHVjdG9SYW5kb21CeVNLUDEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9NM0dldFByb2R1Y3RvUmFuZG9tQnlTS1AxL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBwb3IgU0tQMS5cclxuICAgIE0zR2V0Q2F0QXNvY2lhZGFzQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBza3AxOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoXCJNM01hZXN0cm8vTTNHZXRDYXRBc29jaWFkYXNCeVNLUDEvXCIgKyBzSURLYXRpb3MgKyAnLycgKyBza3AxKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vR2V0IEltYWdlbmVzIGVudmlhbmRvIGVuIGxhIG9EYXRhOiB7XCJQYXRoXCI6XCJ4eHhcIiwgXCJTS1VcIjpcIlNLVXh4eFwifVxyXG4gICAgcHVibGljIE0zR2V0SW1hZ2VuZXNCeVBhdGgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTTNNdWx0aW1lZGlhQnlQYXRoLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9vYnRlbmVyIGluZm9ybWFjaW9uIGRlIHBsYW50aWxsYXMsIGRlc2RlIHNlcnZpZG9yLi4uIFxyXG4gICAgR2V0X00zU0tQbGFudGlsbGFCeVNLVUlEKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBTS1VJRDogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL0dldF9NM1NLUGxhbnRpbGxhQnlTS1VJRC9cIiArIHNJREthdGlvcyArIFwiL1wiICsgU0tVSUQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcHJvZHVjdG9zLCBkZXNkZSBjb2RpZ28gZGUgYmFycmFzXHJcbiAgICBHZXRJbmZvQnlGaWx0ZXJDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzRmlsdGVyQ29kZTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiRklMVEVSQ09ERVwiOiBzRmlsdGVyQ29kZSB9O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFNLUDFQcmRzQnlGaWx0ZXJzQ29kZS8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0SW5mb0J5RmlsdGVyQ29kZSBcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9NM1ViaWNhY2lvbmVzLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zVWJpY2FjaW9uZXNcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXNDb21wbGV0YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uOiBzdHJpbmcsIHNJZEh1Yjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zV2l0aFRpbWVPdXQoJ00zTWFlc3Ryby9nZXRfTTNVYmljYWNpb25lc0NvbXBsZXRhLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24gKyAnLycgKyBzSWRIdWIsIDEwMDAwKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9NM1ViaWNhY2lvbmVzQ29tcGxldGFcclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIHB1YmxpYyBNM0dldFByb2R1Y3RvQnlTS1UoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhQb3N0U2VydmljZU0zKTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFByb2R1Y3RvQnlTS1UvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIGFzeW5jIE0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzU0tVOiBzdHJpbmcsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIFViaWNhY2lvbjogc3RyaW5nID0gXCItMVwiLCBzQXBsRXhjOiBzdHJpbmcgPSBcIjFcIikge1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGRhdGEgPSB7ICdTS1UnOiBzU0tVLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb24gPT0gXCItMVwiID8gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiA6IFViaWNhY2lvbiwgJ0FwbEV4Yyc6IHNBcGxFeGMgfTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuXHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0UHJvZHVjdG9CeVNLVS8nICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocmVzcCwgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIGVzcGVjZmljbyB0ZW5pZW5kbyBlbiBjdWVudGEgY29kaWdvLlxyXG4gICAgYXN5bmMgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1RyYWUgbG9zIHJlZ2lzdHJvcyBxdWUgc2UgZW5jdWVudHJlbiBlbiBNM1Byb2Nlc29zIHF1ZSBzZSBlbmN1ZW50cmVuIGNvbiBlc3RhZG9nZW5lcmFsIHByb2Nlc29cclxuICAgIE0zZ2V0UmVnaXN0cm9zRW5Qcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRfUmVnaXN0cm9zRW5Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JTb2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRpZW5lIGVsIHRvcCAyMCBkZSBwcm9kdWN0b3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIGdldF9NM1ByZEdycEJ5Tm9tYnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzTm9tYnJlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X00zUHJkR3JwQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLk0zR1JQO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zUHJkR3JwQnlOb21icmVcclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIHB1YmxpYyBHZXRNM1ByZEFncnVwYWRvQnlOb21icmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNOb21icmU6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfbTNfcHJkX2J5X25vbWJyZV9hZ3J1cGFkby8nICsgc0lES2F0aW9zICsgJy8nICsgc05vbWJyZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuTTNHUlA7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG8geSBxdWUgbm8gZXN0ZW4gZXhsY3VpZG9zIChNM0V4Y1ByZFhVYmljKVxyXG4gICAgcHVibGljIGdldF9tM19wcmRfYnlfbm9tYnJlX2FncnVwYWRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2RhdGEgPSB7bm9tYnJlOidhc2Rhc2QnLCBpZFViaWNhY2lvbjonMSd9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X20zX3ByZF9ieV9ub21icmVfYWdydXBhZG8vJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQS5NM0dSUDtcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLl9ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yICYmIGVyci5lcnJvci5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHBhdGggYmFzZSBkb25kZSBzZSBlbmN1ZW50cmEgYWxvamFkYXMgbGFzIGltYWdlbmVzIGVuIGVsIHNlcnZpZG9yXHJcbiAgICBwdWJsaWMgZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9QYXRoU2Vydmlkb3JJbWFnZW5lcy8nICsgc0lES2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwKVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9QYXRoU2Vydmlkb3JJbWFnZW5lc1xyXG5cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gZXNwZWNmaWNvIHRlbmllbmRvIGVuIGN1ZW50YSBjb2RpZ28uXHJcbiAgICBHZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8gPSBuZXcgU2VydmljZUxvYWRMaXN0YVByZWNpbyhzSURLYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZVRpbWVPdXQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgdGltZW91dFRpbWU6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0VGltZSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YVVzZXIgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykgZGF0YS5mZWNoYUxQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW87XHJcbiAgICAgICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSwgdGltZW91dFRpbWUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRfRG9jc0Zyb21Db3VjaE1hZXN0cm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybywgc0lkS2F0aW9zOiBzdHJpbmcsIHNEb2M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0X0RvY3NGcm9tQ291Y2hNYWVzdHJvXCIpXHJcbiAgICAgICAgdmFyIHNJZEtleURvYyA9IG9NM0NvdWNoTWFlc3Ryby5HZXRLZXlEb2N1bWVudG9EQihzSWRLYXRpb3MsIHNEb2MpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNJZEtleURvYylcclxuICAgICAgICBvTTNDb3VjaE1hZXN0cm8uR2V0RGF0YVBvdWNoQkQoc0lkS2V5RG9jKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzdWx0KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRQcm9kdWN0b0VzcGVjQnlDb2RlRnJvbUNvdWNoKGpQcm9kdWN0c0NvdWNoOiBhbnksIHNDb2RlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGpQcm9kdWN0c0ZpbCA9IGpQcm9kdWN0c0NvdWNoLmZpbmQoeCA9PiB4LkxvTTNQcmRHZW5lcmFsICE9IHVuZGVmaW5lZCAmJiB4LkxvTTNQcmRHZW5lcmFsLmZpbmQodyA9PiB3Lk0zQ29kcyAhPSB1bmRlZmluZWQgJiYgdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpICE9IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RfY2xvbmUgPSBfLmNsb25lRGVlcChqUHJvZHVjdHNGaWwpO1xyXG5cclxuICAgICAgICBpZiAoalByb2R1Y3RzRmlsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YXIgalByZEVzcCA9IGpQcm9kdWN0c0ZpbC5Mb00zUHJkR2VuZXJhbC5maW5kKHcgPT4gdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHByb2R1Y3RfY2xvbmUuTG9NM1ByZEdlbmVyYWwgPSBbXTtcclxuICAgICAgICAgICAgcHJvZHVjdF9jbG9uZS5Mb00zUHJkR2VuZXJhbC5wdXNoKGpQcmRFc3ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInByb2R1Y3RfY2xvbmVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdF9jbG9uZSlcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0X2Nsb25lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnJvcihcIk5vIHNlIGVuY29udHLDg8KzIG51bmfDg8K6biByZWdpc3Ryby5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBUaXBvcyBkZSBwcm9jZXNvcyBkZXNkZSBlbCBzZXJ2aWRvclxyXG4gICAgcHVibGljIGdldF9UaXBvc1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgYWN0aXZpZGFkOiBzdHJpbmcgPSAnVmVudGFzJykge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1RpcG9zUHJvY2Vzby8nICsgc0lES2F0aW9zICsgJy8nICsgYWN0aXZpZGFkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9UaXBvc1Byb2Nlc29cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIEluZm8gZGUgdW4gcHJvY2VzbyBhIHBhcnRpciBkZSB1biBpZFByb2Nlc28geSB1biBJZE0zXHJcbiAgICBwdWJsaWMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfSW5mb1BlcnNvbmFfUHJvY2Vzby8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBJbmZvIGRlIHVuIHByb2Nlc28gYSBwYXJ0aXIgZGUgdW4gaWRQcm9jZXNvIHkgdW4gSWRNMyBkZSBtYW5lcmEgc2luY3LDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGpEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc29fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIganNvbjtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9JbmZvUGVyc29uYV9Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgdW4gcHJvZHVjdG8gYWdydXBhZG8sIHRlbmllbmRvIHVuYSBsaXN0YSBkZSBwcm9kdWN0byBhZ3J1cGFkb3MgeSB1biBza3VcclxuICAgIHB1YmxpYyBHZXRNM1ByZEdycEZyb21MaXN0KExpc3RQcmQ6IEFycmF5PFR5cGVNM1ByZEdycD4sIHNrdSk6IFR5cGVNM1ByZEdycCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9UeXBlTTNQcmRHcnBSZXN1bHQ6IFR5cGVNM1ByZEdycDtcclxuICAgICAgICAgICAgb1R5cGVNM1ByZEdycFJlc3VsdCA9IExpc3RQcmQuZmluZChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwcmQuTG9NM1ByZEdlbmVyYWwuZm9yRWFjaChwcmQgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkLlNLVSA9PT0gc2t1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9UeXBlTTNQcmRHcnBSZXN1bHQuTG9NM1ByZEdlbmVyYWwgPSBvVHlwZU0zUHJkR3JwUmVzdWx0LkxvTTNQcmRHZW5lcmFsLmZpbHRlcihnZW4gPT4gZ2VuLlNLVSA9PSBza3UpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1R5cGVNM1ByZEdycFJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBkZSB1bmEgbGlzdGEgZGUgdWJpY2FjaW9uZXMsIHVuYSB1YmljYWNpb24gZW4gcGFydGljdWxhciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uRnJvbUxpc3QoTGlzdFViaWM6IEFycmF5PE0zVWJpY2FjaW9uPiwgc0lkVWJpYykge1xyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgICAgIG9NM1ViaWNhY2lvbiA9IExpc3RVYmljLmZpbmQodWJpYyA9PiB1YmljLklEVWJpY2FjaW9uID09IHNJZFViaWMpO1xyXG4gICAgICAgIHJldHVybiBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBsb3MgZGF0b3MgZGUgZmFjdHVyYWNpb24gdGFsIGNvbW8gZWwgY29kaWdvIHBvc3RhbCB5IGVsIHJlZ2ltZW4gZmlzY2FsIGFzb2NpYWRvIGEgdW4gUkZDXHJcbiAgICBwdWJsaWMgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXREYXRvc0ZhY3R1cmFjaW9uRnJvbVJGQy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkNcclxuXHJcbiAgICBwdWJsaWMgYWN0dWFsaXphclJGQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBvRGF0YSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vYWN0dWFsaXphclJGQy8nICsgSWRLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHBvc3RzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfWG1sQ29uZmlnX3hfSWRVYmljYWNpb25cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0Q0ZESXNYUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldENGRElzWFByb2Nlc28vJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9YbWxDb25maWdfeF9JZFViaWNhY2lvblxyXG5cclxuICAgIC8vL09idGllbmUgbG9zIGF0cmlidXRvcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvc1xyXG4gICAgZ2V0X2NsYXNpZmljYXRpb25fYXR0cmlidXRlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9hdHRyaWJ1dGVzLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQVRUUklCVVRFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYXMgY2F0ZWdvcmlhcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvcyB5IHVuIGF0cmlidXRvXHJcbiAgICBnZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzLycgKyBpZF9rYXRpb3MgKyBcIi9cIiArIGF0dHJpYnV0ZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5DQVRFR09SSUVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wY2lvbmVzQWRpY2lvbmFsZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0T3BjaW9uZXNBZGljaW9uYWxlcy8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkFUVFJJQlVURVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHJpYnV0b3NBZGljaW9uYWxlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0QXRyaWJ1dG9zQWRpY2lvbmFsZXMvJyArIGlkX2thdGlvcyArIFwiL1wiICsgYXR0cmlidXRlKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkNBVEVHT1JJRVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYSBpbmZvcm1hY2lvbiBkZSB0aXBvcyBkZSBlbnZpby5cclxuICAgIE0zR2V0Rm9ybWFzRW52aW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNHZXRGb3JtYXNFbnZpby8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBqc1Jlc3A7XHJcbiAgICAgICAgICAgIGpzUmVzcCA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soanNSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfY29tcGxldGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X3ViaWNhY2lvbmVzX2NvbXBsZXRlLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfc2ltcGxlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF91YmljYWNpb25lc19zaW1wbGUvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNM0dFVF9MSVNUQVBSRUNJT1NfQVN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR0VUX0xJU1RBUFJFQ0lPUy8nICsgaWRfa2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gb1JlY0xpc3RhUHJlY1swXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0RW5jYWJlemFkb0xpc3Rhc1ByZWNpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvR2V0Q29uZmlnTFAvJyArIHNJREthdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0cmFyQ29sb25pYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBzQ29sb25pYTogc3RyaW5nLCBzQ29kUG9zdGFsLCBzVGVsZWZvbm86IHN0cmluZywgbmRvYzogc3RyaW5nLCBzTGluZWExOiBzdHJpbmcsIHNDb2Rlc3RhZG86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcInNDb2xvbmlhXCI6IHNDb2xvbmlhLCBcInNDb2RQb3N0YWxcIjogc0NvZFBvc3RhbCwgXCJzVGVsZWZvbm9cIjogc1RlbGVmb25vLCBcIm5kb2NcIjogbmRvYywgXCJzTGluZWExXCI6IHNMaW5lYTEsIFwic0NvZGVzdGFkb1wiOiBzQ29kZXN0YWRvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zTWFlc3Ryby9yZWdpc3RyYXJDb2xvbmlhLycgKyBJZEthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0ZW5lciBwcm9tb2Npb25lcyBcclxuICAgIHB1YmxpYyBhc3luYyBNM19HZXRQcm9tb2Npb25lc01hZXN0cm9Bc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNfR2V0UHJvbW9jaW9uZXNNYWVzdHJvLycgKyBpZF9rYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIERpbmFtaWNhcyBwb3IgYWN0aXZpZGFkIFxyXG4gICAgcHVibGljIGFzeW5jIE0zR2V0RGluQnlBY3RpdmlkYWQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXREaW5CeUFjdGl2aWRhZC8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBqc1Jlc3A6YW55ID0gcmVzcDtcclxuICAgICAgICAgICAgLy9qc1Jlc3AgPSBKU09OLnBhcnNlKGpzUmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgLy8gdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgLy8gb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0RGluQnlBY3RpdmlkYWQvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIC8vIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBpbmZvIGJhc2ljYSBkZSBsYXMgdWJpY2FjaW9uZXMgY29uIEh1YiB0aXBvIFdFQiBhY3Rpdm9zIGVuIGVsIG1vbWVudG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIGdldFViaWNhY2lvbmVzV2ViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0VWJpY2FjaW9uZXNXZWIvJyArIGlkS2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFJldG9ybmEgbGEgaW5mbyBiYXNpY2EgZGUgbGFzIHViaWNhY2lvbmVzIGNvbiBIdWIgdGlwbyBXRUIgYWN0aXZvcyBlbiBlbCBtb21lbnRvIHF1ZSBhYmFycXVlbiB1biBjb2Rwb3N0YWwgZW4gY29uY3JldG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgZ2V0VWJpY2FjaW9uZXNCeUNvZFBvc3RhbChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL2RhdGEgPSB7IFwiY29kUG9zdGFsXCI6IHN0cmluZyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldFViaWNhY2lvbmVzQnlDb2RQb3N0YWwvJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHBhdGggZGUgbGEgZmFjdHVyYSBlbGVjdHLDg8KzbmljYSBhIHBhcnRpciBkZSB1biBJZERpYXJpbyBhc29jaWFkbyBhbCBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aEZFRnJvbURpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCB0aXBvR2VuZXJhY2lvbjogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UGF0aEZFRnJvbURpYXJpby8nICsgaWRLYXRpb3MgKyAnLycgKyB0aXBvR2VuZXJhY2lvbiwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcHVlc3RhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERpYXJpb0FkaWNpb25hbGVzeERpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlHZW5lcmFsZXMoJ0RpYXJpby9nZXREaWFyaW9BZGljaW9uYWxlc3hEaWFyaW8vJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGE6IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwdWVzdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBJVV9IdWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9IdWI6IGFueSwgdVRBY3Rpdm86IHN0cmluZywgdU5BY3Rpdm86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBpZF9rYXRpb3MudHJpbSgpLCAnb0h1Yic6IG9IdWIsICd1VEFjdGl2byc6IHVUQWN0aXZvLCAndU5BY3Rpdm8nOiB1TkFjdGl2byB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNNYWVzdHJvL0lVX0h1YicsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjdGl2byBkZXNkZSBzZXJ2aWRvclxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSB1YmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBHZXRDdGl2b0JZUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRwcm9jZXNvJzogaWRwcm9jZXNvLCAndWJpY2FjaW9uJzogdWJpY2FjaW9uLCAnaHViJzogaHViIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q3Rpdm9CWVByb2Nlc28vJyArIGlkX2thdGlvcy50cmltKCksIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFZhbGlkYXJDdGl2b3NWU0xvY2FsKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGluZlByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvVmFsaWRhckN0aXZvc1ZTTG9jYWwvJyArIGlkX2thdGlvcyArICcvJyArIHViaWNhY2lvbiArICcvJyArIGh1YiwgaW5mUHJvY2Vzbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHsgXCJlcnJvclwiOiBlcnJvciB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgR2VuZXJhckF1dG9yaXphY2lvbkN1ZW50YXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgZGF0YSkge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG5cclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL0dlbmVyYXJBdXRvcml6YWNpb25DdWVudGFzJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIGNvZGlnbyBpbmdyZXNhZG8gY29ycmVzcG9uZGUgYWwgZG9jdW1lbnRvIHkgc2kgZWwgY29kaWdvIGVzdGEgZW4gZXN0YWRvIGFjdGl2b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBkYXRhKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcblxyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcycsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgVmVyaWZpY2FyUGFnb1RhcmpldGFCQlZBKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWRLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBqRGF0YSA9IHsgXCJJZGthdGlvc1wiOiBzSURLYXRpb3MsIFwiaWRLZXlcIjogc0lkS2V5IH1cclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9WZXJpZmljYXJQYWdvVGFyamV0YUJCVkEnLCBqRGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mbztcclxuICAgIH0vL0VuZCBnZXRfSW5mb1Byb2Nlc29cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwODEzOiBSZXRvcm5hIGxvcyBjb2RpZ29zIGRlIGxvcyBTS1Aoc2twVG9GaW5kKSB5IHN1IHJlc3BlY3Rpdm8gc2lnbmlmaWNhZG8gcGFyYSB1biBwcm9kdWN0byBkYWRvXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwY2lvblNLUHMoaWRLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxcclxuICAgICAgICBkYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHtcIlNLUDFcIjpcIlNLUDFcIiwgU0tQVG9GaW5kOiAyIH19O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9nZXREZXNjcmlwY2lvblNLUHMvXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soZGF0YS5TS1AxLCBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgZ2V0VG90YWxlc0NpZXJyZUNhamEocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzdWJpY2FjaW9uOiBzdHJpbmcsIHNodWI6IHN0cmluZywgc3VzdWFyaW86IHN0cmluZywgc0ZlY2hhSTogc3RyaW5nLCBzRmVjaGFGOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAndWJpY2FjaW9uJzogc3ViaWNhY2lvbiwgJ2h1Yic6IHNodWIsICd1c3VhcmlvJzogc3VzdWFyaW8sICdGZWNoYUknOiBzRmVjaGFJLCAnRmVjaGFGJzogc0ZlY2hhRiB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRUb3RhbGVzQ2llcnJlQ2FqYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENpZXJyZXN4VWJpY2FjaW9uKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc3ViaWNhY2lvbjogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ3ViaWNhY2lvbic6IHN1YmljYWNpb24sICdpZFByb2Nlc28nOiBzSWRQcm9jZXNvLCAnRmVjaGEnOiBzRmVjaGEgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0Q2llcnJlc3hVYmljYWNpb24nLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDaWVycmVzeEVtcHJlc2EocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ2lkUHJvY2Vzbyc6IHNJZFByb2Nlc28sICdGZWNoYSc6IHNGZWNoYSB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRDaWVycmVzeEVtcHJlc2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIHNpbXVsYXJwYWdvRW5saW5lYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9WYWxpZGFjaW9uUGFnb0ludGVncmFjaW9uVGVzdC8nICsgc0lES2F0aW9zICsgJy8nICsgc0lkTTMgKyAnLycgKyBzSWRQcm9jZXNvKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvcihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvci9cIiArIGlkX2thdGlvcyArIFwiL1wiICsgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3JcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0Z1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL3ZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvL1wiICsgaWRfa2F0aW9zLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyWydfYm9keSddKS5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvUHJkR2FzdG9zRW52aW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcblxyXG4gICAgICAgIGxldCByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vZ2V0SW5mb1ByZEdhc3Rvc0VudmlvL1wiICsgaWRfa2F0aW9zLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKS5SRVNQVUVTVEFcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSB1bmEgc2FsZG94Y3VlbnRhIGFsZWF0b3JpbyBwb3IgZWwgdmFsb3IgZGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSA9IHtcInByb2Nlc29cIixwcm9jZXNvLFwidmFsb3JcIjp2YWxvcixcIm5vbWJyZURvY1wiOiBub21icmVEb2N9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtM19nZW5lcmFyX00zU1hDX2FsZWF0b3JpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL20zX2dlbmVyYXJfTTNTWENfYWxlYXRvcmlvL1wiICsgaWRrYXRpb3MsIGRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpLlJFU1BVRVNUQTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphIHVuIGNvbmNlcHRvIGRlbCBNM19zYWxkb3NJdGVtVWJcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zX2FjdHVhbGl6YXJDb25jZXB0b1NJVShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvTTNfYWN0dWFsaXphckNvbmNlcHRvU0lVL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc29BbENpZXJyZVViaWMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL3Byb2Nlc29BbENpZXJyZVViaWMvXCIgKyBpZF9rYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHByb2Nlc29BbENpZXJyZVViaWNcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRfUHJvY2Vzb3NBYmllcnRvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9Qcm9jZXNvc0FiaWVydG9zLycgKyBzSURLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZ2V0X1Byb2Nlc29zQWJpZXJ0b3NcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X0luZm9Qcm9jZXNvXHJcblxyXG59XHJcbiIsImltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVuYy1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUERldGFsbGVJdGVtcywgTTNQSXRlbXNXRUIsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNEYXRhIH0gZnJvbSBcIi4uL0RhdGEvbTMtZGF0YVwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3JcIjtcclxuaW1wb3J0IHsgeG1sVG9Kc29uVEYgfSBmcm9tIFwiLi4vLi4vQ29udmVydC94bWxUb0pTb24uY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQSW1wdWVzdG9zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzc1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IHByb21vY2lvbmVzU2VydmljZSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9wcm9tb2Npb25lcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3NyYy9yZW5kZXIzXCI7XHJcbmltcG9ydCB7IE0zUHJlc2VudGFjaW9uZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVzZW50YWNpb25lc1wiO1xyXG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL3V0aWxcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrRGV0IH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRQYWNrRGV0XCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXNcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tIFwiLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3NcIjtcclxuaW1wb3J0IHsgRUNBTkNFTEVEIH0gZnJvbSBcImNvbnN0YW50c1wiO1xyXG5pbXBvcnQgKiBhcyB4bWwyanMgZnJvbSAneG1sMmpzJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbnZhciBiaWdEZWNpbWFsID0gcmVxdWlyZSgnanMtYmlnLWRlY2ltYWwnKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybztcclxuICAgIHB1YmxpYyBvTGlzdGFPYnNlcXVpb3M6IEFycmF5PGFueT4gPSBudWxsO1xyXG4gICAgcHVibGljIG9ic2VxdWlvc0V4YzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG9ic2VxdWlvT1Byb21vOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NDYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsSWRBY3RpdmFQcm9tbyA9IFtdO1xyXG4gICAgcHJpdmF0ZSBHb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTM7XHJcbiAgICBwcml2YXRlIGdzSWRrYXRpb3M7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIElzUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lka2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3RybyA9IGlvTTNDb3VjaE1hZXN0cm87XHJcbiAgICAgICAgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMgPSBJc1Bvc3RTZXJ2aWNlTTM7XHJcbiAgICAgICAgdGhpcy5nc0lka2F0aW9zID0gc0lka2F0aW9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIFZhbGlkYXIgbnVtZXJvIGRlIGl0ZW1zIGFncmVnYWRvcy4gc2kgZXMgbWF5b3IgYSAxLjAwMCBwcmVuZGUgcGFyYW1ldHJvIFxyXG4gICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJOdW1lcm9JdGVtcyhvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLk0zRU5DLmxlbmd0aCA+IDEwMDApIHtcclxuICAgICAgICAgICAgb2xNM1Byb2Nlc29zLkFwbERlc2RlU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgb2xNM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvY2VzYW1pZW50b1NlcnZpY2Uoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZhbGlkYXJOdW1lcm9JdGVtcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgdGhpcy5SZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm8pO1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTMvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPQ0lFUlJFXHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9Kc29uLlJFU1BVRVNUQSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgcHJvY2VzYW1pZW50b19zZXJ2aWNlX2FzeW5jKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5SZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm8pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTMvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB2YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSWRNMyA9IG9Kc29uLlJFU1BVRVNUQS5JRE0zO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpbyA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJTztcclxuXHJcbiAgICAgICAgICAgIC8vQWN0dWFsaXphY2lvbiBkZSBlc3RhZG9zLlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLkVzdGFkb0RlcztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IEFycmF5PE0zUHJvY2Vzb3M+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NM09mZkxpbmUvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vUmV0b21hciBpbmZvcm1hY2lvbiBwYXJhIGVsIHByb2Nlc28uXHJcbiAgICBwdWJsaWMgUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlcjogYW55LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuSWRNMyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLklkTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsUmV0b21hckluZm8pIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUI7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPT0gdW5kZWZpbmVkIHx8IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1Byb2Nlc2FtaWVudG8gZGUgZGF0b3MgZW4gYmFzZSBkZSBkYXRvcyBwb3VjaERCLlxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlUG91Y2hEQihvTTNEYXRhOiBNM0RhdGEsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgLy9DYXJnYXIgZGV0YWxsZSBkZSBpdGVtc1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihhc3luYyByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHJlc3VsdDtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vbGV0IE0zRW5jID0gdGhpcy5nZXRfTTNFTkNfYnlfaWRwcmRfbG90ZShvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UsIHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSk7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFDYXJyaXRvQ29tcHJhcyk7XHJcbiAgICAgICAgfSwgYXN5bmMgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FncmVnYXIgYSBjYXJyaXRvIHByb2R1Y3RvLlxyXG4gICAgcHVibGljIGFkZHRvY2FydChvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCwgdmFsb3JEZXNjdWVudG8gPSAwKSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcbiAgICAgICAgLy9KQUdNIDIwMTkwNzIyIHNlIGFncmVnYSBwYXJhIGN1YW5kbyBlcyBlbCBwcmltZXIgcHJvZHVjdG8gcXVlIHNlIGFncmVnYXLDg8KhXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRU5DLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL1ZhbGlkYSBxdWUgZXhpc3RhIHByb2R1Y3RvIGVuIGxvcyBlbmNhYmV6YWRvcy4gVHJ1ZTogU2kgZXhpc3RlLCBGYWxzZSBkZSBvdHJvIG1vZG9cclxuICAgIC8vIFNlIGNhbWJpYSBmdW5jaW9uYWxpZGFkIGRlIHJldHVybi5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJkR3JsOiBNM1ByZEdlbmVyYWwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBvRW5jOiBNM1BFbmNJdGVtcyA9IG51bGw7XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gLTE7XHJcbiAgICAgICAgaWYgKG9NM0xpc3RhRW5jICE9PSB1bmRlZmluZWQgJiYgb00zUHJkR3JsICE9PSB1bmRlZmluZWQgJiYgb00zTGlzdGFFbmMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgb0VuYyA9IG9NM0xpc3RhRW5jLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9NM1ByZEdybC5TS1UgJiYgIWVuYy5JZEVuY1BhZHJlICYmIHRoaXMuZ2V0Q2FudGlkYWRQb3NpdGl2YShlbmMpKTtcclxuICAgICAgICAgICAgaWYgKG9FbmMgIT09IHVuZGVmaW5lZCAmJiBvRW5jICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxNyBWYWxpZGFyIGFob3JhIGVsIHByZWNpby5cclxuICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHcmwsICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhclByZWNpb3NQcmRzKG9FbmMsIG9NM1ByZEdybC5Mb00zUHJkTGlzdGEpICYmICF0aGlzLlZhbGlkYXJFc3RhUGFxdWV0ZShvRW5jLCBvTTNMaXN0YUVuYykpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IG9FbmMuSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWQgPSArb0VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FudGlkYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2FudGlkYWRQb3NpdGl2YShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkID0gMDtcclxuICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKVxyXG5cclxuICAgICAgICBpZiAoZGV0Q2FudGlkYWQpIHtcclxuICAgICAgICAgICAgY2FudGlkYWQgPSArZGV0Q2FudGlkYWQuVmFsb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FudGlkYWQgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgcXVlIGVsIGVuY2FiZXphZG8gY29uIGVsIHByb2R1Y3RvIGFncmVnYWRvLCBzZWEgdW4gcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBvTTNMaXN0YUVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJFc3RhUGFxdWV0ZShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0xpc3RhRW5jLmZpbmQoeCA9PiB4LklkRW5jUGFkcmUgPT0gb00zUEVuY0l0ZW1zLklEKSkge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3NcclxuICAgICAqIEBwYXJhbSBvRW5jIFxyXG4gICAgICogQHBhcmFtIG9NM1ByZExpc3RhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclByZWNpb3NQcmRzKG9FbmM6IE0zUEVuY0l0ZW1zLCBvTTNQcmRMaXN0YTogTTNQcmRMaXN0YSkge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvRW5jOiBudW1iZXIgPSArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0xpc3Q6IG51bWJlciA9IG9NM1ByZExpc3RhLlBSRUNJTztcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJlY2lvTGlzdCA9PSBkUHJlY2lvRW5jKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgVmFsaWRhclByZWNpb3NQcmRzXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIFVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uXHJcbiAgICAgICAgLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCID0gbnVsbCkge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIGlmIChtM1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICB2YXIgbG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXModGhpcy5nc0lka2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgbG9NM1BJdGVtc1dFQiwgbTNVYmljYWNpb24sIHRydWUpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG9EYXRhKTtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG8gZW4gcHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rXCIpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMub0VuY2FiZXphZG9NM0NvbXBvbmVudC5SZWNhcmdhckNhcnJpdG8oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5Mb2FkQ2FydCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgdXBkYXRlQVBvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIGF3YWl0IG9NM0RhdGEuRGVsZXRlKHNLZXlDYXJyaXRvKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vRWxpbWluYXIgZG9jdW1lbnRvIGRlIGNvdWNoL3BvdWNoLCBpbmljaW8geSBhY3R1YWxcclxuICAgIHB1YmxpYyBEZWxEb2NzU3RhcnRBbmRDdXJyZW50KG9NM0RhdGE6IE0zRGF0YSwgc0lES2F0aW9zOiBzdHJpbmcsIG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVWJpY2FjaW9uQ3VycmVudCwgSHViQ3VycmVudCkge1xyXG4gICAgICAgIC8vRWxpbWluYXIgSW5pY2lhbFxyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgIT09IHVuZGVmaW5lZCAmJiBvbE0zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IG9sTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpLCBcIklESFVCXCI6IG9sTTNQcm9jZXNvcy5JREh1YiB9IH1cclxuICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZSBzdGFydFwiKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIC8vRWxpbWluYXIgYWN0dWFsXHJcbiAgICAgICAgICAgIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb25DdXJyZW50LnRvU3RyaW5nKCksIFwiSURIVUJcIjogSHViQ3VycmVudCB9IH1cclxuICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZSBjdXJyZW50XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIGFzeW5jIEdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc287XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc28gPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYXNsYWRhciBpbmZvcm1hY2nDg8KzbiBkZSBjYXJyaXRvLCBkb3MgdXN1YXJpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNb3ZlQ2FydEludG9Vc2VyKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlck9yaWdlbjogYW55LCBvRGF0YVVzZXJEZXN0aW5vOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9PcmlnZW47XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvRGVzdGlubztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG9PcmlnZW4gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b0Rlc3Rpbm8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgbGV0IG9NM1Byb2Nlc28gPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvT3JpZ2VuKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc28uVERvYyA9IG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICAgICAgb00zUHJvY2Vzby5ORG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5ORE9DO1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb1tcIl9yZXZcIl07XHJcbiAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG9EZXN0aW5vLCBvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW9zIHRvdGFsZXMgeSBkZSBiYXNlXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvc1Byb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsQmFzZTtcclxuICAgICAgICAvLyB2YXIgZFZhbG9yOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3JOZXRvOiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgIC8vICAgICBkUHJlY2lvVG90YWwgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgLy8oK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgKiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIC8vICAgICBkUHJlY2lvVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhclByZWNpb0Jhc2VGcm9tUHJvY2VzbyhlbmMsIGRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTEJBU0VcIikuVmFsb3IgPSBTdHJpbmcoTWF0aC5yb3VuZChkUHJlY2lvVG90YWxCYXNlICogMTAwKSAvIDEwMCk7XHJcbiAgICAgICAgLy8gICAgIGRWYWxvciA9ICgrZFZhbG9yKSArICgrZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gICAgIGRWYWxvck5ldG8gPSAoK2RWYWxvck5ldG8pICsgKCtkUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLlJlY2FsY3Vsb0ltcHVlc3RvcyhlbmMsIGRQcmVjaW9Ub3RhbEJhc2UpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIC8vIC8vb00zUHJvY2Vzb3MuVmFsb3IgPSBkVmFsb3I7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gZFZhbG9yTmV0bztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9SZWNhbGN1bGFyIHByZWNpb3MuIHJlY29ycmllbmRvIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciB2YWxvciA9IDA7XHJcbiAgICAgICAgdmFyIFZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTEwMTAgc2UgY2FtYmlhIGVsIHZhbG9yIGRlbCBwcmVjaW8gdW5pdGFyaW8gYmFzZSwgeWEgcXVlIGFsIG1vbWVudG8gZGUgbGxhbWFyIGxhIGZ1bmNpw4PCs24gVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvXHJcbiAgICAgICAgICAgIC8vIHNlIHJlY2FsY3VsbyBlbCBwcmVjaW8gdG90YWwsIGRlcGVuZGllbmRvIGRlIGVzdGUgdmFsb3IuXHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKS5WYWxvcixcclxuICAgICAgICAgICAgICAgIHRoaXMub01hdGhURi5yb3VuZChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IsIDIpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWRFbmMgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoK2RDYW50aWRhZEVuYyAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSAoK3BUb3RhbEJhc2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28oZW5jLCArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIGJhc2UgZGUgdW4gcHJlY2lvLCB0ZW5pZW5kbyBlbCB2YWxvciB0b3RhbCBvIG5ldG8uXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9CYXNlRnJvbVByb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZFByZWNpb05ldG86IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkVmFsb3JJbXB1ZXN0bzogbnVtYmVyID0gMTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGRWYWxvckltcHVlc3RvID0gKCtkVmFsb3JJbXB1ZXN0bykgKyAoK2ltcC5Qb3JjZW50YWplKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKCgrZFByZWNpb05ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjYWxjdWxvIGRlIHZhbG9yIGRlIGltcHVlc3RvcywgY3VhbmRvIGNhbWJpYSBlbCB2YWxvci4gU2VhIHBvciBjYW50aWRhZCwgZWxpbWluYWNpw4PCs24uLi5cclxuICAgIC8vIHB1YmxpYyBSZWNhbGN1bG9JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZFByZWNpb0Jhc2U6IG51bWJlcikge1xyXG4gICAgLy8gICAgIHZhciBkVG90YWxJbXB1ZXN0bzogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgIC8vICAgICAgICAgaW1wLlZhbG9yID0gKCtkUHJlY2lvQmFzZSkgKiAoK2ltcC5Qb3JjZW50YWplKTtcclxuICAgIC8vICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIG51ZXZvIGNvbmNlcHRvXHJcbiAgICAvLyAgICAgICAgIGltcC5CYXNlID0gZFByZWNpb0Jhc2U7XHJcbiAgICAvLyAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gKCtkVG90YWxJbXB1ZXN0bykgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgICAgIC8vU3VtYSBkZSBwcmVjaW8gYmFzZSBcclxuICAgIC8vICAgICAgICAgZFByZWNpb0Jhc2UgPSAoK2RQcmVjaW9CYXNlKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICBkVG90YWxJbXB1ZXN0byA9IE1hdGgucm91bmQoZFRvdGFsSW1wdWVzdG8gKiAxMDApIC8gMTAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciA9IGRUb3RhbEltcHVlc3RvLnRvU3RyaW5nKCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYWNpb24gbnVldm8gTTMgcHJvY2Vzb3MsIGVzdGUgdmEgdmFjaW8gc2luIG5pc2lxdWllcmEgTTNQRW5jSXRlbXMuIFxyXG4gICAgICogU2UgdXRpbGl6YSBwcmluY2lwYWxtZW50ZSBwYXJhIGxhcyBjcmVhY2lvbiBkZXNkZSAwIHVuIE0zIFByb2Nlc28uIFF1ZSBwYXNhIGRlIGVzdGFkb3MgJycgYWwgcHJpbWVyIGVzdGFkb1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBpZHByb2Nlc29fZGVzdGlubyBcclxuICAgICAqIEBwYXJhbSB0ZG9jIFxyXG4gICAgICogQHBhcmFtIG5kb2MgXHJcbiAgICAgKiBAcGFyYW0gZXN0YWRvc19mdXR1cm9zIFxyXG4gICAgICogQHBhcmFtIGlkSHViIFxyXG4gICAgICogQHBhcmFtIGlkVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ3JlYXRlTTNOZXdQcm9jZXNvRW1wdHkoaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZHByb2Nlc29fZGVzdGlubzogc3RyaW5nLCB0ZG9jOiBzdHJpbmcsIG5kb2M6IHN0cmluZyxcclxuICAgICAgICBlc3RhZG9zX2Z1dHVyb3M6IEFycmF5PGFueT4sIGlkSHViOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gaWRwcm9jZXNvX2Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IGVzdGFkb3NfZnV0dXJvc1swXS5FX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IGVzdGFkb3NfZnV0dXJvc1swXS5TRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuSURIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMxID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5URG9jID0gdGRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTkRvYyA9IG5kb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlRpcG9UZXJjZXJvID0gMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZSA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3VhbmRvIHNlIGFncmVnYSBwb3IgcHJpbWVyYSB2ZXogYWwgY2Fycml0byBkZSBjb21wcmEuXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvRGF0YVVzZXI6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT05cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgaWYgKGlvTTNQcm9jZXNvcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlRpcG9UZXJjZXJvID0gMTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5URG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTkRvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMxID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIC8vL0FHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuSURIdWIgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLklESHViO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb00zUHJvY2Vzb3MuVWJpYzE7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZSA9IC0xO1xyXG5cclxuICAgICAgICAvLy9GSU4gQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID09IFwiXCIgJiYgaW9NM1Byb2Nlc29zID09IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gXCJSZWdpc3Ryb1wiO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBcIkFjdGl2b1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5TdWJFc3RhZG9fbyAhPSBcIlwiICYmIG9NM1BJdGVtc1dFQi5Fc3RhZG9fbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5TdWJFc3RhZG9fbztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLkVzdGFkb19vO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvID09IFwiXCIgJiYgaW9NM1Byb2Nlc29zID09IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBcIk0zRUNDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMucHVzaCh0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKSk7XHJcbiAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgbnVsbCwgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIC8vdGhpcy5Qcm9jZXNhbWllbnRvU2VydmljZShQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvcywgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NhcmdhciBudWV2b3MgYWRpY2lvbmFsZXMgYWRpY2lvbmFsZXNcclxuICAgIHB1YmxpYyBMb2FkQWRpY2lvbmFsZXMob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKTogTTNQSXRlbXNXRUIge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIkNMQVZFUFJPRFNFUlZcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIkNMQVZFVU5JREFEXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiVU5JREFEXCIpLlZBTE9SO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1BJdGVtc1dFQjtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBwcm9jZXNvcywgcmV0b21hbmRvIGRlc2RlIGRhdGFcclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb00zUHJvY2Vzb3MuVmFsb3I7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID09IFwiXCIgJiYgb00zUEl0ZW1zV0VCLklkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMucHVzaCh0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKSk7XHJcbiAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgbnVsbCwgdmFsb3JEZXNjdWVudG8sIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvckRlc2N1ZW50byA9IDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICAvL1ZhbGlkYWNpb24gZGUgSW52ZW50YXJpby5cclxuICAgICAgICBsZXQgYWRpVmVudGFOZWcgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IFwiVkVOVEFORUdcIilcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIk0zRUNDXCIgJiYgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICYmIG9NM1ViaWNhY2lvbi5NM0hVQlNbMF0uVGlwbyA9PSBcIldFQlwiICYmICEoYWRpVmVudGFOZWcgJiYgYWRpVmVudGFOZWcuVkFMT1IpKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdID0gJ05vIGhheSBpbnZlbnRhcmlvIHBhcmEgYWdyZWdhciAnICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCArICcgSXRlbXMnO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEU7XHJcbiAgICAgICAgfSAvL2Vsc2Uge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zID0gdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9QYWRyZU0zUEVuY0l0ZW1zLCB2YWxvckRlc2N1ZW50byk7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICAvL1RpZW5lIHVuIGVuY2FiZXphZG8gcGFkcmUuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb1BhZHJlTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSkge1xyXG4gICAgICAgICAgICB2YXIgb2xNM1ByZFBhY2tEZXQ6IEFycmF5PE0zUHJkUGFja0RldD47XHJcbiAgICAgICAgICAgIG9sTTNQcmRQYWNrRGV0ID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLk0zUEFDS1xyXG4gICAgICAgICAgICBpZiAob2xNM1ByZFBhY2tEZXQgJiYgb2xNM1ByZFBhY2tEZXQubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vbGV0IHZhbG9yRGVzY3VlbnRvUGFjayA9IHRoaXMuY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sTTNQcmRQYWNrRGV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCA9IG9sTTNQcmRQYWNrRGV0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWNrTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJkUGFja0RldC5vTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gb00zUHJkUGFja0RldC5vTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBPYmplY3QuYXNzaWduKHt9LCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb00zUHJkUGFja0RldC5DYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQcmRQYWNrRGV0LmdzUGF0aEltYWdlbjtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCAqIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLkNhbGN1bGFyUHJlY2lvc1BDS0cob00zUHJkUGFja0RldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIGkgKyAyOyAvL0VzdG8gZnVuY2lvbmEgc2kgdGllbmUgc29sbyAyIG5pdmVsZXNcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVzdG8gc2UgY3VtcGxlIGVzdGUgcHJvZHVjdG8gZXMgdW4gcGFjayB5IHRpZW5lIHByb2R1Y3RvcyBhc29jaWFkb3MuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJkR2VuZXJhbCA9IG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTTNDb2RzLmZpbmQoeCA9PiB4LklkQ29kaWdvID09IFwiVVBDXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJkR2VuZXJhbCAmJiBwcmRHZW5lcmFsLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzID0gcHJkR2VuZXJhbC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIm5vIGHDg8KxYWRpIGNvZGlnbyBkZSBiYXJyYXMgYSBwcm9kdWN0byBoaWpvOiBcIiArIG9NM1ByZFBhY2tEZXQuU0tVSElKTylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBvTTNQcmRQYWNrRGV0Lk0zR1JQLCBvTTNQcm9jZXNvcy5NM0VOQywgcGFja00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcywgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjIzLCBlc3RvIGVzIGN1YW5kbyBzZSBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSBwcm9kY3V0b3MgZXhpc3RlbnRlcy5cclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOSBlbnZpbyBkZSBwYWRyZSBkZXNkZSBpbnN0cnVjY2lvbiBtYXMgYXJyaWJhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5UaXBvQWdydXBhY2lvbiA9IG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob00zUERpbmFtaWNhc0J5QWN0aXZpZGFkICYmIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQuZm9yRWFjaChkaW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BEaW5hbUJ5QWN0aXZpZGFkLnB1c2goey4uLiBkaW59KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0gPSBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1Byb2Nlc2FkbyA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCB2YWxvckRlc2N1ZW50b1BhY2sgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckl0ZW1zQ29tYm9TdW1hID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JGaW5hbENvbWJvID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0suZm9yRWFjaChwcmRQYWNrID0+IHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkID0gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA/IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgOiAxO1xyXG4gICAgICAgICAgICBsZXQgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJkUGFjay5NM0dSUCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLklETElTVEEpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPKVxyXG4gICAgICAgICAgICB2YWxvckl0ZW1zQ29tYm9TdW1hICs9IChwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh2YWxvckl0ZW1zQ29tYm9TdW1hID4gdmFsb3JGaW5hbENvbWJvKSB7XHJcbiAgICAgICAgICAgIHZhbG9yRGVzY3VlbnRvUGFjayA9IDEwMCAtICh2YWxvckZpbmFsQ29tYm8gKiAxMDAgLyB2YWxvckl0ZW1zQ29tYm9TdW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh2YWxvckRlc2N1ZW50b1BhY2spXHJcbiAgICAgICAgcmV0dXJuIHZhbG9yRGVzY3VlbnRvUGFjaztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcyBkZSBoaWpvcyBkZWwgcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1ByZFBhY2tEZXQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCkge1xyXG4gICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb2RpZ286IHN0cmluZywgdmFsb3IsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JZFByb2R1Y3RvID0gY29kaWdvO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTG90ZSA9IFwiMVwiO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTm9tYnJlID0gYENvbWJvIC0gJHtwcm9kdWN0b3NIaWpvc0RlbENvbWJvLm1hcCh4PT4geC5JZFByb2R1Y3RvKS5qb2luKCctJyl9YDtcclxuXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT0NPTUJPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiRU5DUFJPTU9cIiwgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJVTklURklERUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJGSURFTElaQUNJT05cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMUFJPTU9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG9Db21ibyk7XHJcbiAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5mb3JFYWNoKHByb2R1Y3RvID0+IHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgcHJvZHVjdG8uSWRFbmNQYWRyZSA9IHByb2R1Y3RvQ29tYm8uSUQ7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG8pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0NvbWJvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zQXBsU3VtYVZhbG9yID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKG9NM0VOQyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGV0RXNQcmRDb21ibyA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkVTUFJPRFBST01PQ09NQk9cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwICYmICEoZGV0RXNQcmRDb21ibyAmJiBkZXRFc1ByZENvbWJvLlZhbG9yID09IFwidHJ1ZVwiKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gMDtcclxuXHJcbiAgICAgICAgLy9mb3IgKGNvbnN0IG9NM0VOQyBvZiB0aGlzLm9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIWVuYy5JZEVuY1BhZHJlIHx8IGVuYy5JZEVuY1BhZHJlIDw9IDApKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvTTNFTkMgb2YgcHJvZHVjdG9zQXBsU3VtYVZhbG9yKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgTTNQcm9jZXNvIGVuY2FiZXphZG8gaXRlbXMsIGRlc2RlIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyA9IHVuZGVmaW5lZCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQRW5jSXRlbXMge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICB2YXIgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICB2YXIgaW5mTml2ZWxlc1ByY2lvO1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgdmFyIGRUb3RhbEltcHVlc3Rvc1RvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Nb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvUHJvbW86IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy9WZXJpZmljYXIgZWwgcHJlY2lvIGEgdXNhciwgdXNhbmRvIGxhIGxvZ2ljYSBkZSBuaXZlbGVzIGRlIHByZWNpb3MuXHJcbiAgICAgICAgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuICAgICAgICBpZiAodmFsb3JEZXNjdWVudG8gPiAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAqIHZhbG9yRGVzY3VlbnRvIC8gMTAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBlc3TDg8KhIHJlc3RpbmdpZG9cclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYSkpIHtcclxuICAgICAgICAgICAgdGhpcy5Bc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlbCB0b3RhbCBkZSBwdW50b3MgeSBlbCB2YWxvciB0b3RhbCBkZSBsYSBwcm9tb2Npw4PCs24gcG9yIGxhIGNxYW50aWRhZCBkZSBwcm9kdWN0b3MgZGUgbGEgbWlzbWEgcmVmZXJlbmNpYVxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Nb25lZGVybyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvOyAvL1VuaXRhcmlvIE1vbmVkZXJvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcblxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Qcm9tbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247IC8vUHJvbW9jaW9uIHVuaXRhcmlvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNEZXRDdXBvbmVzID0gdGhpcy5nZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYSwgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlIHByZWNpbyB0b3RhbCwgZGVzcHVlcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhcmdhciBwcm9kdWN0byBcclxuICAgICAgICAgICAgb00zUHJkR2VuZXJhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvID0gb00zUHJkR2VuZXJhbC5TS1U7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Mb3RlID0gb00zUHJkR2VuZXJhbC5MT1RFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk5vbWJyZSA9IG9NM1ByZEdlbmVyYWwuTk9NQlJFMTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUgPSBvTTNQcmRHZW5lcmFsLkRJU1BPTklCTEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5QYXRoSW1hZ2UgPSBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbjtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkNvZGlnb0JhcnJhcyA9IG9NM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXM7XHJcbiAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHViaUltcEZpam8gPSBvTTNVYmljYWNpb24uTTNVYmlBZGljaW9uYWxlcy5maW5kKHggPT4geC5BdHJpYnV0byA9PSBcIklNUEZJSk9cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAodWJpSW1wRmlqbyAmJiB1YmlJbXBGaWpvLlZhbG9yICE9IFwiXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQgPSB1YmlJbXBGaWpvLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIHRoaXMub01hdGhURi5yb3VuZChiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpLCAyKSk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuZENhbnRpZGFkICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IHBUb3RhbEJhc2UgLyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG9zVG90YWwgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIG9NM1BFbmNJdGVtcywgcFRvdGFsQmFzZSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgICAgIC8qKiBJTklDSU8gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpby50b1N0cmluZygpLCBcIkVTT0JTRVFVSU9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuU0tQMSwgXCJQUkRfRVNUSUxPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIub2JzZXJ2YWNpb24udG9TdHJpbmcoKSwgXCJPQlNFUlZBQ0lPTlwiKSk7ICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiwgXCJQQVRISU1BR0VOXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5CaXNQcm9kdWN0b1Byb21vLnRvU3RyaW5nKCksIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAgICAgLy9EZXRhbGxlcyBkZSBmYWN0dXJhIGVsZWN0cm9uaWNhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocHJvZEdSUFNlbGVjdGVkLlRJUE8sIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5VbmlkYWQsIFwiVU5JREFEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYsIFwiQ0xBVkVQUk9EU0VSVlwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkLCBcIkNMQVZFVU5JREFEXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtcywgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgdGhpcy5jYW1wb3NBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIpXHJcbiAgICAgICAgICAgIHRoaXMuTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvLyBMaXN0YSBkZSBQcm9tb2Npb25lcyBcclxuICAgICAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFBSRUNJT1VuaXRCYXNlLnRvU3RyaW5nKCksIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFRvdGFsSW1wdWVzdG9zVG90YWwudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKHRoaXMub01hdGhURi5yb3VuZCh0aGlzLkdldFVuaXRhcmlvQnlUb3RhbChvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK29NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyAtICtkVG90YWxJbXB1ZXN0b3NVbml0YXJpbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrZFBSRUNJT1VuaXRCYXNlICsgK2RVbml0YXJpb1Byb21vKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhIC8vRlMgMjAxOTA3MjUgQ29ycmVjY2lvbiBlbiBsYSBmb21yYSBkZSBjYWxjdWxhcmxvXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPLnRvU3RyaW5nKCksIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwudG9TdHJpbmcoKSwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Nb25lZGVyby50b1N0cmluZygpLCBcIlVOSVRGSURFTFwiKSk7Ly9Vbml0YXJpbyBmaWRlbGl6YWNpb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb1Byb21vLnRvU3RyaW5nKCksIFwiVlVOSVRQUk9NT1wiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBpZiAodGhpcy5nc0lka2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0YVNSID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0YVNSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQoeCA9PiB4LklETElTVEEgPT0gXCIyXCIpLlBSRUNJTy50b1N0cmluZygpLCBcIlBSRUNJT1NSXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyoqIEZJTiBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG5cclxuICAgICAgICAgICAgLy8gKioqIEluZm9ybWFjaW9uIGRlIGFjY2lvbmVzIGVuIGVsIGNsaWVudGUgKioqXHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuZW5jb250cmFkb0xvY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiTE9DQUxcIiwgXCJDT05TVUxUT0VOXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiU0VSVklET1JcIiwgXCJDT05TVUxUT0VOXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB0aGlzLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9pZiAoIW9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcikgLy8gKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gKCtvTTNQcm9jZXNvcy5WYWxvck5ldG8pICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyBkZWwgcHJvZHVjdG8gcXVlIHNlIGluZ3Jlc28gYWwgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMudHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGEpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0gPSBcIlByb2R1Y3RvIFJlc3RyaW5naWRvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUEVuY0l0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0cnVlIHNpIGVzdGUgcHJvZHVjdG8gc2UgZW5jdWVudHJhIHJlc3RyaW5naWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBsZXQgcHJvbW9SZXN0cmluZ2lkbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAgICAgaWYgKHByb21vUmVzdHJpbmdpZG8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBFeGNsdXllIHRvZG9zIGxvcyBpbXB1ZXN0b3MgZGVqYW5kbyBzb2xvIGVsIEZJSk8gc2kgZXMgZGUgbGEgdWJpY2FjaW9uIGRhZGEgXHJcbiAgICAgKi9cclxuICAgICBwdWJsaWMgR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEobGlzdGEsIGF0cmlidXRvKSB7XHJcbiAgICAgICAgaWYgKGxpc3RhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGxpc3RJRCA9IGxpc3RhLm1hcCh4ID0+IHhbYXRyaWJ1dG9dKTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIGxpc3RJRCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZXMgQ2FsY3VsYWRvcyBwb3IgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZENhbnRpZGFkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgLyoqIElOSUNJTyBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG4gICAgICAgIC8vIHZhciBkVG90YWxJbXB1ZXN0b3MgPSAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpXHJcbiAgICAgICAgLy8gdmFyIGRTdWJUb3RhbCA9IE1hdGgucm91bmQoKCtkUHJlY2lvVG90YWxTaW5EdG8gLSArZFRvdGFsSW1wdWVzdG9zKSAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgICAgIGxldCBzdWJUb3RhbCA9IDA7XHJcbiAgICAgICAgbGV0IHByZWNpb1RvdGFsU2luRHRvID0gMDtcclxuICAgICAgICBsZXQgdG90YWxJbXB1ZXN0b3NcclxuICAgICAgICAvL0FncmVnYXIgSW1wdWVzdG9zXHJcbiAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXMsIGRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgIC8vRlMgMjAxOTA3MjUgQXJyZWdsbyBlbiBlbCBjYWxjdWxvIGRlIHRvdGFsZXMgZW4gY2FzbyBkZSBoYWJlciBpbXB1ZXN0b3NcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vU3VidG90YWwgU3VtYXMgZGUgbGFzIGJhc2VzXHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpICsgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpKSksIDIpO1xyXG4gICAgICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEZyb21JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBcIlZhbG9yXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHN1YlRvdGFsICsgdG90YWxJbXB1ZXN0b3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL1NlIGFzdW1lIHF1ZSBubyBoYXkgaW1wdWVzdG9zIGVudG9uY2VzIGVsIHN1YlRvdGFsIGVzIGlndWFsIGFsIHByZWNpb1RvdGFsU2luRHRvXHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpLCAyKTtcclxuICAgICAgICAgICAgc3ViVG90YWwgPSBwcmVjaW9Ub3RhbFNpbkR0bztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCh0b3RhbEltcHVlc3RvcywgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRVbml0YXJpb0J5VG90YWwoZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKTtcclxuXHJcbiAgICAgICAgLy9MYSBmaWRlbGl6YWNpb24gZXMgdW4gcG9yY2FudGFqZSBwb3IgZW5kZSBubyBkZWJlIG11bHRpcGxpY2Fyc2UgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVU5JVEZJREVMXCIpLnRvU3RyaW5nKCksIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJVTklURklERUxcIikuVmFsb3IsIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMUkVBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBwcmVjaW9Ub3RhbFNpbkR0by50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHN1YlRvdGFsLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBcIkZVVFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIik7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3MgICAgICAgIFxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoKHN1YlRvdGFsICsgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciAtICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG5cclxuICAgICAgICAvKiogRklOIFZBTE9SRVMgRElOQU1JQ09TICovXHJcblxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDAgJiYgZENhbnRpZGFkID09IDApIHsvL1NpIGxhIGNhbnRpZGFkIGVzIDAgc2lnbmlmaWNhIHF1ZSBzZSBlc3TDg8KhIGJvcnJhbmRvIGVsIGl0ZW0gbyBlcyB1biBvYnNlcXVpbywgcG9yIGxvIHF1ZSBubyB0aWVuZSBzZW50aWRvIHF1ZSB0ZW5nYSBNM1BJbXB1ZXN0b1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBzdW1hdG9yaWEgZGUgbG9zIHZhbG9yZXMgZGUgdW4gYXRyaWJ1dG8gZGFkbyBkZWwgYXJyZWdsbyBkZSBpbXB1ZXN0b3NcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gYXRyaWJ1dG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBhdHJpYnV0bzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3VtYXRvcmlhID0gMDtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgc3VtYXRvcmlhID0gc3VtYXRvcmlhICsgKCtpbXB1ZXN0b1thdHJpYnV0b10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHN1bWF0b3JpYSwyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGRldF9jdGJsZF9pbXBfcHJkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpO1xyXG4gICAgICAgIGxldCBkZXRfcHJlY2lvX3VuaXRfYmFzZSA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKTtcclxuICAgICAgICBsZXQgdmFsb3JUb3RhbEltcHVlc3RvczogbnVtYmVyID0gMDtcclxuICAgICAgICBpZiAoZGV0X2N0YmxkX2ltcF9wcmQgJiYgZGV0X3ByZWNpb191bml0X2Jhc2UpIHtcclxuICAgICAgICAgICAgdmFsb3JUb3RhbEltcHVlc3RvcyA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoZGV0X2N0YmxkX2ltcF9wcmQuVmFsb3IsIG9NM1BFbmNJdGVtcywgK2JpZ0RlY2ltYWwubXVsdGlwbHkoZGV0X3ByZWNpb191bml0X2Jhc2UuVmFsb3IsIGNhbnRpZGFkKSwgY2FudGlkYWQsICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZCh2YWxvclRvdGFsSW1wdWVzdG9zLDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGV0OiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgb0RldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gc0NvbmNlcHRvKTtcclxuICAgICAgICBpZiAob0RldCkge1xyXG4gICAgICAgICAgICAvLyBFeGlzdGUgQWN0dWFsaXphXHJcbiAgICAgICAgICAgIG9EZXQuVmFsb3IgPSB2YWxvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL05vIGV4aXN0ZSBhZ3JlZ2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvci50b1N0cmluZygpLCBzQ29uY2VwdG8pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHRvdGFsXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgTnVldmEgQ2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NVbml0YXJpbyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRUb3RhbEJ5VW5pdGFyaW8oY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1VuaXRhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdW5pdGFyaW8gPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NVbml0YXJpbykuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArYmlnRGVjaW1hbC5tdWx0aXBseSh1bml0YXJpbywgY2FudGlkYWQpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHVuaXRhcmlvXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NUb3RhbCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRVbml0YXJpb0J5VG90YWwoY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1RvdGFsOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoK2NhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1RvdGFsKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICt0b3RhbCAvICtjYW50aWRhZDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIHJlbGFjaW9uYWRvcyBjb24gbGEgaW5mb3JtYWNpb24gZGUgc3cgZXh0ZXJuby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDg8KhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsODwqEgbGEgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbGVzRmlsdGVyOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPjtcclxuICAgICAgICAgICAgb0FkaWNpb25hbGVzRmlsdGVyID0gb0FkaWNpb25hbGVzLmZpbHRlcihhID0+IGEuQVRSSUJVVE8uc3RhcnRzV2l0aChcIkNTSUFfXCIpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXNGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzRmlsdGVyW2ldLlZBTE9SLCBvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw4PCoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDg8KhIGxhIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQURDX1wiICsgb0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQ0FNQURDX1wiICsgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBOb21icmUsIElELiBhIGRldGFsbGUgZGVsIGVuY2FiZXphZG8gZGUgcHJvZHVjdG8gYWdyZWdhZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIEluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIHByb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQ6IG51bWJlciwgYXBsaWNhZGFzID0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciBzTm9tYnJlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc0lkczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc1ZhbG9yZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsaWNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+ICF4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhID0geyBcIk5PTUJSRVNcIjogc05vbWJyZXMsIFwiSURcIjogc0lkcywgXCJWQUxPUkVTXCI6IHNWYWxvcmVzIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBzTm9tYnJlcyBcclxuICAgICAqIEBwYXJhbSBzSWRzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ1wiKSk7XHJcblxyXG4gICAgICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgICAgIGxldCBsaXN0Tm9tYnJlID0gZGF0YS5OT01CUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdElkID0gZGF0YS5JRC5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RWYWxvciA9IGRhdGEuVkFMT1JFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0SWQubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3ROb21icmVbX2ldLCBcIk5PTUJfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdElkW19pXSwgXCJJRF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0VmFsb3JbX2ldLCBcIlZBTF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQsIGZhbHNlKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXJnYXIgYSBkZXRhbGxlIGluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gaW5mTml2ZWxlc1ByY2lvIEluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBjYXJnYXLDg8KhIGxhIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKGluZk5pdmVsZXNQcmNpbyAmJiBpbmZOaXZlbGVzUHJjaW8uTklWRUwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGluZk5pdmVsZXNQcmNpby5OSVZFTCwgXCJOSVZFTFBSRUNJT1wiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGNvbiBxdWUgbml2ZWwgZGUgcHJlY2lvIHZhIGEgdHJhYmFqYXJcclxuICAgICAqIEBwYXJhbSBwcm9kR1JQU2VsZWN0ZWQgRWwgcHJvZHVjdG8gaW5ncmVzYWRvXHJcbiAgICAgKiBAcGFyYW0gaUNhbnRpZGFkIExhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgdmEgYSBpbmdyZXNhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmXHJcbiAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWwsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgZGUgbGEgbGlzdGEgZGUgcHJvbW9wcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIpOiBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+IHtcclxuICAgICAgICB2YXIgbGlzdF9jdXBvbmVzID0gQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG5cclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vX2Fzb2NpYWRhID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXNbX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb19hc29jaWFkYS5JZEN1cG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cG9uID0gbmV3IE0zUERldGFsbGVDdXBvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLklkQ3Vwb24gPSBwcm9tb19hc29jaWFkYS5JZEN1cG9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdF9jdXBvbmVzLnB1c2goY3Vwb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jdXBvbmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQXNpZ25hciBhIHByb21vY2lvbmVzIGNvbWJpYW5hcyBkZXNkZSBsbyBxdWUgc2UgZW5jb250csODwrMgYWwgZW5jYWJlemFkbyBpdGVtLCBkZWwgcHJvZHVjdG8gc2VsZWNjaW9uYWRvXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW9Bc28gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBhZ3JlZ2EgcHJvbW9jaW9uIGNvbWJpbmFkYSBhIGVuY2FiZXphZG8gZGUgaXRlbXMuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcy5wdXNoKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vQWdyZWdhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyksIFwiUFJPTU9DT01CSVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3MsIHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzaWduYXIgcHJvbW9jaW9uZXMgY29tYmlhbmRhcyBhIE0zIFByb2Nlc28sIGVzdGUsIHZhbGlkYSBxdWUgbm8gZXhpc3RhIHVuIHByb21vY2lvbiBhbnRlcmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpKSB7XHJcbiAgICAgICAgICAgIC8vLy8vLy8gZXhpc3RlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vLy8vIE5vIEV4aXN0ZVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLnB1c2gob1Byb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGRpbmFtaWNhcyBwcm9jZXNvIGRlIGNvbWJpbmFkYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhc0ZpbmRlZDogTTNQRGluYW1pY2FzO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBpZiAob00zUERpbmFtaWNhc0ZpbmRlZCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4gPSBKU09OLnBhcnNlKG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyclByb21vLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb21vQ29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gYXJyUHJvbW9baV0uSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9Db21iaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMucHVzaChhcnJQcm9tb1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IFwiQ09NQklOQURBXCI7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsbyBkZSBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgIHZhciBsVGlwb3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiRElSRUNUQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1PTkVERVJPXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTUFOVUFMXCIpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNFTkNQUk9NTyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBsVGlwb3MpO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb2Npb24oYXJyUHJvbW8sIHByb2RHUlBTZWxlY3RlZCwgb00zRU5DUFJPTU8sIHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhheSBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgeSBhZ3JlZ2FybG9zLlxyXG4gICAgcHVibGljIFZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5MaXN0T2JzU0tVICE9IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb21vLkxpc3RPYnNTS1UubGVuZ3RoKSBwcm9tby5MaXN0T2JzU0tVID0gW3Byb21vLkxpc3RPYnNTS1VdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tbywgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gcHJvbW8uSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vLCBvTTNQRW5jSXRlbXMsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLmxJZEFjdGl2YVByb21vICYmIHByb21vLmxJZEFjdGl2YVByb21vLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubElkQWN0aXZhUHJvbW8gPSB0aGlzLmxJZEFjdGl2YVByb21vLmNvbmNhdChwcm9tby5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGVzKHRoaXMubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEdXBsaWNhdGVzKGFycjogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciB1bmlxdWUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pcXVlLmluZGV4T2YoYXJyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHVuaXF1ZS5wdXNoKGFycltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY2FudGlkYWRSZWFsID0gTWF0aC5mbG9vcihjYW50aWRhZCAvIHByb21vLkNhbnRpZGFkT2JzZXEpO1xyXG4gICAgICAgIGlmIChwcm9tby5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZFJlYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZFJlYWwgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gcHJvbW8uTGlzdE9ic1NLVTtcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGNvbWJpLkFjY2lvbi5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8ob2JzZXF1aW9zLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ic2VxdWlvcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvcm5hIHRydWUgc2kgaGF5IG90cmEgcHJvbW8gYXBsaWNhZGEgZG9uZGUgbmkgbGEgcHJvbW8gZGUgb2JzZXF1aW8gbyBsYSBhcGxpY2FkYSBzb24gZmlqYXMgeSB1bmEgZGUgbGFzIGRvcyBlcyBFWENcclxuICAgIHZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW9PYnNlcXVpbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAocHJvbW9PYnNlcXVpby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgIGxldCBvUHJvbW9zTm9PYnNlcXVpb3MgPSBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LklEUHJvbW9jaW9uICE9IHByb21vT2JzZXF1aW8uSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9Qcm9tb3NOb09ic2VxdWlvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uQXBsaWNhZGEgJiYgKHByb21vLlJlZ2xhID09IFwiRVhDXCIgfHwgcHJvbW9PYnNlcXVpby5SZWdsYSA9PSBcIkVYQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9wcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvc1xyXG4gICAgcHVibGljIGFzeW5jIFByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IC0xO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3MgIT0gbnVsbCAmJiB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLlNLVSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA4MTAgdmFsaWRhLCBjdWFudG9zIHByb2R1Y3RvcyBzZSBhZ3JlZ2EgZW4gZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTExMiBzZSBhZ3JlZyBmdW5jaW9uYWxpZGFkIGRlIG9ic2VxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLmlkRW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbiA9IFwiT0JTUVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkd1YXJkYXJQcm9tb2Npb24odGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HdWFyZGFyIHByb21vY2lvbiBzZWd1biB1biBza3VcclxuICAgIC8vMS4gQnVzY2FyIGVsIHByb2R1Y3RvIHNlZ3VuIGVsIHNrdVxyXG4gICAgLy8yLiBBZ3JlZ2FyIGVsIHByb2R1Y3RvIGEgbTNwcm9jZXNvc1xyXG4gICAgLy8zLiBBZ3JlZ2FyIGFsIGNhcnJpdG8gZGUgY29tcHJhcy5cclxuICAgIHB1YmxpYyBhc3luYyBHdWFyZGFyUHJvbW9jaW9uKHByb21vLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIDIwMTgxMTIxICB2YXIgc0tleUNhcnJpdG87XHJcbiAgICAgICAgLy8gMjAxODExMjEgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBwcm9jZXNvUHJvbW87XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvLyAyMDE4MTEyMSBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG5cclxuICAgICAgICAvLyAyMDE4MTEyMSBvTTNQcm9jZXNvcyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHByb2Nlc29Qcm9tbyA9IGF3YWl0IHRoaXMuQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb0RhdGFVc2VyKTtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gcG91Y2ggREJcclxuICAgICAgICAvLyAyMDE4MTEyMSAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgcHJvY2Vzb1Byb21vKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbG9zIHByb2R1Y3RvIHNlZ3VuIHN1IFNLVSwgc2FjYW5kbyBsYSBpbmZvcm1hY2lvbiBkZXNkZSBwb3VjaERCLlxyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShwcm9tby5TS1UsIEVuTGluZWEsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcob1Byb2R1Y3RvKTtcclxuICAgICAgICBpZiAob1Byb2R1Y3RvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy9ZYSBubyBzZSBkZWphIHByZWNpbyBjZXJvIHNpbm8gcXVlIGNvbW8gZXMgb2JzZXF1aW8gc2ltdWxhIHVuIGRlc2N1ZW50byBkZWwgMTAwJSBcclxuICAgICAgICAgICAgLy9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGEgbTNwcm9jZXNvcyBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgLy9vTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBvUHJvZHVjdG8sIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgdGhpcy5nc0lka2F0aW9zLCBvTTNVYmljYWNpb24sIG51bGwsIG9NM1Byb2Nlc29zLCBudWxsLCAxMDApOy8vKlNlIG1hbmRhIHZhbG9yIGRlIGRlc2N1ZW5udG8gMTAwICVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBzZWd1biBlbCBTS1VcclxuICAgIHB1YmxpYyBhc3luYyBHZXRQcm9kdWN0b0J5U0tVKHNTS1UsIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSwgZGlzcG9uaWJsZU0zRW5jID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RvcztcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5HZW5lcmF0ZURhdGFWYWxpZGFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28pO1xyXG4gICAgICAgIGlmICghRW5MaW5lYSAmJiAhb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSB7XHJcbiAgICAgICAgICAgIHZhciBzSURQcm9kdWN0b3MgPSB0aGlzLmdzSWRrYXRpb3MgKyBcIj9QUkRcIjtcclxuICAgICAgICAgICAgcHJvZHVjdG9zID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb2R1Y3Rvcyk7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldE0zUHJkR3JwRnJvbUxpc3QocHJvZHVjdG9zLk0zTGlzdFByb2R1Y3Rvcy5NM0dSUCwgc1NLVSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmModGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcywgc1NLVSwgb0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDw9IDAgJiYgZGlzcG9uaWJsZU0zRW5jKSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFID0gZGlzcG9uaWJsZU0zRW5jO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCB0aGlzLkdvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLlZhbGlkYXJMaXN0YVByZWNpb3Mob1Byb2R1Y3RvLCB0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIHNpbiBpbXB1ZXN0b3MuIExhIGZvcm1hIGVzIGNhbGN1bGFyIHRvZG8gZWwgdmFsb3IgZGVsIGltcHVlc3RvLiBFSjogMTIwLjA5IC8gMS4xNi4gU2kgZWwgdmFsb3IgZGVsIGltcHVlc3RvIGVzOiAxNiVcclxuICAgIHB1YmxpYyBDYWxjdWxhdGVQcmVjaW9CYXNlKENUQkxESU1QUFJEOiBzdHJpbmcsIGRWYWxvck5ldG86IG51bWJlcikge1xyXG4gICAgICAgIC8vdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHZhciBkVmFsb3JCYXNlOiBudW1iZXIgPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAgMjAxOTA2MjYgQ2FtYmlvIGRlIGNhbGN1bG8gZGUgYmFzZSBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAvICgxICsgK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC0gKCtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvTTNQRW5jSXRlbXMuTTNJbXB1ZXN0b3MpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JldHVybiAoKCtkVmFsb3JOZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgICAgICByZXR1cm4gZFZhbG9yQmFzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBpbmZvcm1hY2nDg8KzbiBkZSBpbXB1ZXN0b3MsIGRlc2RlIGVsIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChDVEJMRElNUFBSRDogc3RyaW5nLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLFxyXG4gICAgICAgIGRWYWxvck5ldG86IG51bWJlciwgY2FudGlkYWQ6IG51bWJlciwgdmFsb3JUb3RhbFByb2R1Y3RvVW5pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgb00zUEltcHVlc3RvczogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JCYXNlVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoZFZhbG9yTmV0bywgNCk7XHJcbiAgICAgICAgICAgIGxldCB2YWxvck5ldG9Ub3RhbCA9IHZhbG9yQmFzZVRvdGFsO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclRvdGFsUHJvZHVjdG9Vbml0LCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNiBDYW1iaW8gZW4gb3JkZW4gZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclJlYWxJbXAgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXAgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUT1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zID0gbmV3IE0zUEltcHVlc3RvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8gPSBpbXAuJC5Db2RJbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Qb3JjZW50YWplID0gaW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7Ly9QT1JDRU5UQUpFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KGltcC4kLlZhbG9yLCB2YWxvck5ldG9Ub3RhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ly9GSUpPXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBOdWV2byBjb25jZXB0byBkZSBiYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yTmV0b1RvdGFsLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZCgoK2RUb3RhbEltcHVlc3RvKSwyKSArIHRoaXMub01hdGhURi5yb3VuZCgoK29NM1BJbXB1ZXN0b3MuVmFsb3IpLDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBTdW1hIGRlIFZhbG9yIE5ldG9cclxuICAgICAgICAgICAgICAgICAgICB2YWxvck5ldG9Ub3RhbCA9IHRoaXMub01hdGhURi5yb3VuZCgoK3RoaXMub01hdGhURi5yb3VuZCh2YWxvck5ldG9Ub3RhbCwgMikpICsgdGhpcy5vTWF0aFRGLnJvdW5kKCgrb00zUEltcHVlc3Rvcy5WYWxvciksMiksIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vL1NvbG8gYWRpY2lvbmUgYSBpbXB1ZXN0b3MsIGN1YW5kbyBlcyB0b3RhbCBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wRXhpc3RlOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wRXhpc3RlID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maW5kKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gPT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcEV4aXN0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0JvcnJhIGVuIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3RvcyA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmlsdGVyKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gIT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MucHVzaChvTTNQSW1wdWVzdG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmZvckVhY2goaW1wID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzI2IHNlIGFncmVnYSB2YWxpZGFjaW9uLCB5YSBxdWUgZXN0YWJhIHF1ZWRhbmRvIGxhIHJlc3RhLCBjb24gdmFsb3JlcyBjb21vOiAwLjAwMDAwMDAwMDAxID0gMS4xNTY0NTY0NTY0ZTg0NSBFSlxyXG4gICAgICAgICAgICBpZiAoZFRvdGFsSW1wdWVzdG8gIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9EaWZlcmVuY2lhIHJlZG9uZGVhZGEgYSBkb3MgZGVjaW1hbGVzXHJcbiAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZChkVG90YWxJbXB1ZXN0bywgMik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgoK3ZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gK3RoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwyKSAtICtkVG90YWxJbXB1ZXN0byksIDIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRpZmVyZW5jaWEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgrKCt2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtICt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsIDIpIC0gK2RUb3RhbEltcHVlc3RvKS50b0ZpeGVkKDQpLDIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcIlRPVEFMSU1QVUVTVE9TXCJcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoKHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLDIpKSwgMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDcyNVxyXG4gICAgICogQ29ycmlnZSBlbCB2YWxvciBxdWUgdG9tbyBlbCBpbXB1ZXN0byBkZXNwdWVzIGRlIGhhYmVyc2UgcmVkb25kZWFkb1xyXG4gICAgICogU2kgYWwgcmVjb3JyZXIgdG9kb3MgbG9zIGltcHVlc3RvcyBsYSBkaWZlcmVuY2lhIG5vIHNlIHphbmphLCBOSSBNT0RPUyBlbCBlcnJvciBlc3TDg8KhIGVuIG90cmEgcGFydGVcclxuICAgICAqIFNlIGNyZWEgZXN0YSBmdW5jacODwrNuIHBhcmEgcmVzb2x2ZXIgbG9zIGVycm9yZXMgZGUgdGltYnJhZG8gZGUgZmFjdHVyYSBlbGVjdHLDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIERpZmVyZW5jaWEgcXVlIHNlIGRlYmUgc2FsZGFyIHBhcmEgY29uc2VndWlyIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyByZXF1ZXJpZG9cclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZGlmZXJlbmNpYTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBwb3NpdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtZW5vciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYXJyaWJhXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYXJyaWJhXCIgeSByZXN0YSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yIDwgaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcj5WYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgeSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgbmVnYXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWF5b3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhYmFqb1xyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFiYWpvXCIgeSBzdW1hIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPiBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPFZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgeWEgc2Ugc2FsZG8gbGEgZGlmZXJlbmNpYSByb21wZSBlbCBjaWNsbyBkYW5kbyBwb3IgY29uY2x1aWRvIGVsIGFqdXN0ZVxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0xvYWQgcG9yIHVuaWRhZCBkZXRhbGxlIGRlbCBtM3Byb2Nlc28gaXRlbXMuXHJcbiAgICBwdWJsaWMgTG9hZE0zUERldGFsbGUoc1ZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKTogTTNQRGV0YWxsZUl0ZW1zIHtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gc0NvbmNlcHRvO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBzVmFsb3I7XHJcbiAgICAgICAgcmV0dXJuIG9NM1BEZXRhbGxlSXRlbXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vR2VuZXJhciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICBwdWJsaWMgYXN5bmMgR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyB8fCAob00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyAmJiAhb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJQVUVOVEVfRElBUklPXCIpKSkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NvbXBhcmUgTTNQcm9jZXNvcy4gKEZpcnN0OiBAUGFyYW06IGlsTTNQcm9jZXNvc1NRTCBWUyBTZWNvbmQ6IEdldCBGcm9tIENvdWNoREIvUG91Y2hEQilcclxuICAgIHB1YmxpYyBhc3luYyBDb21wYXJlTTNQcm9jZXNvKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBpbE0zUHJvY2Vzb3NTUUw6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb1Jlc3A7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgdmFyIFByb3BlcnR5Q29tcGFyZSA9IFtcIlZhbG9yTmV0b1wiLCBcIlZhbG9yXCJdO1xyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIG9NM1Byb2Nlc29zQ09VQ0g6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0ggPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuXHJcbiAgICAgICAgICAgIC8vU3RhcnQgQ29tcGFyZVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb3BlcnR5Q29tcGFyZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlsTTNQcm9jZXNvc1NRTFtQcm9wZXJ0eUNvbXBhcmVbaV1dICE9IG9NM1Byb2Nlc29zQ09VQ0hbUHJvcGVydHlDb21wYXJlW2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9Db21wYXJlOiBJRCwgSWRQcm9kdWN0byB5IENBTlRJREFEXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlsTTNQcm9jZXNvc1NRTC5NM0VOQy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklEICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JRCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklkUHJvZHVjdG8gIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklkUHJvZHVjdG8gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogYlJlc3AsIFwiTTNQcm9jZXNvc1wiOiBvTTNQcm9jZXNvc0NPVUNIIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIENvbXBhcmVNM1Byb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogdHJ1ZSwgXCJNM1Byb2Nlc29zXCI6IG51bGwgfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGNvbWVyY2lhbCBhbCBwcm9jZXNvLCBsbyBhZGljaW9uYSBhbCBhcnJlZ2xvIGRlIGRpbmFtaWNvcyBhc29jaWFkbyBhbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIEFkZENvbWVyY2lhbFRvTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBUZG9jQ29tZXJjaWFsOiBzdHJpbmcsIE5kb2NDb21lcmNpYWw6IHN0cmluZykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJUQ09NRVJDSUFMXCIsIFRkb2NDb21lcmNpYWwpKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTkNPTUVSQ0lBTFwiLCBOZG9jQ29tZXJjaWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DcmVhY2lvbiB5IHJldG9ybm8gZGUgdHVwbGEgZGUgZGluYW1pY29zLCBhdGFkb3MgYSBwcm9jZXNvIG0zLlxyXG4gICAgcHVibGljIENyZWF0ZVR1cGxhRGluYW1pY2Eobm9tYnJlLCB2YWxvcikge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gbm9tYnJlO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSB2YWxvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BEaW5hbWljYXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0FjdHVhbGl6YSBsYSBjYW50aWRhZCBkZSBcclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZEFMTFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaUNhbnRpZGFkKSB7XHJcblxyXG4gICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vU2UgY2FudGlkYWQgZGUgdW4gcHJvZHVjdG8gZXNwZWNpZmljb1xyXG4gICAgcHVibGljIHNldENhbnRpZGFkWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLFxyXG4gICAgICAgIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgdGlwb1ViaWNhY2lvbiwgSURFbmMsXHJcbiAgICAgICAgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGZvcnphckJvcnJhZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmICgoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCAmJiB0aXBvVWJpY2FjaW9uID09IFwiV0VCXCIpIHx8IGZvcnphckJvcnJhZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBwcm9kLklEID09IElERW5jKSAmJiAhKHByb2QuSWRFbmNQYWRyZSA9PSBJREVuYykpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSkFHTSAyMDE5MTAyMSwgbm8gaGFjZXIgbMODwrNnaWNhIGRlIHByb21vY2lvbmVzIHkgdmFyaW9zLCBjdcODwqFuZG8gc2UgYm9ycmEgZWwgaXRlbS5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIHRvbWEgZW4gY3VlbnRhIGVsIHByZCB5IHN1cyBoaWpvcyBjb24gZWwgSWRFbmNQYWRyZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykgfHwgZW5jLklkRW5jUGFkcmUgPT0gSURFbmMpLmZvckVhY2gocHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwcmQuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkOy8vQW50aWd1YSBsb2dpY2FcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhbnRpZGFkVjIob00zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8pLnRoZW4ocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24sIHJlc3AuTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYW1iaWFyIGNhbnRpZGFkIGRlIG0zcHJvY2Vzb1xyXG4gICAgLy9KQUdNIDIwMTkxMDE4IFNlIGFncmVnYSBudWV2YSBmdW5jaW9uYWxpZGFkIGEgbGEgY2FudGlkYWQ6IFxyXG4gICAgLy8xLlNlIGJvcnJhIGVsIHByb2R1Y3RvIGRlIGxhIGxpc3RhIGRlbCBwcm9jZXNvXHJcbiAgICAvLzIuIFNlIGFncmVnYSBkZSBudWV2byBlbCBwcm9kdWN0byBjb24gbGEgbnVldmEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyOiBhbnlcclxuICAgICAgICAsIHNJREthdGlvczogc3RyaW5nLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPikge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTE0LCBBZ3JlZ2FyIGltYWdlblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKTtcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUEVuY0l0ZW1zLlBhdGhJbWFnZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIShlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgKGVuYy5JRCA9PSBJREVuYyB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykpKTtcclxuXHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKGlkUHJvZHVjdG8sIHRydWUsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0byk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiB7IFwiTTNQcm9jZXNvXCI6IG9NM1Byb2Nlc29zLCBcIk0zUEl0ZW1zV0VCXCI6IG9NM1BJdGVtc1dFQiB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGNhbnRpZGFkIGRlIHVuIGVuY2FiZXphZG8sIHByb2R1Y3RvIGVzcGVjaWZpY28uXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9kdWN0bzogTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9Qcm9kdWN0by5TS1UgJiYgZW5jLkxvdGUgPT0gb1Byb2R1Y3RvLkxPVEUpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL1JFR0lPTiBERSBSRUNFUENJT05cclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgcmVjZXBjaW9uXHJcbiAgICBwdWJsaWMgTWVyZ2VSZWNlcFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUmVjZXBjaW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5maWx0ZXIocmVjZXAgPT4gcmVjZXAuSWRSZWNlcGNpb24gPT0gaWRSZWNlcGNpb24pLmZvckVhY2gocmVjID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JRCA9PSByZWMuSWRFbmMpLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShyZWMuQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDVVJDUkVDXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow4PCrSBtaXNtbyBhZ3JlZ2EgbcODwqFzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNSZWMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDUkVDXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL0ZJTiBSRUdJT04gREUgUkVDRVBDSU9OXHJcblxyXG4gICAgLy8vLy8vL1JFR0lPTiBFTlRSRUdBXHJcbiAgICAvL1NlIGFncmVnYSBhdHJpYnV0byBkZSBDdXJyZW50IGNhbnRpZGFkIGRlIGVudmlvXHJcbiAgICBwdWJsaWMgTWVyZ2VFbnRwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQRW52aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQRW52aW9zLmZvckVhY2goZW52ID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBsRW5jOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgICAgICBsRW5jID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiBlbmMuSWRFbnZpbyA9PSBlbnYuSWRFbnZpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxFbmMgIT09IHVuZGVmaW5lZCAmJiBsRW5jICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsRW5jLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IsIFwiQ1VSQ0VOVFwiKSk7Ly9DVVJSRU5UIENBTlRJREFEIFJFQ0VQQ0lPTlxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow4PCrSBtaXNtbyBhZ3JlZ2EgbcODwqFzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNFbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDRU5UXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgLy8vLy8vL0ZJTiBSRUdJT04gRU5UUkVHQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21vY2lvbmVzIHF1ZSBzZSBwcm9jZXNhbiBkZXNwdWVzIGRlIGFncmVnYXIgYWwgY2Fycml0b1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhVXNlciBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKiBAcGFyYW0gb00zVWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIEVuTGluZWEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBQcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbikge1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLlByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FyIHByb21vY2lvbmVzIGRlc3B1ZXMgZGUgZmluYWxpemFyIGVsIHJlZ2lzdHJvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jUHJvbW9BZnRlckZpbmFsaXphcihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG5cclxuICAgICAgICB0aGlzLkdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICB0aGlzLlByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgbFRpcG9zUHJvbW8gPSBuZXcgQXJyYXk8U3RyaW5nPigpO1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBsVGlwb3NQcm9tby5wdXNoKFwiQUZURVJcIik7XHJcbiAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgbnVsbCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zUHJvbW8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vQWZ0ZXIoYXJyUHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIGEgaW5mb3JtYWNpb24gZGluYW1pY2EgZGVsIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIDApO1xyXG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJWQUxfUFJPTU9DXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24udG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5PTUJfUFJPTU9DXCIsIGRhdGEuTk9NQlJFUylcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIklEX1BST01PQ1wiLCBkYXRhLklEKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBwcm9jZXNvIGFzb3NpYWRvIGEgdW4gaWRwcmVzdGFtb3NcclxuICAgIGFzeW5jIGdldF9tM19wcm9jZXNvX2J5X2lkX3ByZXN0YW1vX2FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9nZXRNM1Byb2Nlc29CeUlkUHJlc3RhbW8vJyArIGlkX2thdGlvcyArICcvJyArIGlkX3ByZXN0YW1vKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDb25jZXB0b00zU2FsZG9zSXRlbVViLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIG8gbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgZGVudHJvIGRlbGEgbGlzdGEgZGUgdW4gUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb2R1Y3RvVG9PdHJhc0NsYXMocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBjYW50aWRhZDogbnVtYmVyLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IHRoaXMudmFsaWRhckV4aXN0YU90cmFDbGFzaWYob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgcHJvZHVjdCk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvRXhpc3RlKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkID0gcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgKyBjYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzID0gbmV3IE0zT3RDbGFzaWZpY2FjaW9uZXMoKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5Ob21icmUgPSBwcm9kdWN0VW5pdFNlbGVjdGVkLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklEID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIklEXCIpICsgMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5wdXNoKG9NM090Q2xhc2lmaWNhY2lvbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIHBvbmllbmRvIHN1IHZhbG9yIHkgY2FudGlkYWQgZW4gY2Vyb1xyXG4gICAgICogQHBhcmFtIG9NM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZGVsZXRlUHJvZHVjdG9Gcm9tT3RyYXNDbGFzKG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9BY3R1YWwgPSBpb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5DYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLlZhbG9yID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGEgZWwgdmFsb3IgZGUgTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgYSBwYXJ0aXIgZGUgbGEgc3VtYXRvcmlhIGRlIGxvcyBvYmpldG9zIGRlbnRybyBkZWwgYXJyZWdsbyBNM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgPSBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnJlZHVjZShmdW5jdGlvbiAoc3VtYSwgb00zT3RDbGFzaWZpY2FjaW9uZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bWEgKyBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvcjtcclxuICAgICAgICB9LCAwKVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsYSBleGlzdGVuY2lhIGRlIHVuIHByb2R1Y3RvIGRlbnRybyBkZSB1biBsYSBsaXN0YSBkZSBNM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqL1xyXG4gICAgdmFsaWRhckV4aXN0YU90cmFDbGFzaWYobGlzdE0zT3RDbGFzaWZpY2FjaW9uZXM6IEFycmF5PE0zT3RDbGFzaWZpY2FjaW9uZXM+LCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSBsaXN0TTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uU0tVKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9FeGlzdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogTGltcGlhIGxvcyBkZXRhbGxlcyB5IGxvcyBpbXB1ZXN0b3MgZGUgdW4gcHJvZHVjdG8gZGFkbyBlbiB1biBwcm9jZXNvIGRlIGRldm9sdWNpb25cclxuICAgKiBAcGFyYW0gcHJvZHVjdG9Cb3JyYWRvIFxyXG4gICAqIEBwYXJhbSBwcm9jZXNvRGV2b2x1Y2lvbiBcclxuICAgKi9cclxuICAgIGRlbGV0ZVByZERldm9sdWNpb24ocHJvZHVjdG9Cb3JyYWRvLCBwcm9jZXNvRGV2b2x1Y2lvbjogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0byA9IHByb2Nlc29EZXZvbHVjaW9uLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdG9Cb3JyYWRvLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0bykge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5NM0RFVC5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKCtkZXQuVmFsb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFqdXN0YSBsb3MgVmFsb3JlcyBlbiBjYXNvIGRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBwYXJhIHBvZGVyIGdlbmVyYXIgRkVcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yVmFsb3Jlc0NGRElGcm9udChvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBkaWZlcmVuY2lhID0gMDtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3MpO1xyXG5cclxuICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKG9NM1Byb2Nlc29zLlZhbG9yTmV0byAtIChvTTNQcm9jZXNvcy5WYWxvciArIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyAtIHRvdGFsRGVzY3VlbnRvcyksIDMpO1xyXG4gICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBwcm9tb2Npb25lcyBhcGxpY2FkYXMgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDg8KzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0YWxsZVByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICAgICAgaWYgKGRldGFsbGVQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgdG90YWxEZXNjdWVudG9zICs9ICtkZXRhbGxlUHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsRGVzY3VlbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgaW1wdWVzdG9zIGNvYnJhZG9zIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw4PCs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgZW5jLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgKz0gK2ltcC5WYWxvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbEltcG9ydGVJbXB1ZXN0b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBpbXB1ZXN0byBlbiAwLjAxIHkgc3UgY29ycmVzcG9uZGllbnRlIGJhc2UgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgYWp1c3RvID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGltcCBvZiBlbmMuTTNQSW1wdWVzdG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gaW1wLlZhbG9yIC8gaW1wLlBvcmNlbnRhamU7XHJcbiAgICAgICAgICAgICAgICBhanVzdG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFqdXN0bykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBkZXNjdWVudG8gZW4gMC4wMSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgZGV0YWxsZVRvdGFsUHJvbW86IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVRvdGFsUHJvbW8gJiYgK2RldGFsbGVUb3RhbFByb21vLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yIC0gMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciArIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFByZHNHZW5lcmFsRnJvbU0zUHJvY2Vzby8nICsgc0lkS2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVHJ4IHtcclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGVsIGRpYXJpbyBkZSB0cmFuc2FjY2lvbmVzIGRlc2RlIHNlcnZpY2lvIHJlc3QgTTNUcnguIE1pY3Jvc2VydmljaW8gTTMuXHJcbiAgICBwdWJsaWMgTTNfR2V0RGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9NM19HZXREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YURpYXJpbztcclxuICAgICAgICAgICAgb0RhdGFEaWFyaW8gPSByZXNwO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhID0gbmV3IEFycmF5KG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGRpYXJpbyBkZSB0cmFuc2FjY2lvbmVzIGRldGFsbGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19nZXREaWFyaW9UcngoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9tM19nZXREaWFyaW9UcngvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFEaWFyaW87XHJcbiAgICAgICAgICAgIG9EYXRhRGlhcmlvID0gcmVzcDtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8gPSBuZXcgQXJyYXkob0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSB0cmFuc2FjY2lvbi5cclxuICAgIHB1YmxpYyBNM19HZXRJbmZvVFJYKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vbGV0IGRhdGEgPSB7ICdUb3AnOiB0b3AgfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L00zX0dldEluZm9UUlgvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YVRSWDtcclxuICAgICAgICAgICAgb0RhdGFUUlggPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TID0gbmV3IEFycmF5KG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUy5mb3JFYWNoKHRpcG8gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpcG8uVFJYLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlwby5UUlggPSBuZXcgQXJyYXkodGlwby5UUlgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9EYXRhVFJYKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9DYW1iaW8gZGUgZXN0YWRvIGRlIHViaWNhY2lvblxyXG4gICAgcHVibGljIENhbWJpb0VzdGFkb1ViaWNhY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb00zVWJpY2FjaW9uOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNUcngvQ2FtYmlvRXN0YWRvVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcblxyXG4gICAgLy9DYW1iaW8gZGUgZXN0YWRvIGRlIEhVQlxyXG4gICAgcHVibGljIENhbWJpb0VzdGFkb0h1YihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb00zVWJpY2FjaW9uOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNUcngvQ2FtYmlvRXN0YWRvSHViLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmVjTGlzdFByZWNpb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVjLWxpc3QtcHJlY2lvcy50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZUxpc3RhUHJlY2lvIHtcclxuXHJcbiAgICBwcml2YXRlIGdvRGF0YTogYW55O1xyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBhbnk7XHJcbiAgICBwcml2YXRlIGxQcmVjaW9zU2VsZWN0ZWQ6IHN0cmluZyA9IFwiLTFcIjtcclxuXHJcbiAgICAvL0dlbmVyYXIgSlNPTiBnZW7Dg8KpcmljbywgcGFyYSB2YWxpZGFyIGxhIGxpc3RhIGRlIHByZWNpb1xyXG4gICAgY29uc3RydWN0b3IobG9nZWRfdXNlcjogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBvRGF0YSA9IHsgXCJVU0VSXCI6IGxvZ2VkX3VzZXIsIFwiUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH1cclxuICAgICAgICB0aGlzLmdvRGF0YSA9IG9EYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TGlzdGFQcmVjaW9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBJZEthdGlvcztcclxuICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgdmFyIG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcztcclxuICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSB0aGlzLkdldExQcmVjaW9zSW5TdG9yYWdlKElkS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYoIW9MaXN0UHJlY0xQKXtcclxuICAgICAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MsIEpTT04uc3RyaW5naWZ5KGxQcmVjaW8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhsUHJlY2lvKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MsIGxQcmVjaW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKipcclxuICAgICAqIE9idGVuZXIgbGlzdGEgZGUgcHJlY2lvcyBkZXNkZSBzdG9yYWdlIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExQcmVjaW9zSW5TdG9yYWdlKGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIHNQcmVjaW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdMUFwiICsgZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgdmFyIG9QcmVjaW9zOmFueTtcclxuICAgICAgICBpZihzUHJlY2lvcyl7XHJcbiAgICAgICAgICAgIG9QcmVjaW9zID0gSlNPTi5wYXJzZShzUHJlY2lvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJlY2lvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9CdXN1Y2FyIGxhIGxpc3RhIGRlIHByZWNpbywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgRmluZExQcmVjaW8ob0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAgIT0gbnVsbCAmJiBvTGlzdFByZWNMUC5JRCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLklEICE9IG51bGwpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJlYyBvZiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFQTFJlZ2xhKHByZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhwcmVjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIHJlZ2xhcywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgVmFsaWRhckFQTFJlZ2xhKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcyk6IGJvb2xlYW57XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTGlzdFByZWNMUC5Qcm9waWVkYWQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRU1QUkVTQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdzSWRLYXRpb3MudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVCSUNBQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuUHJvY2Vzby50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhVQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLklESFVCLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hW29MaXN0UHJlY0xQLlByb3BpZWRhZC50b1VwcGVyQ2FzZSgpLnRyaW0oKV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2ggKGV4KXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogXCIgKyBleClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihiUmVzcCl7XHJcbiAgICAgICAgICAgIHRoaXMubFByZWNpb3NTZWxlY3RlZCA9IG9MaXN0UHJlY0xQLkxpc3RhUHJlY2lvcztcclxuICAgICAgICAgICAgdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIENvbXBhcmUodmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjb25maWd1cmFjaW9uL2VuY2FiZXphZG8gbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmZpZ0xpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMywgSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2Uob0xpc3RQcmVjTFAsSWRLYXRpb3MpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdFByZWNMUDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RpblByb2Nlc29ze1xyXG4gICAgcHVibGljIGlkX3Byb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIGlkX3N1Yl9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9kaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGlwb19kaW5hbTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0dWxvOnN0cmluZztcclxuICAgIHB1YmxpYyBlc3RydWN0dXJhX2Rlc3Rpbm86IHN0cmluZztcclxuICAgIHB1YmxpYyBWRGVmYXVsdDogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkUGFja0RldCB7XHJcbiAgICBwdWJsaWMgTE9URTogc3RyaW5nO1xyXG4gICAgcHVibGljIExPVEVISUpPOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgU0tVSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1BhY2s6IHN0cmluZztcclxuICAgIHB1YmxpYyBnc1BhdGhJbWFnZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgcHVibGljIE0zR1JQID0gbmV3IFR5cGVNM1ByZEdycCgpO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JBZGljaW9uYWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBJZEdycDogc3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1ViaUFkaWNpb25hbGVze1xyXG4gICAgcHVibGljIEF0cmlidXRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNVYmlBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zSHVicyB9IGZyb20gXCIuL20zLWh1YnMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9ue1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9VYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvY0FkbWluOnN0cmluZztcclxuICAgIHB1YmxpYyBKQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgU2VyaWU6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvSUQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zVWJpQWRpY2lvbmFsZXM6QXJyYXk8TTNVYmlBZGljaW9uYWxlcz47XHJcbiAgICBwdWJsaWMgTTNIVUJTID0gbmV3IEFycmF5PE0zSHVicz4oKTtcclxuICAgIHB1YmxpYyBGZWNoYVRyYWJham86RGF0ZTtcclxuICAgIHB1YmxpYyBBUExVYmljRXh0ZXJuYXM6Qm9vbGVhbjtcclxuICAgIFxyXG59IiwiaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSBcIi4vTTNDT05ESVBST01PLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNDT05ESUFHUlVQQUNJT057XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQWdydXBhY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgT3BlcmFkb3I6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBNM0NPTkRJUFJPTU86QXJyYXk8TTNDT05ESVBST01PPjtcclxufSIsImltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gXCIuL00zREVUQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmNlcHRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNERVRDT05ESVBST01POiBBcnJheTxNM0RFVENPTkRJUFJPTU8+O1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RFVENPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gXCIuL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNFTkNQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvMjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmlnZW5jaWE6RGF0ZTtcclxuICAgIHB1YmxpYyBJbmljaW86RGF0ZTtcclxuICAgIHB1YmxpYyBFc3RhZG86Ym9vbGVhbjtcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBFc3RhZG9NYW51YWxlczpib29sZWFuID1mYWxzZTtcclxuICAgIHB1YmxpYyBFc01hbnVhbDpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvQXBsQ3Vwb246Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNBcGxDdXBvbjpib29sZWFuPSBmYWxzZTtcclxuICAgIHB1YmxpYyBUb3BlOm51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESUFHUlVQQUNJT046QXJyYXk8TTNDT05ESUFHUlVQQUNJT04+O1xyXG59IiwiaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcInByb2plY3RzL3JlZ2xhbmVnb2Npb20zMS9zcmMvcHVibGljX2FwaVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9uU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbjtcclxuICAgIGNvbnN0cnVjdG9yKG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24pIHtcclxuICAgICAgICB0aGlzLmdvTTNVYmljYWNpb24gPSBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldERpcmVjY2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiRElSRUNDSU9OXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRUZWxlZm9ubygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiVEVMRUZPTk9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxPTkdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExhdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiTEFUXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEFkaWNpb25hckJ5QXRyaWJ1dGUoQXRyaWJ1dG86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsOiBNM1ViaUFkaWNpb25hbGVzID0gdGhpcy5nb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkF0cmlidXRvID09IEF0cmlidXRvKTtcclxuICAgICAgICAgICAgaWYgKG9BZGljaW9uYWwgIT09IHVuZGVmaW5lZCAmJiBvQWRpY2lvbmFsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvQWRpY2lvbmFsLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1jYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzb1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ291Y2hQUkRTU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLXByZHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvIHtcclxuXHJcbiAgICBwcml2YXRlIGdzSWRLYXRpb3M6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZGVyOiBGaWxlUmVhZGVyO1xyXG4gICAgcHJpdmF0ZSBzZXBhcmFkb3I6IHN0cmluZyA9IFwiLFwiO1xyXG4gICAgcHJpdmF0ZSBvTTNQcm9jZXNvID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgIHByaXZhdGUgcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHByaXZhdGUgQ29uZk1hc2l2YTogYW55O1xyXG4gICAgcHVibGljIHJvdW5kZWRfcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHB1YmxpYyBnYkJhckNvZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKGlzSWRLYXRpb3M6IHN0cmluZywgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGlDb25mTWFzaXZhOiBhbnksIGliQmFyY29kZTogYm9vbGVhbixcclxuICAgICAgICBwcml2YXRlIG9Db3VjaFBSRFNTZXJ2aWNlOiBDb3VjaFBSRFNTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gaW9NM1Byb2Nlc287XHJcbiAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gaXNJZEthdGlvcztcclxuICAgICAgICB0aGlzLkNvbmZNYXNpdmEgPSBpQ29uZk1hc2l2YTtcclxuICAgICAgICB0aGlzLmdiQmFyQ29kZSA9IGliQmFyY29kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X3JvdW5kZWRfcHJvZ3Jlc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm91bmRlZF9wcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9BZGljaW9uYXIgcHJvZHVjdG9zIGVuIG1hc2l2b1xyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hck1hc2l2byhvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvRGF0VXNlcjogYW55LCBvRGF0YVByb2M6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLkdldFJlYWRlcihvRGF0YVByb2MpO1xyXG4gICAgICAgIGxldCBjc3Y6IHN0cmluZztcclxuICAgICAgICBpZiAoIXRoaXMucmVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNzdiA9IG9EYXRhUHJvYy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3N2ID0gdGhpcy5yZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBjc3Yuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIHZhciBwcm9jZXNvOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IGF3YWl0IHRoaXMuYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgb0RhdFVzZXIsIGFyckNTViwgb00zVWJpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNvcnJlIHkgYWRpY2lvbmEgbG9zIHByb2R1Y3RvcyBlbiB1biBhcnJheSBhIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNDb3VjaE1hZXN0cm8gXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBvRGF0VXNlciBcclxuICAgICAqIEBwYXJhbSBhcnJDU1YgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGljaW9uYXJfbWFzaXZvX2Zyb21fYXJyYXkob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb0RhdFVzZXI6IGFueSwgYXJyQ1NWOiBBcnJheTxzdHJpbmc+LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgYXBsRXhjOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSBhcnJDU1YubGVuZ3RoO1xyXG4gICAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIHByb2R1Y3Q6IFR5cGVNM1ByZEdycFxyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICB2YXIgcHJkc0ZhaWxzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBwcmRmYWlsYWN0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogYW55O1xyXG4gICAgICAgIGxldCBhcnJheVJlc3A6IFtNM1Byb2Nlc29zLCBzdHJpbmddID0gW3RoaXMub00zUHJvY2VzbywgXCJcIl07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGxpbmU6IHN0cmluZyA9IGFyckNTVltpXTtcclxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTVjtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5TZXRFc3RydWN0Q1NWKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2JCYXJDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcImZ1ZSBsb2NhbDogXCIgKyBvZXN0cnVjdENTVi5za3UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9Db3VjaFBSRFNTZXJ2aWNlLmdldChvZXN0cnVjdENTVi5za3UpLnRoZW4oYXN5bmMgcHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJvYnR1dm8gbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcmQuTGlzdENvZHMsIG9EYXRVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJhc2lnbm8gbHAgbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmQuTGlzdENvZHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBwcmQuTGlzdENvZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBscCAtIGludGVudG8gc2VydmVyOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0geyBcImlkX3ViaWNhY2lvblwiOiBvRGF0VXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIFwiQ29kaWdvXCI6IG9lc3RydWN0Q1NWLnNrdSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcywgZGF0YSwgb0RhdFVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGNhdGNoIGxwOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyck1zZzogc3RyaW5nID0gZXJyLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJkRmFpbCA9IGVyck1zZy5zdWJzdHJpbmcoZXJyTXNnLmluZGV4T2YoXCJDb2RpZ29cIikgKyA3KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmRzRmFpbHMgKz0gcHJkRmFpbCArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uSURVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIFwiLTFcIiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhwcm9kdWN0KTtcclxuICAgICAgICAgICAgICAgIGlmICghcHJkZmFpbGFjdHVhbCAmJiBwcm9kdWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcmVjaW9TaUFQbGljYShwcm9kdWN0LCBvZXN0cnVjdENTVik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0LCBvZXN0cnVjdENTViwgb00zUmVnU2VydmljZSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBwcm9kdWN0IG5vIHNlIGxsZW5vOiBcIiArIG9lc3RydWN0Q1NWLnNrdSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IGNvdW50ICogMTAwIC8gdG90YWw7XHJcbiAgICAgICAgICAgIHRoaXMucm91bmRlZF9wcm9ncmVzcyA9IE1hdGgucm91bmQodGhpcy5wcm9ncmVzcyAqIDEwMCkgLyAxMDBcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXlSZXNwWzBdID0gdGhpcy5vTTNQcm9jZXNvO1xyXG4gICAgICAgIGFycmF5UmVzcFsxXSA9IHByZHNGYWlscztcclxuICAgICAgICByZXR1cm4gYXJyYXlSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBwcmVjaW8gZGUgcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIGlmIChvZXN0cnVjdENTVi5wcmVjaW8gIT09IE5hTiAmJiBvZXN0cnVjdENTVi5wcmVjaW8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZm9yRWFjaChvTTNQcmVzZW50YWNpb25lcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiA9IG9lc3RydWN0Q1NWLnByZWNpbztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGEgbTNwcm9jZXNvLCBwcm9kdWN0byBlc3BlY2lmaWNvLCBzZSBlbnZpYSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBBZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWLCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UsIG9EYXRVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvZXN0cnVjdENTVi5jYW50aWRhZDtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9lc3RydWN0Q1NWLlBhdGhJbWFnZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IG9NM1JlZ1NlcnZpY2UuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgcHJvZHVjdCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9NM1Byb2Nlc28uTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8vUHJpbWVyYSB2ZXogXHJcbiAgICAgICAgICAgIC8vL05PIFNFIEVTVEEgRU5WSUFORE8gSU5GT1JNQUNJT04gREUgUFJPTU9DSU9ORVNcclxuICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZHVjdCwgb00zUEl0ZW1zV0VCLCBvRGF0VXNlciwgb00zVWJpY2FjaW9uLCBudWxsLCB0aGlzLm9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgZGluYW1pY2FzXHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hclBlcnNvbmFzQVByb2Nlc28ob2VzdHJ1Y3RDU1YpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YSh0aGlzLm9NM1Byb2Nlc28sIHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBvRGF0VXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRpY2lvbmFyRGV0YWxsZShvZXN0cnVjdENTVik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgY2FwdHVyYXMgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEaW5hbWljYShvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYXMgPSBvZXN0cnVjdENTVi5EaW5hbWljYXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW5hbWljYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gZGluYW1pY2FzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IGRpbmFtaWNhc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkaW5hbWljYVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgcGVyc29uYXMgYSBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBlcnNvbmFzID0gb2VzdHJ1Y3RDU1YuUGVyc29uYXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVyc29uYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQZXJYUHJvY2VzbyA9IG5ldyBNM1BlclhQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLlRkb2MgPSBwZXJzb25hc1tpXS5UZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uTmRvYyA9IHBlcnNvbmFzW2ldLk5kb2M7XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UaXBvUGVyc29uYSA9IHBlcnNvbmFzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28ucHVzaChvTTNQZXJYUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBwZXJzb25hc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBhbCB1bHRpbW8gZW5jYWJlemFkbyBhZ3JlZ2Fkby5cclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBkZSBsaW5lYSBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGV0YWxsZXMgPSBvZXN0cnVjdENTVi5NM0RldFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFsbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gZGV0YWxsZXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gZGV0YWxsZXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNFTkNbdGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCAtIDFdLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMub00zUHJvY2Vzby5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9lc3RydWN0Q1NWLilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIGRldGFsbGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIHkgc2V0ZWFyIGxhIGluZm9ybWFjaW9uIGRlIGFyY2hpdm8gQ1NWIHkgc2VwYXJhZG9yLlxyXG4gICAgcHVibGljIEdldFJlYWRlcihvRGF0YVByb2M6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVhZGVyID0gb0RhdGFQcm9jLkNTVjtcclxuICAgICAgICB0aGlzLnNlcGFyYWRvciA9IG9EYXRhUHJvYy5TZXBhcmFkb3I7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9TZXRlYXIgZXN0cnVjdXRhciBkZSBDU1ZcclxuICAgIHB1YmxpYyBTZXRFc3RydWN0Q1NWKGxpbmU6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAgICAgdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZNYXNpdmEgJiYgdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzKSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdER5bmFtaWMob0FyckNTVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdERlZmF1bHQob0FyckNTVik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGNyZWFuZG8gZXN0cnVjdHVyYS4gUmV2aXNhciBsaW5lYXNcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXN0cnVjdHVyYSBkaW5hbWljYSBkZSBjYXJndWUgbWFzaXZhXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBhcnJlZ2xvIGNvbiBpbmZvcm1hY2lvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEVzdHJ1Y3REeW5hbWljKG9BcnJDU1Y6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB2YXIgY29sdW1uYXM6IEFycmF5PGFueT4gPSB0aGlzLkNvbmZNYXNpdmEuQ29sdW1uYXM7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uYXNbaV0uRXN0cnVjdHVyYSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUHJlY2lvXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YucHJlY2lvID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlNLVVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRJTkFNSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpbiA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJWYWxvclwiOiBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLkRpbmFtaWNhcy5wdXNoKGRpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTTNERVRcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNEZXQgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5NM0RldC5wdXNoKG0zRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJUSVBPUEVSU09OQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWxvciA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZG9jOiBzdHJpbmcgPSBcIjVcIjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmRvYzogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsb3Iuc3BsaXQoXCItXCIpLmxlbmd0aCA+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+IHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIHJlc3VsdFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJvd3NbaV0uaWQgJiYgIXJlc3VsdC5yb3dzW2ldLmlkLnN0YXJ0c1dpdGgoXCJDVElWT1NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNQcm9jZXNvOiBNM1Byb2Nlc29zID0gcmVzdWx0LnJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJUaWNrZXRDZXJyYWRvKG0zUHJvY2VzbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbE0zUHJvY2Vzb3MucHVzaChyZXN1bHQucm93c1tpXS5kb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiQW50ZXMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmVcIilcclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShpZGthdGlvcywgdGhpcy5vUG9zdFNlcnZpY2VNMywgbE0zUHJvY2Vzb3MsIG9EYXRhVXNlcikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRGlvIFJlc3B1ZXN0YSBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZVwiKVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImlmIDFcIilcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGVBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AodHJ1ZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImlmIDJcIilcclxuICAgICAgICAgICAgICAgICAgICAvL1Jlc3B1ZXN0YSBjb24gZXJyb3Jlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlQWxsRG9jcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgcXVlIGVsIHRpY2tldCBlc3RhIGNlcnJhZG8uXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclRpY2tldENlcnJhZG8obTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIGJDZXJyYWRvOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBpZiAobTNQcm9jZXNvLk0zRU5DICE9IG51bGwgJiYgbTNQcm9jZXNvLmxNM1BFbmNGUCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChtM1Byb2Nlc28gJiYgbTNQcm9jZXNvLlN1YkVzdGFkb0FudCAhPSBcIkRlY2xpbmFkb1wiICYmIG0zUHJvY2Vzby5NM0VOQy5sZW5ndGggPiAwICYmIG0zUHJvY2Vzby5sTTNQRW5jRlAubGVuZ3RoID09IDAgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FudGlkYWRUb3RhbEJ5TTNQcm9jZXNvKG0zUHJvY2VzbykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBiQ2VycmFkbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBiQ2VycmFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJDZXJyYWRvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbEJ5TTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICYmIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWQgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApO1xyXG4gICAgICAgICAgICBpZiAoZENhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRDYW50aWRhZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB0b2RvcyBsb3MgZG9jdW1lbnRvcyBPZmYgbGluZSBxdWUgc2UgaGFuIGd1YXJkYWRvIGNvbW8gb2ZmbGluZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldEFsbERvY3NPZmZsaW5lKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBsTTNQcm9jZXNvcyA9IG5ldyBBcnJheTxNM1Byb2Nlc29zPigpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJvd3NbaV0uaWQgIT0gXCJDVElWT1NcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocmVzdWx0LnJvd3NbaV0uZG9jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHRvZG9zIGxvcyBkb2N1bWVudG9zIE9mZiBsaW5lIHF1ZSBzZSBoYW4gZ3VhcmRhZG8gY29tbyBvZmZsaW5lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZmxpbmVEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzRGVsZXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVDdGl2b3ModWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGUodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxDdGl2b3ModWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxvcyBjb25zZWN1dGl2b3MgcXVlIGVzdGFuIGxvY2FsbWVudGUgdnMgbG9zIHF1ZSBlc3RhbiBlbiBlbCBzZXJ2aWRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYWNpb25DdGl2b3NWU1NlcnZlcihpa2F0aW9zOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBpZEh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmdldEFsbEN0aXZvcyh1YmljYWNpb24sIGlkSHViKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgICAgIG9TZXJ2aWNlTTNNYWVzdHJvLlZhbGlkYXJDdGl2b3NWU0xvY2FsKHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGlrYXRpb3MsIEpTT04uc3RyaW5naWZ5KHgpLCB1YmljYWNpb24sIGlkSHViLCBmdW5jaW9uUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjb25zZWN1dGl2byBlbiBlbCBxdWUgdmEsIGVsIHByb2Nlc28gb2ZmbGluZSBxdWUgcmVjaWJlIGNvbW8gcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gdWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqIEBwYXJhbSBzSWRQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q3Rpdm9PZmZMaW5lKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGN0aXZvOiBzdHJpbmcgPSBcIjBcIjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGEgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RhdGFGaW5kZWQ6IGFueSA9IG9EYXRhLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gc0lkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQuQ3Rpdm8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjdGl2byA9IG9EYXRhRmluZGVkLkN0aXZvLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgcmV0dXJuIGN0aXZvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBpZCBtMyBcclxuICAgICAqIEBwYXJhbSBzSWRNMyBcclxuICAgICAqIEBwYXJhbSBzSWRQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUlkTTMoc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGE6IEFycmF5PGFueT4gPSBkYXRhLkN0aXZvcztcclxuICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YS5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gc0lkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YUZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGN0aXZvQW50ID0gK29EYXRhRmluZGVkLkN0aXZvLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIHZhciBjdGl2b0FjdCA9ICtzSWRNMy5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3Rpdm9BY3QgPiBjdGl2b0FudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EYXRhRmluZGVkLkN0aXZvID0gc0lkTTM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YS5wdXNoKHsgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbywgXCJDdGl2b1wiOiBzSWRNMyB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICBpZiAoc0lkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIsIHNJZE0zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgb0RhdGEucHVzaCh7IFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28sIFwiQ3Rpdm9cIjogc0lkTTMgfSlcclxuICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIGlmIChzSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJUSUNLRVRWRU5UQVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIiwgc0lkTTMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGN0aXZvcywgSWRtMy5cclxuICAgICAqIEBwYXJhbSBvRGF0YSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBTYXZlQ3Rpdm9zKG9EYXRhOiBBcnJheTxhbnk+LCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIGludGVudG8gPSAwKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZCA9IHsgXCJDdGl2b3NcIjogb0RhdGEgfVxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSwgb0RhdGFTZW5kKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk9LXCIpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwiQ3Rpdm9zXCI6IG9EYXRhU2VuZCwgXCJmdW5jdGlvblwiOiBcIlNhdmVDdGl2b3NcIiB9KSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgaWYgKGludGVudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1YiwgMSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVPbGREb2NzKG1heERpYXM6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5EZWxldGVPbGREb2NzKG1heERpYXMpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBJZCBtMywgY3VhbmRvIGVzdGEgZnVlcmEgZGUgbGluZWFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhc3luYyBHZXRJZE0zT2ZmbGluZShpZGthdGlvczogc3RyaW5nLCBpZHByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhSWRNMztcclxuICAgICAgICB2YXIgaWRNMztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvRGF0YUlkTTMgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKTtcclxuICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YUlkTTMuQ3Rpdm9zLmZpbmQoeCA9PiB4LklkUHJvY2VzbyA9PSBpZHByb2Nlc28pO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgIGlkTTMgPSBvRGF0YUZpbmRlZC5DdGl2bztcclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLlN1bWFyQ3Rpdm8oaWRNMyk7XHJcbiAgICAgICAgICAgICAgICBpZE0zID0gdGhpcy52YWxpZGFyQXVtZW50b0N0aXZvKGlkTTMsIGlkcHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZE0zID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCJcIiArIGRhdGUuZ2V0TW9udGgoKSArIFwiXCIgKyBkYXRlLmdldERheSgpICsgXCJcIiArIGRhdGUuZ2V0SG91cnMoKSArIFwiXCIgKyBkYXRlLmdldE1pbnV0ZXMoKSArIFwiXCIgKyBkYXRlLmdldFNlY29uZHMoKSArIFwiXCIgKyBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLkdldEN0aXZvKGlka2F0aW9zLCBpZHByb2Nlc28sIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAvLyB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIC8vIGlkTTMgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZGF0ZS5nZXRNb250aCgpICsgXCJcIiArIGRhdGUuZ2V0RGF5KCkgKyBcIlwiICsgZGF0ZS5nZXRIb3VycygpICsgXCJcIiArIGRhdGUuZ2V0TWludXRlcygpICsgXCJcIiArIGRhdGUuZ2V0U2Vjb25kcygpICsgXCJcIiArIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgICAgICAgIGlkTTMgPSB0aGlzLkdldEN0aXZvKGlka2F0aW9zLCBpZHByb2Nlc28sIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlkTTM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHZhbGlkYXJBdW1lbnRvQ3Rpdm8oaWRNMywgaWRwcm9jZXNvKSB7XHJcbiAgICAgICAgaWYgKGlkcHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICBsZXQgdWx0aW1vSWRNMyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiQ3Rpdm9UaWNrZXRWZW50YVwiKTtcclxuICAgICAgICAgICAgaWYgKHVsdGltb0lkTTMgPT0gaWRNMykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLlN1bWFyQ3Rpdm8oaWRNMyk7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImVycm9yTG9nQ3Rpdm9zXCIgKyBzRmVjaGFOb3csIEpTT04uc3RyaW5naWZ5KHsgXCJpZE0zXCI6IGlkTTMsIFwiZnVuY3Rpb25cIjogXCJ2YWxpZGFyQXVtZW50b0N0aXZvXCIgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZE0zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgR2V0Q3Rpdm8oaWRrYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHNDdGl2bztcclxuICAgICAgICBzQ3Rpdm8gPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5HZXRDdGl2b0JZUHJvY2Vzbyh0aGlzLm9Qb3N0U2VydmljZU0zLCBpZGthdGlvcywgaWRwcm9jZXNvLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgcmV0dXJuIHNDdGl2bztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGxsYXZlIGRlIHBvdWNoREJcclxuICAgICAqIEBwYXJhbSB1YmljIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldEtleSh1YmljLCBodWIpIHtcclxuICAgICAgICByZXR1cm4gXCJDVElWT1NfXCIgKyB1YmljICsgaHViO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zTm90aWZTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9Qb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zKSB7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnRlbmVyIGxhIGluZm9ybWFjaW9uIGRlIGxhcyBub3RpZGljYWNpb25lcyBwb3IgaHViXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIE0zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3Qoc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTm90aWZDb250cm9sbGVyL00zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3QvXCIgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG4gICAgY2F0Y2h7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIG5vdGlkaWNhY2lvbmVzIHBvciBodWJcclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdFdpdGhUaW1lT3V0KHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSwgdGltZU91dDogbnVtYmVyKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMub1Bvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM05vdGlmQ29udHJvbGxlci9NM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0L1wiICsgc0lES2F0aW9zLCBvRGF0YVNlbmQsIHRpbWVPdXQpLnRvUHJvbWlzZSgpO1xyXG4gICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIG5vdGlkaWNhY2lvbmVzIHBvciBodWIgZGUgdW4gaWRSZXAgZGFkb1xyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICogQHBhcmFtIGRhdGEgXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIG0zX2dldF9ub3RpZmljYWNpb25feF9odWJfb2JqZWN0KHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgIC8vdmFyIGRhdGEgPSB7XCJpZF9yZXBcIjpcIlwiLCBcImlkX3ViaWNhY2lvblwiOlwiXCIsIFwiaWRfaHViXCI6XCJcIn1cclxuICAgIHRyeSB7XHJcbiAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5vUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvbTNfZ2V0X25vdGlmaWNhY2lvbl94X2h1Yl9vYmplY3QvXCIgKyBzSURLYXRpb3MsIGRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzcCkpO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIGNhdGNoe1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGd1YXJkYXJDYW1iaW9zQ29uZmlndXJhY2lvbkltcHJlc2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM05vdGlmQ29udHJvbGxlci9ndWFyZGFyQ2FtYmlvc0NvbmZpZ3VyYWNpb25JbXByZXNpb24vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICBvRnVuY2lvbkVycihlcnJvcltcIl9ib2R5XCJdKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNb2RlbE0zTm90aWZ7XHJcbiAgICBwdWJsaWMgSWRSZXA6c3RyaW5nO1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBJZEh1YjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ29ycmVyOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGF0YTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQ29uZkltcDpzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQcmVzZW50YWNpb25lc3tcclxuICAgIHB1YmxpYyBOSVZFTFBSUzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVkFMT1I6bnVtYmVyO1xyXG4gICAgcHVibGljIFRPUEU6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyByZXNlcnZlU2xvdHMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnNcIjtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ29uc3VsdGFzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgaW52ZW50YXJpbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxvcyBwYWNrIGFzb2NpYWRvcyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAgICogQHBhcmFtIGRhdGEgSnNvbiBjb24gaW5mb3JtYWNpb24gZGUgU0tQMSAoTW9kZWxvKSB5IFViaWNhY2lvbiBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNfR0VUSU5WRU5UQVJJT0JZUEFDSyhzSURLYXRpb3M6IHN0cmluZywgZGF0YTogYW55KSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLlBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zQ29uc3VsdGFzL00zX0dFVElOVkVOVEFSSU9CWVBBQ0svXCIgKyBzSURLYXRpb3MsIGRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJJbnZlbnRhcmlvTmVnYXRpdm9Qcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL3ZhbGlkYXJJbnZlbnRhcmlvTmVnYXRpdm9Qcm9kdWN0by9cIiArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnJvci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIEJ1c2NhckNvbmNlcHRvRW5NM1NJVShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pe1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zQ29uc3VsdGFzL00zX0dFVENvbmNlcHRvRnJvbVNJVS9cIiArIGlkS2F0aW9zICsgXCIvXCIgKyBkYXRhLnNVYmljYWNpb24gKyBcIi9cIiArIGRhdGEuc0NvbmNlcHRvLCB7fSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVycm9yLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBURUNMQVNSQVBJREFTe1xyXG4gICAgcHVibGljIENvbXBvbmVudGU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRlY2xhOnN0cmluZztcclxuICAgIHB1YmxpYyBGdW5jaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBJZEVsZW1lbnRvOnN0cmluZztcclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFBSRFNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBhcGxQYXF1ZXRlcyA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5HZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZsYWdTeW5jQ291Y2goKSB7XHJcbiAgICAgICAgdmFyIHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgdmFyIG9TVWJpY2FjaW9uO1xyXG4gICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBsZXQgY29uZmlnO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLk0zSFVCUyAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0gJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2Uob1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuU3luY0NvdWNoQXV0byAhPSBudWxsICYmIGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSBjb25maWcuU3luY0NvdWNoQXV0bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIGlmICh0aGlzLmlka2F0aW9zKSB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJQUkRcIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhclBhcXVldGVzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFwbFBhcXVldGVzKSB7XHJcbiAgICAgICAgICAgIGxldCB1YmljYWNpb24gPSB0aGlzLmdldFViaWNhY2lvbigpO1xyXG4gICAgICAgICAgICBpZiAodWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc2FcIiArIHViaWNhY2lvbiArIFwiX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzeW5jQ291Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlka2F0aW9zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXJQYXF1ZXRlcygpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFViaWNhY2lvbigpIHtcclxuICAgICAgICBsZXQgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICBsZXQgb1NVYmljYWNpb247XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uSURVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU1ViaWNhY2lvbi5JRFViaWNhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgS2F0aW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuaWRrYXRpb3MudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgaWYgKEthdGlvcyAhPT0gdW5kZWZpbmVkICYmIEthdGlvcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHZhciBqS2F0aW9zTTMgPSBKU09OLnBhcnNlKEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmIChqS2F0aW9zTTMgJiYgakthdGlvc00zLkthdGlvcyAmJiBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXBsID0gakthdGlvc00zLkthdGlvcy5LYXRpb3NNMy5maW5kKHggPT4geC5MbGF2ZS50b1VwcGVyQ2FzZSgpID09IFwiQVBMUEFRU1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcGwgJiYgYXBsLlZhbG9yID09IFwiMVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGxQYXF1ZXRlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koaWRrYXRpb3MpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEluZm8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuaW5mbygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlUHJkKGlkKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoQ29kc1BSRFNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGlka2F0aW9zO1xyXG4gICAgcHJpdmF0ZSBhcGxTeW5jQ291Y2hBdXRvID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJjb2RzcHJkX1wiICsgdGhpcy5pZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcImFkYXB0ZXJcIilcclxuICAgICAgICBjb25zb2xlLmRlYnVnKHRoaXMuZGF0YWJhc2UuYWRhcHRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJjb2RzcHJkX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN5bmNDb3VjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaWRrYXRpb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJjb2RzcHJkX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIENPRFMgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBDT0RTIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3VjaFByb21vY2lvbmVzU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVtOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJwcm9tb2Npb25lc19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgICAgIC8vdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKHNJZGthdGlvcykpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoc0lka2F0aW9zKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMyArIFwicHJvbW9jaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luY1dpdGhEQihyZW1vdGVEYXRhYmFzZTogUG91Y2hEQikge1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc3luY0F3YWl0KHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgICAgIHRoaXMuc3luY1dpdGhEQihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhYmFzZS5jb21wYWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIGNoYW5nZXMocmVtb3RlOiBzdHJpbmcpe1xyXG4gICAgLy8gICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcbiAgICAvLyAgICAgcmVtb3RlRGF0YWJhc2UuY2hhbmdlcyh7XHJcbiAgICAvLyAgICAgICAgIHNpbmNlOiAnbm93JyxcclxuICAgIC8vICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgaW5jbHVkZV9kb2NzOiB0cnVlXHJcbiAgICAvLyAgICAgICB9KS5vbignY2hhbmdlJywgZnVuY3Rpb24gKGNoYW5nZSkge1xyXG4gICAgLy8gICAgICAgICAvLyBjaGFuZ2UuaWQgY29udGFpbnMgdGhlIGRvYyBpZCwgY2hhbmdlLmRvYyBjb250YWlucyB0aGUgZG9jXHJcbiAgICAvLyAgICAgICAgIGlmIChjaGFuZ2UuZGVsZXRlZCkge1xyXG4gICAgLy8gICAgICAgICAgIC8vIGRvY3VtZW50IHdhcyBkZWxldGVkXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgLy8gZG9jdW1lbnQgd2FzIGFkZGVkL21vZGlmaWVkXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgIC8vICAgICAgICAgLy8gaGFuZGxlIGVycm9yc1xyXG4gICAgLy8gICAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZShpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4oZG9jID0+e1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUoZG9jKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVsZW1lbnRSZW1vdmVkKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2hhbmdlcyh7IGxpdmU6IHRydWUsIHNpbmNlOiAnbm93JywgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXHJcbiAgICAgICAgLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlLmRlbGV0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRSZW0uZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vcmVuZGVyRG9jc1NvbWVob3coKTtcclxuICAgICAgICB9KS5vbignZXJyb3InLCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UmVtb3ZlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlbTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbiAgfSlcclxuZXhwb3J0IGNsYXNzIENvdWNoVWJpY2FjaW9uZXNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgc0lka2F0aW9zPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcInViaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdmFyIHNJZGthdGlvczpzdHJpbmc7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwidWJpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTpzdHJpbmd7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCl7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDaGFuZ2VJdGVtKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuY2hhbmdlcyh7IGxpdmU6IHRydWUsIHNpbmNlOiAnbm93JywgaW5jbHVkZV9kb2NzOiB0cnVlIH0pXHJcbiAgICAgICAgLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICAvL2lmIChjaGFuZ2UuZGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIC8vcmVuZGVyRG9jc1NvbWVob3coKTtcclxuICAgICAgICB9KS5vbignZXJyb3InLCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHtpbmNsdWRlX2RvY3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHtpbmNsdWRlX2RvY3M6IGZhbHNlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgTTNQcm9jZXNvcyB9IGZyb20gJy4uL1JlZ2lzdHJvL20zLXByb2Nlc29zJztcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcbmltcG9ydCAncnhqcy9hZGQvb3BlcmF0b3IvbWFwJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNOb3RpZmljYWNpb25lc0FQUCB7XHJcbiAgICBwdWJsaWMgb0RhdGFNM1Byb2Nlc29zOiBNM1Byb2Nlc29zO1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG4gICAgICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIm5vdGlmaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcIm5vdGlmaWNhY2lvbmVzX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIGJhc2UgZGUgZGF0b3MuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0J5VGlwbyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXBhY2stYnktdGlwb1wiO1xyXG5pbXBvcnQgeyBNM1BhY2tCeVJlZ2xhcyB9IGZyb20gXCIuLi9NYWVzdHJvL20zLXBhY2stYnktcmVnbGFzXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VNM1BhY2tCeWlwbyB7XHJcblxyXG5cclxuICAgIHByaXZhdGUgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthIDwgK2IgfSxcclxuICAgICAgICAnPic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSA+ICtiIH0sXHJcbiAgICAgICAgJzw9JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthIDw9ICtiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthID49ICtiIH0sXHJcbiAgICAgICAgJ0lHVUFMJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT0gYiB9LFxyXG4gICAgICAgICdESUZGJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgIT0gYiB9LFxyXG4gICAgICAgICdFTic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09PSBiIH0sXHJcbiAgICAgICAgJ0FORCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICYmIGIgfSxcclxuICAgICAgICAnT1InOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSB8fCBiIH0sXHJcbiAgICAgICAgJyonOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gdHJ1ZSB9LFxyXG4gICAgICAgICdNT0QnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgJSArYiA9PSAwIH0sXHJcbiAgICAgICAgLy8gLi4uXHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgc2kgZWwgcHJvZHVjdG8gcXVlIHNlcsODwqEgaGlqbywgY3VtcGxlIGNvbiBsYXMgY2FyYWN0ZXJpc3RpY2FzXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jUEtHIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclNpRXNUaXBvKG0zUHJvY1BLRzogVHlwZU0zUHJkR3JwLCBwcm9kdWN0bzogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG0zUHJvY1BLRy5NM1BBQ0tCWVRJUE8uZmluZCh4ID0+IHguREVTVElOTyA9PSBwcm9kdWN0by5USVBPKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcGxpY2FjaW9uIGRlIHJlZ2xhcyBkZSBwYXF1ZXRlcywgdGVuaWVuZG8gZW4gY3VlbnRhIGFsIGluZm9ybWFjacODwrNuIGRlbCBwcm9kdWN0byBpbmdyZXNhZG8uXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jUEtHIFxyXG4gICAgICogQHBhcmFtIHByb2R1Y3RvIFxyXG4gICAgICogQHBhcmFtIG9NM1BJdGVtc1dFQiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdlbmVyYVZhbGlkYWNpb25lcyhtM1Byb2NQS0c6IFR5cGVNM1ByZEdycCwgcHJvZHVjdG86IFR5cGVNM1ByZEdycCwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBiUmVzcDpib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIG9NM1BBQ0tCWVRJUE86IE0zUHJkUGFja0J5VGlwbyA9IG0zUHJvY1BLRy5NM1BBQ0tCWVRJUE8uZmluZCh4ID0+IHguREVTVElOTyA9PSBwcm9kdWN0by5USVBPKTtcclxuICAgICAgICAgICAgaWYgKG9NM1BBQ0tCWVRJUE8pIHtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBvTTNQQUNLQllUSVBPLk0zUEFDS1JFR0xBUy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBvTTNQYWNrQnlSZWdsYXM6IE0zUGFja0J5UmVnbGFzID0gb00zUEFDS0JZVElQTy5NM1BBQ0tSRUdMQVNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBlc3RhIHZhbGlkYW5kbyBlbCBwYXBhIGRlbCBwYXF1ZXRlLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3BlcmF0b3JzW29NM1BhY2tCeVJlZ2xhcy5PcGVyYWNpb25dKHRoaXMuR2V0UGFyYW1ldHJvcyhvTTNQYWNrQnlSZWdsYXMuUGFyYW0xLCBtM1Byb2NQS0cpICwgdGhpcy5HZXRQYXJhbWV0cm9zKG9NM1BhY2tCeVJlZ2xhcy5QYXJhbTIsIG0zUHJvY1BLRykpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFjaW9uQWNjaW9uKG9NM1BhY2tCeVJlZ2xhcy5BY2Npb24sIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpw4PCs24gZGUgYWNjaW9uIGRlIHJlZ2xhcyBkZSBwYXF1ZXRlLlxyXG4gICAgICogQHBhcmFtIHNBY2Npb24gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgVmFsaWRhY2lvbkFjY2lvbihzQWNjaW9uOnN0cmluZywgb00zUEl0ZW1zV0VCOk0zUEl0ZW1zV0VCKXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGlmKHNBY2Npb24gIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9BY2Npb246YW55ID0gSlNPTi5wYXJzZShzQWNjaW9uKTtcclxuICAgICAgICAgICAgICAgIGlmKG9BY2Npb24uQWNjaW9uKXtcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob0FjY2lvbi5BY2Npb24pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ2FudGlkYWRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWNhdGNoKGV4KXtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2nDg8KzbiBkZSBwYXJhbWV0cm9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHJlZ2xhcy5cclxuICAgICAqIEBwYXJhbSBwYXJhbWV0cm8gXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdG8gXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgR2V0UGFyYW1ldHJvcyhwYXJhbWV0cm86IHN0cmluZywgcHJvZHVjdG86IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIHZhciBzUGFyYW06IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlZ2xhOiBzdHJpbmcgPSBwYXJhbWV0cm8uc3BsaXQoXCJfXCIpWzBdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHJlZ2xhLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJBRElcIjpcclxuICAgICAgICAgICAgICAgICAgICBzUGFyYW0gPSBwcm9kdWN0by5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZCh4ID0+IHguQVRSSUJVVE8gPT0gcGFyYW1ldHJvLnNwbGl0KFwiX1wiKVsxXSkuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiQ09OU1RcIjpcclxuICAgICAgICAgICAgICAgICAgICBzUGFyYW0gPSBwYXJhbWV0cm8uc3BsaXQoXCJfXCIpWzFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZihyZWdsYS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJTS1BcIikgKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc1BhcmFtID0gcHJvZHVjdG8uTG9NM1ByZEdlbmVyYWxbMF1bcmVnbGFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc1BhcmFtO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG59IiwiaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbmV4cG9ydCBjbGFzcyBGaWx0cm9zRGlhcmlvT2ZmTGluZSB7XHJcbiAgICBwdWJsaWMgRmlsdHJhckJ5RmVjaGFzT2ZmKERhdGEsIEFkZFRvRG9jOiBGdW5jdGlvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciByb3dzOiBBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICAvL3ZhciBuZXdSb3dzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgdmFyIGZlY2hhSSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJGZWNoYUl0Q09GRlwiKTtcclxuICAgICAgICAgICAgdmFyIGZlY2hhRiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJGZWNoYUZ0Q09GRlwiKTtcclxuICAgICAgICAgICAgcm93cyA9IERhdGEucm93cztcclxuXHJcbiAgICAgICAgICAgIGlmIChmZWNoYUYgJiYgZmVjaGFJKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaUZJbmljaW8gPSB0aGlzLkdldEZlY2hhTnVtYmVyKGZlY2hhSSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaUZGaW5hbCA9IHRoaXMuR2V0RmVjaGFOdW1iZXIoZmVjaGFGKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGlGSW5pY2lvKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coaUZGaW5hbClcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtM3A6IGFueSA9IHJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtM3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZlY2hhUHJvYyA9IHRoaXMuR2V0RmVjaGFOdW1iZXIobTNwLkZlY2hhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmZWNoYVByb2MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrZmVjaGFQcm9jID49ICtpRkluaWNpbyAmJiArZmVjaGFQcm9jIDw9ICtpRkZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25ld1Jvd3MucHVzaChyb3dzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFRvRG9jKG0zcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGaWx0cmFyQnlGZWNoYXNPZmZcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBGaWx0cmFyQnlUZXh0byhEYXRhLCBzVGV4dG86IHN0cmluZywgQWRkVG9Eb2M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJvd3M6IEFycmF5PGFueT47XHJcblxyXG4gICAgICAgICAgICByb3dzID0gRGF0YS5yb3dzO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBtM3A6IGFueSA9IHJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgaWYgKG0zcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtM3AuSWRNMy5pbmNsdWRlcyhzVGV4dG8pIHx8IChtM3AubmRvY1VBY3Rpdm8gJiYgbTNwLm5kb2NVQWN0aXZvLmluY2x1ZGVzKHNUZXh0bykpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV3Um93cy5wdXNoKHJvd3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0RvYyhtM3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpbHRyYXJCeUZlY2hhc09mZlwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBHZXRGZWNoYU51bWJlcihzZGF0ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy92YXIgZGF0ZSA9IG5ldyBEYXRlKHNkYXRlKTtcclxuICAgICAgICB2YXIgZCA9IG1vbWVudChzZGF0ZSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xyXG5cclxuICAgICAgICByZXR1cm4gZDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbi8vIEBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvdWNoUGVyeGlwbyB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJwZXJ4dGlwb19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicGVyeHRpcG9fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV0cnk6IGZhbHNlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG4vLyBASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb3VjaERpbmFtQnlQcm9jZXNvcyB7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuICAgICAgICBcclxuICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwiZGluYW14cHJvY19cIiArIHNJZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiZGluYW14cHJvY19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgIFxyXG59XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXRyeTogZmFsc2VcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7aW5jbHVkZV9kb2NzOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBEZXN0cm95KCkge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxufSJdLCJuYW1lcyI6WyJtb21lbnQiLCJ0c2xpYl8xLl9fdmFsdWVzIiwiXy5jbG9uZURlZXAiLCJQb3N0U2VydmljZU0zIiwidHNsaWJfMS5fX2RlY29yYXRlIiwidHNsaWJfMS5fX3BhcmFtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0lBc0JJLHVCQUNZLE1BQ0E7UUFEQSxTQUFJLEdBQUosSUFBSTtRQUNKLGVBQVUsR0FBVixVQUFVO1FBRWxCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztLQUN2Qjs7OztJQUVNLG9DQUFZOzs7OztRQUVmLElBQUksSUFBSSxDQUFNOztRQUNkLElBQUksV0FBVyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxXQUFXLEVBQUU7O1lBQ2IsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxQyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDOUIsSUFBSSxHQUFHLFdBQVcsQ0FBQzthQUN0QjtTQUNKO2FBQ0k7WUFDRCxJQUFJLEdBQUcsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7OztJQUl6QixrREFBMEI7Ozs7O1FBQzdCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBQzdELElBQUksY0FBYyxDQUFDO1FBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO1lBQ3hELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQzthQUNqRDtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7OztJQUdWLHFDQUFhOzs7O0lBQW5CLFVBQW9CLFFBQWdCOzs7Ozs7O3dCQUVqQixxQkFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBL0YsSUFBSSxHQUFHLFNBQXdGO3dCQUMvRixTQUFTLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzt3QkFDakQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7O3dCQUdyQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUcsQ0FBQyxDQUFDOzs7Ozs7S0FFeEI7Ozs7O0lBRUQsNENBQW9COzs7O0lBQXBCLFVBQXFCLElBQUk7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztLQUMvQjs7OztJQUVELG9DQUFZOzs7SUFBWjtRQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztLQUN4Qjs7OztJQUVELHdDQUFnQjs7O0lBQWhCO1FBQ0ksT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7S0FDbEM7Ozs7Ozs7SUFHRCwrQkFBTzs7Ozs7SUFBUCxVQUFRLE1BQWMsRUFBRSxTQUFpQjtRQUNyQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO1lBQzVDLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztLQUNOOzs7Ozs7OztJQUlELDBDQUFrQjs7Ozs7O0lBQWxCLFVBQW1CLE1BQWMsRUFBRSxTQUFpQixFQUFFLFdBQW1CO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDekMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUN2QixDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDTCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyQixDQUFDLENBQUM7S0FDTjs7Ozs7OztJQUVELHVDQUFlOzs7Ozs7SUFBZixVQUFnQixNQUFjLEVBQUUsU0FBaUIsRUFBRSxVQUFlOztRQUM5RCxJQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7O1FBS25ELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFDekM7WUFDSSxNQUFNLEVBQUUsVUFBVTtTQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUNOLE9BQU8sR0FBRyxDQUFDO1NBQ2QsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7O0lBRUQsOENBQXNCOzs7Ozs7O0lBQXRCLFVBQXVCLE1BQWMsRUFBRSxTQUFpQixFQUFFLFVBQWUsRUFBRSxXQUFtQjs7UUFDMUYsSUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUU5QixPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOztRQUtuRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQ3pDO1lBQ0ksTUFBTSxFQUFFLFVBQVU7U0FDckIsQ0FBQzthQUNELElBQUksQ0FDRCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQ3ZCO2FBQ0EsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUNKLE9BQU8sR0FBRyxDQUFDO1NBQ2QsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7SUFFRCxxQ0FBYTs7Ozs7O0lBQWIsVUFBYyxNQUFjLEVBQUUsU0FBaUIsRUFBRSxVQUFlOztRQUM1RCxJQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOzs7O1FBUTlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFDekM7WUFDSSxZQUFZLEVBQUUsTUFBTTtZQUNwQixNQUFNLEVBQUUsVUFBVTtTQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUNOLE9BQU8sR0FBRyxDQUFDO1NBQ2QsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7SUFFRCw0Q0FBb0I7Ozs7OztJQUFwQixVQUFxQixNQUFjLEVBQUUsU0FBaUIsRUFBRSxVQUFlOztRQUNuRSxJQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDOzs7O1FBUTlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFDekM7WUFDSSxZQUFZLEVBQUUsYUFBYTtZQUMzQixNQUFNLEVBQUUsVUFBVTtTQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUNOLE9BQU8sR0FBRyxDQUFDO1NBQ2QsQ0FBQyxDQUFDO0tBQ1Y7Ozs7O0lBSUQsbUNBQVc7Ozs7SUFBWCxVQUFZLE1BQWM7UUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUN0RDs7Ozs7OztJQUVNLDRDQUFvQjs7Ozs7O2NBQUMsTUFBYyxFQUFFLE1BQVcsRUFBRSxXQUFtQjtRQUN4RSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7Ozs7Ozs7SUFHckYsMkNBQW1COzs7OztJQUFuQixVQUFvQixNQUFjLEVBQUUsTUFBVztRQUMzQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUN0RTs7Ozs7O0lBRU0scUNBQWE7Ozs7O2NBQUMsTUFBYyxFQUFFLE1BQVc7UUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7Ozs7O0lBR2pFLDJDQUFtQjs7Ozs7SUFBbkIsVUFBb0IsTUFBYyxFQUFFLE1BQVc7UUFDM0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDdEU7Ozs7OztJQUVELDRDQUFvQjs7Ozs7SUFBcEIsVUFBcUIsTUFBYyxFQUFFLE1BQVc7UUFDNUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDdkU7Ozs7OztJQUVELDRDQUFvQjs7Ozs7SUFBcEIsVUFBcUIsTUFBYyxFQUFFLE1BQVc7O1FBQzVDLElBQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7O1FBRzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLDBCQUEwQixDQUFDLENBQUM7O1FBSTNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sRUFDdkQ7WUFDSSxNQUFNLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUNOLE9BQU8sR0FBRyxDQUFDO1NBQ2QsQ0FBQyxDQUFDO0tBRVY7Ozs7OztJQUVELDJDQUFtQjs7Ozs7SUFBbkIsVUFBb0IsTUFBYyxFQUFFLE1BQVc7UUFDM0MsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDdEU7Ozs7OztJQUVELGtEQUEwQjs7Ozs7SUFBMUIsVUFBMkIsTUFBYyxFQUFFLE1BQVc7UUFDbEQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUM3RTs7Ozs7SUFFRCxnQ0FBUTs7OztJQUFSLFVBQVMsTUFBYztRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUM5Qzs7Ozs7SUFFRCxtQ0FBVzs7OztJQUFYLFVBQVksTUFBYztRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3REOzs7OztJQUVELG9DQUFZOzs7O0lBQVosVUFBYSxNQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDdkQ7Ozs7O0lBRUQsNkJBQUs7Ozs7SUFBTCxVQUFNLE1BQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDaEQ7Ozs7OztJQUVELHdDQUFnQjs7Ozs7SUFBaEIsVUFBaUIsTUFBYyxFQUFFLE9BQWU7UUFDNUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDcEU7Ozs7O0lBS0QscUNBQWE7Ozs7SUFBYixVQUFjLE1BQWM7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUN4RDs7Ozs7SUFHRCxtQ0FBVzs7OztJQUFYLFVBQVksTUFBYztRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3REOzs7Ozs7SUFHRCwyQ0FBbUI7Ozs7SUFBbkIsVUFBb0IsTUFBYztRQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRztZQUNoRCxPQUFPLEdBQUcsQ0FBQztTQUNkLENBQUMsQ0FBQztLQUNOOzs7Ozs7SUFHRCx1Q0FBZTs7Ozs7SUFBZixVQUFnQixNQUFjLEVBQUUsTUFBTTtRQUNsQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FDckQsVUFBQSxHQUFHO1lBQ0MsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDO1NBQ3pCLENBQ0osQ0FBQztLQUNMOzs7Ozs7O0lBRUQsK0NBQXVCOzs7OztJQUF2QixVQUF3QixNQUFjLEVBQUUsTUFBTTtRQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDekQsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO0tBQ047Ozs7Ozs7SUFFRCwwREFBa0M7Ozs7OztJQUFsQyxVQUFtQyxNQUFjLEVBQUUsTUFBTSxFQUFFLFNBQVM7UUFDaEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDckQsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO0tBQ047Ozs7OztJQUNELHdEQUFnQzs7Ozs7SUFBaEMsVUFBaUMsTUFBYyxFQUFFLE1BQU07UUFDbkQsT0FBTyxJQUFJLENBQUMsa0NBQWtDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUN6Rjs7Ozs7Ozs7OztJQUtELHlEQUFpQzs7Ozs7OztJQUFqQyxVQUFrQyxNQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTOztRQUN4RSxJQUFJLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRXZELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUMxRCxVQUFBLEdBQUc7WUFDQyxPQUFPLEdBQUcsQ0FBQztTQUNkLENBQ0osQ0FBQztLQUNMOzs7Ozs7O0lBRUQsOENBQXNCOzs7Ozs7SUFBdEIsVUFBdUIsTUFBYyxFQUFFLE1BQU0sRUFBRSxPQUFPO1FBQ2xELE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN6Rjs7Ozs7OztJQUVELGdEQUF3Qjs7Ozs7O0lBQXhCLFVBQXlCLE1BQWMsRUFBRSxNQUFNLEVBQUUsT0FBTztRQUNwRCxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDM0Y7Ozs7Ozs7SUFFRCxrREFBMEI7Ozs7OztJQUExQixVQUEyQixNQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU87UUFDdEQsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7S0FDbkc7Ozs7Ozs7OztJQUtELHlEQUFpQzs7Ozs7O0lBQWpDLFVBQWtDLE1BQWMsRUFBRSxNQUFNLEVBQUUsU0FBUztRQUMvRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUNqRCxVQUFBLEdBQUc7WUFFQyxPQUFPLEdBQUcsQ0FBQztTQUNkLENBQ0osQ0FBQztLQUNMOzs7Ozs7SUFFRCw4Q0FBc0I7Ozs7O0lBQXRCLFVBQXVCLE1BQWMsRUFBRSxNQUFNO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2hGOzs7Ozs7SUFJRCxzREFBOEI7Ozs7O0lBQTlCLFVBQStCLE1BQWMsRUFBRSxNQUFNO1FBQ2pELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDeEU7Ozs7OztJQUVELGdEQUF3Qjs7Ozs7SUFBeEIsVUFBeUIsTUFBYyxFQUFFLE1BQU07UUFDM0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDbEU7Ozs7OztJQUVELGtEQUEwQjs7Ozs7SUFBMUIsVUFBMkIsTUFBYyxFQUFFLE1BQU07UUFDN0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDcEU7Ozs7OztJQUVELHVEQUErQjs7Ozs7SUFBL0IsVUFBZ0MsTUFBYyxFQUFFLE1BQU07UUFDbEQsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUN6Rjs7Ozs7O0lBRUQsdURBQStCOzs7OztJQUEvQixVQUFnQyxNQUFjLEVBQUUsTUFBTTtRQUNsRCxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3hGOzs7Ozs7OztJQUVELHlDQUFpQjs7Ozs7O0lBQWpCLFVBQWtCLE1BQWMsRUFBRSxNQUFNLEVBQUUsU0FBUzs7UUFDL0MsSUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOztRQUNuRCxJQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRXpELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUMxRCxVQUFBLEdBQUc7WUFFQyxPQUFPLEdBQUcsQ0FBQztTQUNkLENBQ0osQ0FBQztLQUNMOztnQkE5V0osVUFBVSxTQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7OztnQkFWUSxJQUFJO2dCQUNKLFVBQVU7Ozt3QkFEbkI7Ozs7Ozs7QUNBQSxJQUFBOzs7Ozs7O0lBRUksc0NBQWdCOzs7O0lBQWhCLFVBQWlCLFFBQVE7O1FBRXJCLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUM7O1FBQ2xELElBQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQzs7UUFDckIsSUFBSSxTQUFTLENBQUM7UUFDZCxXQUFXLENBQUMsR0FBRyxFQUFFLFVBQUMsR0FBRyxFQUFFLE1BQU07WUFDekIsU0FBUyxHQUFFLE1BQU0sQ0FBQztTQUNyQixDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztLQUNwQjs7Ozs7SUFFRCxvQ0FBYzs7OztJQUFkLFVBQWUsUUFBUTs7UUFDbkIsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDOztRQUNsQixJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUM7O1FBQ2xCLElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQzs7UUFDdEIsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxHQUFHLENBQUMsQ0FBQztRQUV4QyxPQUFPLFNBQVMsQ0FBQztLQUNwQjtzQkF0Qkw7SUF1QkM7Ozs7OztBQ3ZCRDtJQWNJO3dCQUZzQyxJQUFJLFlBQVksRUFBRTtRQUdwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs7WUFDdEIsSUFBSSxTQUFTLENBQVM7O1lBQ3RCLElBQUksUUFBUSxDQUFTO1lBQ3JCLFNBQVMsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUM5QyxRQUFRLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDeEMsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssRUFBRTtvQkFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ3JHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtpQkFDaEM7cUJBQ0k7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLFFBQVEsR0FBRyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7aUJBQzdCO2FBQ0o7U0FDSjtLQUNKOzs7O0lBR00sOENBQXFCOzs7OztRQUN4QixJQUFJLFdBQVcsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDOztRQUN2RCxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLFdBQVcsRUFBRTtZQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUMzRSxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQ3JDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQzs7Ozs7SUFJVCxtREFBMEI7Ozs7O1FBQzdCLElBQUksY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7O1FBQzdELElBQUksY0FBYyxDQUFDO1FBQ25CLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxjQUFjLElBQUksSUFBSSxFQUFFO1lBQ3hELGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDeEcsT0FBTyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQzthQUNqRDtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7Ozs7O0lBR1Qsa0NBQVM7Ozs7O1FBQ1osSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDOzs7Ozs7SUFHbkIsNEJBQUc7Ozs7Y0FBQyxFQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7OztJQUcxQix1Q0FBYzs7OztjQUFDLEtBQWE7UUFDL0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7SUFJN0IsMENBQWlCOzs7O1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0lBR2xCLDZCQUFJOzs7O2NBQUMsTUFBYzs7O1FBd0J0QixJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3pDLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFBLE1BQU07WUFFcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQywwR0FBMEcsQ0FBQyxDQUFBO1NBQzFILENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQUEsTUFBTTtZQUNsQixLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHdHQUF3RyxDQUFDLENBQUE7U0FDeEgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxHQUFHO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7O1NBRXZCLENBQUMsQ0FBQzs7Ozs7OztJQUlBLDBDQUFpQjs7Ozs7Y0FBQyxVQUFrQixFQUFFLFdBQW1CO1FBQzVELE9BQU8sVUFBVSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7OztnQkF2SDdDLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7Ozs7O3lCQVBEOzs7Ozs7OztJQ2VJO3dCQUZzQyxJQUFJLFlBQVksRUFBRTtRQUdwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDOUI7S0FDSjs7OztJQUVNLDBCQUFTOzs7OztRQUNaLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7O0lBR25CLG9CQUFHOzs7O2NBQUMsRUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7O0lBSTFCLDJDQUEwQjs7Ozs7Y0FBQyxFQUFVLEVBQUUsUUFBYTs7UUFDdkQsUUFBUSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDbEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLE1BQU07WUFDM0IsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzVCLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdEMsRUFBRSxVQUFBLEtBQUs7WUFDSixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFO2dCQUN2QixPQUFPLEtBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtvQkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNqQixDQUFDLENBQUM7YUFDTjtTQUNKLENBQUMsQ0FBQzs7Ozs7OztJQUtNLGdEQUErQjs7Ozs7Y0FBQyxFQUFVLEVBQUUsUUFBYTs7Ozs7O3dCQUNsRSxRQUFRLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7Ozt3QkFFRCxxQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFBOzt3QkFBM0IsTUFBTSxHQUFHLFNBQWtCO3dCQUMvQixRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0JBQzVCLHFCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFBOzt3QkFBakMsU0FBaUMsQ0FBQzs7Ozs4QkFFOUIsT0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUEsRUFBckIsd0JBQXFCO3dCQUNyQixxQkFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBQTs7d0JBQWpDLFNBQWlDLENBQUM7OzRCQUVsQyxzQkFBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNOzRCQUMvQixNQUFNLENBQUMsT0FBSyxDQUFDLENBQUM7eUJBQ2pCLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBb0JSLCtCQUFjOzs7O2NBQUMsS0FBYTtRQUMvQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFJN0IsdUJBQU07Ozs7Y0FBQyxLQUFhOztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO1lBQ2hDLE9BQU8sS0FBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkMsQ0FBQyxDQUFDOzs7OztJQUlBLGtDQUFpQjs7OztRQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztJQUdsQixxQkFBSTs7OztjQUFDLE1BQWM7OztRQUN0QixJQUFJLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzs7UUFFcEUsSUFBSSxPQUFPLEdBQUc7WUFDVixLQUFLLEVBQUUsSUFBSTtTQUNkLENBQUM7O1FBRUYsSUFBSSxRQUFRLEdBQUc7WUFDWCxJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxJQUFJO1NBQ2QsQ0FBQzs7UUFHRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDL0IsT0FBTyxTQUFBO1NBQ1YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBQSxNQUFNO1lBQ3BCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFBLE1BQU07WUFDbEIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBQSxLQUFLO1lBQ2hCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNoRCxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFPQSxxQ0FBb0I7Ozs7Ozs7O2NBQUMsVUFBa0IsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLFdBQW1CLEVBQUUsT0FBZTtRQUNoSCxPQUFPLEtBQUssR0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQzs7Ozs7SUFJekYsd0JBQU87Ozs7O1FBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDO1lBQzFCLEtBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUM1RSxDQUFDLENBQUM7OztnQkFqSVYsVUFBVSxTQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7Ozs7aUJBUEQ7Ozs7Ozs7QUNBQSxJQUFBO0lBSUksaUJBQVksVUFBaUIsRUFBRSxPQUFjO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO0tBQ3hCO2tCQVBMO0lBUUM7Ozs7OztBQ1JELElBQUE7OzsyQkFBQTtJQU1DOzs7Ozs7QUNKRCxJQUFBOztnQ0FVOEIsSUFBSSxLQUFLLEVBQW9COztxQkFaM0Q7SUFhQzs7Ozs7O0FDYkQsSUFJQTs7c0JBZ0JrQyxJQUFJOzRCQUNLLElBQUk7K0JBQ3pCLElBQUksS0FBSyxFQUFjOzRCQUMxQixJQUFJLFVBQVUsRUFBRTtzQkFDdEIsSUFBSSxLQUFLLEVBQWM7eUJBQ3BCLElBQUksS0FBSyxFQUFrQjs7dUJBekIzQztJQTBCQyxDQUFBO0FBdEJELElBd0JBOzs7eUJBNUJBO0lBZ0NDOzs7Ozs7QUMxQkQsSUFBQTtJQXNCSTs4QkFaaUIsSUFBSSxLQUFLLEVBQWdCO2tDQUNyQixJQUFJLEtBQUssRUFBb0I7NEJBQ25DLElBQUksS0FBSyxFQUFtQjtnQ0FDQSxJQUFJOzRCQUVoQyxJQUFJLEtBQUssRUFBTzt5QkFDbkIsSUFBSSxLQUFLLEVBQW9COytCQUdkLElBQUk7S0FNOUI7dUJBL0JMO0lBa0NDLENBQUE7QUE1QkQsSUE4QkE7OzsyQkFwQ0E7SUF3Q0M7Ozs7OztBQ3hDRCxJQUFBOzs7dUJBQUE7SUFNQzs7Ozs7O0FDTkQsSUFBQTs7OzBCQUFBO0lBR0MsQ0FBQTtBQUhELElBS0E7O2dDQUd1QyxLQUFLOzJCQUNWLEtBQUs7c0JBRVgsRUFBRTsyQkFDRyxFQUFFOzhCQUNDLEVBQUU7eUJBQ1AsRUFBRTsyQkFDQSxFQUFFOzJCQUVGLEVBQUU7d0JBQ0wsRUFBRTswQkFDQSxFQUFFOzZCQUVDLENBQUMsQ0FBQzs4QkFDRCxDQUFDLENBQUM7MEJBQ04sQ0FBQyxDQUFDOzhCQUNFLEVBQUU7NEJBQ0osRUFBRTtpQ0FDTCxFQUFFOztzQkExQmpDO0lBMkJDLENBQUE7QUF0QkQsSUF3QkE7OzswQkE3QkE7SUFnQ0M7Ozs7OztBQ2hDRCxJQUFBOzs7dUJBQUE7SUFHQzs7Ozs7O0FDREQsSUFBQTs7NEJBT2dDLENBQUM7bUNBQ0EsSUFBSSxLQUFLLEVBQXVCOzRCQU0vQixJQUFJOzttQkFoQnRDO0lBa0JDOzs7Ozs7QUNaRCxJQUFBOzswQkFRZ0MsQ0FBQztxQkFFZCxJQUFJLEtBQUssRUFBbUI7NEJBQ3JCLElBQUksS0FBSyxFQUFtQjs0QkFDNUIsSUFBSSxLQUFLLEVBQWdCO21DQUNsQixJQUFJLEtBQUssRUFBdUI7K0JBR3BDLElBQUksS0FBSyxFQUFzQjs4QkFHekIsRUFBRTs7Ozs7SUFHMUIsa0NBQVk7Ozs7UUFDZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxPQUFPLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7Ozs7SUFJaEUsc0NBQWdCOzs7O1FBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsY0FBYyxJQUFJLFdBQVcsR0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFLcEUsc0NBQWdCOzs7O2NBQUMsTUFBTTtRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLElBQUksV0FBVyxHQUFBLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDOzs7OztJQUt0RSxtQ0FBYTs7OztRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLGNBQWMsSUFBSSxhQUFhLEdBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQzs7c0JBOUNqRjtJQWdEQzs7Ozs7O0FDOUNELElBQUE7O21DQU9pQyxJQUFJLEtBQUssRUFBdUI7O29CQVRqRTtJQVVDOzs7Ozs7QUNWRCxJQUFBOzs7cUJBQUE7SUFLQyxDQUFBOzs7Ozs7QUNERDtBQVNBLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUN2QixJQUFBOztJQWlESTt5QkF6Q3lCLENBQUM7cUJBQ0wsQ0FBQzs0QkFDTSxDQUFDO3FCQVVkLElBQUksS0FBSyxFQUFlO21DQUNWLElBQUksS0FBSyxFQUF1Qjs2QkFDdEMsSUFBSSxLQUFLLEVBQWdCOzZCQUN6QixJQUFJLEtBQUssRUFBaUI7eUJBQzlCLElBQUksS0FBSyxFQUFZOzBCQUNwQixJQUFJLFVBQVUsRUFBRTt5QkFDakIsSUFBSSxLQUFLLEVBQWE7NEJBQ25CLElBQUksS0FBSyxFQUFnQjs4QkFDdkIsSUFBSSxLQUFLLEVBQWlCO2dDQVd4QixJQUFJLEtBQUssRUFBc0I7OEJBRXpCLEtBQUs7OEJBRUwsS0FBSztRQU9qQyxJQUFJLENBQUMsS0FBSyxHQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3ZEO3FCQWpFTDtJQW1FQzs7Ozs7O0FDakVELElBQUE7O21DQUtpQyxJQUFJLEtBQUssRUFBdUI7O3VCQVBqRTtJQVNDOzs7Ozs7QUNURCxJQUFBOzs7d0JBQUE7SUFNQzs7Ozs7O0FDTkQsSUFBQTs7OzhCQUFBO0lBT0M7Ozs7OztJQ0xEOzs7Ozs7Ozs7OztJQUVXLDJDQUFxQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQ3hFLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQ3ZELGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHbkcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBR0osMkNBQXFCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDeEUsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7UUFDdkQsYUFBYSxDQUFDLHdCQUF3QixDQUFDLDZCQUE2QixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUduRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7Ozs7Ozs7O0lBR0UsOENBQXdCOzs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVTs7OztnQkFJN0YsSUFBSTtvQkFDQSxJQUFJLEdBQUcsYUFBYSxDQUFDLHdCQUF3QixDQUFDLDZCQUE2QixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDNUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ3ZCLHNCQUFPLElBQUksRUFBQztpQkFDZjtnQkFDRCxXQUFLO29CQUNELHNCQUFPLElBQUksRUFBQztpQkFDZjs7Ozs7Ozs7Ozs7Ozs7SUFHRSx1Q0FBaUI7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxJQUFZLEVBQ2xGLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQ3ZELGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyx5QkFBeUIsR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUc5RyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFHSix3Q0FBa0I7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUNyRSxLQUFVLEVBQUUsU0FBbUIsRUFBRSxZQUFzQjtRQUN2RCxhQUFhLENBQUMsMEJBQTBCLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBR2xHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQixFQUNHLFVBQUEsR0FBRzs7WUFFQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BDLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUdKLHdDQUFrQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQ3JFLEtBQVUsRUFBRSxTQUFtQixFQUFFLFlBQXNCO1FBQ3ZELGFBQWEsQ0FBQywwQkFBMEIsQ0FBQywwQkFBMEIsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFHbEcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEMsQ0FBQyxDQUFDOzs7Ozs7O0lBR0wsK0NBQXlCOzs7OztJQUEvQixVQUFnQyxhQUE0QixFQUFFLFNBQWlCOzs7Ozs7d0JBRXZFLElBQUksR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDckMscUJBQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQTVGLElBQUksR0FBRyxTQUFxRixDQUFBO3dCQUM1RixzQkFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFBOzs7O0tBQzFCOzs7Ozs7O0lBRUssbUNBQWE7Ozs7OztJQUFuQixVQUFvQixhQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBWTs7Ozs7O3dCQUV4RSxJQUFJLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7d0JBQ3JCLHFCQUFNLGFBQWEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFBOzt3QkFBNUYsSUFBSSxHQUFHLFNBQXFGLENBQUE7d0JBRTVGLHNCQUFPLElBQUksRUFBQzs7OztLQUNmOzs7Ozs7Ozs7SUFFSywrQ0FBeUI7Ozs7Ozs7O0lBQS9CLFVBQWdDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxRQUFhLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjs7Ozs7O3dCQUUxSCxJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7d0JBQ3ZHLHFCQUFNLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxnQ0FBZ0MsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQXZHLElBQUksR0FBRyxTQUFnRyxDQUFBO3dCQUN2RyxzQkFBTyxJQUFJLEVBQUE7Ozs7S0FDZDs7Ozs7Ozs7O0lBRU0sdUNBQWlCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDcEUsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7UUFDdkQsYUFBYSxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUUvRixTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3RSxDQUFDLENBQUM7O3NCQXZIZjtJQXlIQzs7Ozs7O0lDdEhEOzs7Ozs7Ozs7OztJQUVXLHdDQUFhOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFDaEUsS0FBVSxFQUFFLFNBQW1CLEVBQUUsWUFBc0I7UUFDdkQsYUFBYSxDQUFDLHdCQUF3QixDQUFDLDJCQUEyQixHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJOztZQUdqRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbkIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7SUFJWCxvREFBeUI7Ozs7Ozs7SUFBekIsVUFBMEIsYUFBNEIsRUFBRSxTQUFpQixFQUNyRSxVQUFvQixFQUFFLFdBQXFCO1FBRTNDLGFBQWEsQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEdBQUcsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFbkYsSUFBSSxVQUFVLENBQUM7WUFDZixVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU5QixJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQzlDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEU7WUFFRCxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDMUIsRUFDRyxVQUFBLEdBQUc7O1lBRUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEMsQ0FBQyxDQUFDO0tBQ1Y7Ozs7Ozs7OztJQUtNLHFEQUEwQjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUN6RixVQUFvQixFQUFFLFdBQXFCO1FBRTNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBRW5HLElBQUksVUFBVSxDQUFDO1lBQ2YsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O1lBR3pDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdkQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNsRjs7WUFHRCxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxTQUFTO2dCQUM5QyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDN0UsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3REO2FBQ0osQ0FBQyxDQUFDO1lBRUgsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFCLEVBQ0csVUFBQSxHQUFHO1lBQ0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7WUFFakIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQU1KLHNEQUEyQjs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFBRSxVQUFrQixFQUM5RyxVQUFvQixFQUFFLFdBQXFCO1FBRTNDLGFBQWEsQ0FBQyxhQUFhLENBQUMseUNBQXlDLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTs7WUFFdkgsSUFBSSxZQUFZLENBQUM7WUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O1lBRzNDLElBQUksWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDeEQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNwRjs7WUFHRCxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDdkUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2hEO2FBQ0osQ0FBQyxDQUFDO1lBRUgsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzVCLEVBQ0csVUFBQSxHQUFHOzs7WUFHQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7OztJQU1FLGtEQUF1Qjs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLFNBQWlCOzs7Ozs7d0JBR25HLEtBQUssR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQzt3QkFFckIscUJBQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUFwSCxVQUFVLEdBQUcsU0FBdUcsQ0FBQzt3QkFFckgsc0JBQU8sVUFBVSxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztJQUlmLGlEQUFzQjs7Ozs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQWEsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQ2hJLFVBQW9CLEVBQUUsV0FBcUIsRUFBRSxXQUFtQixFQUFFLFdBQW1CO1FBQXhDLDRCQUFBLEVBQUEsbUJBQW1CO1FBQUUsNEJBQUEsRUFBQSxtQkFBbUI7O1FBRXJGLElBQUksS0FBSyxDQUFDO1FBQ1YsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDbkQsSUFBSSxXQUFXLEVBQUU7WUFDYixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUM1QjtRQUVELGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBQzNGLElBQUksV0FBVyxDQUFNO1lBQ3JCLFdBQVcsR0FBRyxJQUFJLENBQUM7Ozs7WUFLbkIsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM1SCxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNkLFdBQVcsR0FBRyxJQUFJLENBQUM7aUJBQ3RCO2FBQ0o7WUFDRCxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDM0IsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O0lBV0osc0RBQTJCOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBYSxFQUM3RixVQUFvQixFQUFFLFdBQXFCOztRQUUzQyxJQUFJLEtBQUssQ0FBQztRQUNWLEtBQUssR0FBRyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUVsQyxhQUFhLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBRXBHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQixFQUNHLFVBQUEsR0FBRztZQUNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7O0lBY0Usc0RBQTJCOzs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQWEsRUFDbkcsVUFBa0IsRUFBRSxVQUFrQixFQUFFLFdBQTRCO1FBQTVCLDRCQUFBLEVBQUEsbUJBQTRCOzs7Ozs7d0JBR3BFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO3dCQUVuRCxJQUFJLFdBQVcsRUFBRTs0QkFDYixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzt5QkFDNUI7d0JBQ00scUJBQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUE7O3dCQUF6RyxJQUFJLEdBQUcsU0FBa0csQ0FBQzt3QkFDMUcsc0JBQU8sSUFBSSxFQUFDOzs7Ozs7Ozs7Ozs7SUFVSCx5REFBOEI7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsUUFBZ0I7Ozs7Ozt3QkFFekcsS0FBSyxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUNqQixxQkFBTSxhQUFhLENBQUMsYUFBYSxDQUFDLHVDQUF1QyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBQTs7d0JBQXJILElBQUksR0FBUSxTQUF5Rzt3QkFDekgsc0JBQU8sSUFBSSxFQUFDOzs7Ozs7Ozs7Ozs7O0lBS1QsaURBQXNCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQ3JGLFVBQW9CLEVBQUUsV0FBcUI7UUFFM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUMvRixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQWdDSixnREFBcUI7Ozs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQ3BGLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUM5RixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7O0lBS0osdURBQTRCOzs7Ozs7OztjQUFDLGFBQTRCLEVBQUUsU0FBaUIsRUFBRSxLQUFVLEVBQzNGLFVBQW9CLEVBQUUsV0FBcUI7UUFDM0MsYUFBYSxDQUFDLGFBQWEsQ0FBQywwQ0FBMEMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUEsSUFBSTtZQUNyRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEIsRUFDRyxVQUFBLEdBQUc7WUFDQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7OztJQWNKLCtDQUFvQjs7Ozs7Ozs7O2NBQUMsYUFBNEIsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFDbkYsVUFBb0IsRUFBRSxXQUFxQjtRQUMzQyxhQUFhLENBQUMsYUFBYSxDQUFDLGtDQUFrQyxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBQSxJQUFJO1lBQzdGLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQixFQUNHLFVBQUEsR0FBRztZQUNDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O0lBV0oscURBQTBCOzs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFNBQWlCLEVBQUUsS0FBVSxFQUN6RixVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7WUFDM0YsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdELEVBQ0csVUFBQSxHQUFHO1lBQ0MsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCLENBQUMsQ0FBQzs7Ozs7Ozs7OztJQUdKLG1EQUF3Qjs7Ozs7Ozs7Y0FBQyxhQUE0QixFQUFFLFFBQWdCLEVBQUUsSUFBUyxFQUNyRixVQUFvQixFQUFFLFdBQXFCO1FBQzNDLGFBQWEsQ0FBQyxhQUFhLENBQUMsOEJBQThCLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFBLElBQUk7O1lBQ3ZGLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3pCLEVBQ0csVUFBQSxHQUFHOztZQUVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlDLENBQUMsQ0FBQzs7MkJBaFVmO0lBa1VDOzs7Ozs7QUNsVUQsSUFBQTs7a0NBR3dDLENBQUM7d0NBQ0gsSUFBSSxLQUFLLEVBQXdCOzs2QkFKdkU7SUFLQyxDQUFBO0FBTEQsSUFPQTs7K0JBSTZCLENBQUM7MEJBQ04sSUFBSSxLQUFLLEVBQU87a0NBQ1ksSUFBSTs2QkFDckIsQ0FBQzt1QkFDUCxJQUFJO3FCQU1kLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTs7K0JBckJ2QztJQXVCQyxDQUFBO0FBaEJELElBa0JBOzs7NkJBekJBO0lBZ0NDOzs7Ozs7QUNoQ0QsSUFBQTtJQUNJO0tBRUM7Ozs7OztJQUVNLHNCQUFLOzs7OztjQUFDLENBQU0sRUFBRSxRQUFnQjs7UUFDakMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQzs7Ozs7OztJQUdqRCx3QkFBTzs7Ozs7Y0FBQyxDQUFNLEVBQUUsUUFBZ0I7UUFDbkMsT0FBTyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7SUFHM0Ysd0JBQU87Ozs7O2NBQUMsTUFBTSxFQUFFLFFBQVE7O1FBQzNCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7O2lCQWhCM0Q7SUFrQkM7Ozs7Ozs7QUNLRCxJQUFNQSxRQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLElBQUE7SUFNSSw0QkFBWSxTQUFjLEVBQUUsY0FBMkI7dUJBTDlCLElBQUksTUFBTSxFQUFFO3lCQVVsQjtZQUNmLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEVBQUU7WUFDckMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUEsRUFBRTtZQUNyQyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1lBQ3ZDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLEVBQUU7WUFDdkMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUMxQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1lBQ3pDLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBLEVBQUU7WUFDeEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtZQUN4QyxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1lBQ3ZDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUEsRUFBRTtZQUNwQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUEsRUFBRTtTQUUvQztRQWpCRyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztLQUN6Qzs7Ozs7Ozs7O0lBb0JNLGlEQUFvQjs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGFBQTJCLEVBQUUsWUFBeUIsRUFBRSxXQUE4QixFQUFFLFdBQXVCOzs7UUFDaEssSUFBSSxLQUFLLENBQUM7O1FBQ1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQzs7UUFDOUIsSUFBSSxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQzs7UUFDcEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLFdBQVcsRUFBRTtZQUNiLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLEdBQUEsQ0FBQyxHQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxlQUFlOztnQkFDdkYsSUFBSSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztnQkFDbkQsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztnQkFHL0MsSUFBSSxLQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLEtBQUssZUFBZSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsRUFBRTtvQkFFaEgsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7b0JBQzFCLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBQSxVQUFVO3dCQUNoRCxLQUFLLEdBQUcsS0FBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQzt3QkFDN0csSUFBSSxLQUFLLEVBQUU7NEJBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDdEI7cUJBQ0osQ0FBQyxDQUFDO29CQUVILEtBQUssR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNwRixJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUU7Ozt3QkFFcEIsS0FBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUN4RCxLQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNyRCxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUM1QjtpQkFDSjthQUVKLENBQUMsQ0FBQztZQUNILE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQztTQUNmOzs7Ozs7SUFJTCxtREFBc0I7Ozs7SUFBdEIsVUFBdUIsZUFBMkI7O1FBQzlDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUVsQixJQUFJLGVBQWUsQ0FBQyxRQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFO1lBQzdELE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDbEI7UUFFRCxJQUFJLGVBQWUsQ0FBQyxVQUFVLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFO1lBQy9ELE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDbEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNqQjs7Ozs7Ozs7O0lBR00scURBQXdCOzs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsYUFBMkIsRUFBRSxZQUF5QixFQUFFLFVBQTZCLEVBQUUsV0FBdUI7O1FBQ25LLElBQUksS0FBSyxDQUFDOztRQUNWLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztZQUNyRCxJQUFJLFNBQVMsQ0FBZTs7WUFDNUIsSUFBSSxZQUFZLENBQUM7WUFDakIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxVQUFVLEVBQUU7Z0JBQzNFLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBRTVGLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDM0ksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7cUJBQU0sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7O29CQUVqRixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQyxPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFOztvQkFFL0UsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO3FCQUFNOztvQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN0QjthQUNKO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7Ozs7O0lBTXhFLHNEQUF5Qjs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsYUFBMkIsRUFBRSxZQUF5QixFQUFFLFNBQXVCOztRQUNySSxJQUFJLFdBQVcsQ0FBQzs7UUFDaEIsSUFBSSxLQUFLLENBQUM7UUFDVixXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsS0FBSyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDNUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUMsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O0lBUVYsK0NBQWtCOzs7Ozs7Y0FBQyxLQUFLLEVBQUUsU0FBdUI7UUFDcEQsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUM3Qzs7Ozs7Ozs7OztJQUtFLHlEQUE0Qjs7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLGFBQTJCLEVBQUUsWUFBeUIsRUFBRSxTQUF1QixFQUFFLFlBQVk7OztRQUN0SixJQUFJLFlBQVksQ0FBQzs7UUFDakIsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJO1lBRUEsUUFBUSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHOztnQkFFcEMsS0FBSyxvQkFBb0I7b0JBQ3JCLFlBQVksR0FBRyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFBO29CQUNwTixZQUFZLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3pELEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzVDLE1BQU07Z0JBQ1YsS0FBSyxPQUFPO29CQUNSLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQzdGLE1BQU07Z0JBQ1YsS0FBSyxRQUFRO29CQUNULEtBQUssR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDakYsTUFBTTtnQkFDVixLQUFLLGlCQUFpQjtvQkFDbEIsS0FBSyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ25KLE1BQU07Z0JBQ1YsS0FBSyxTQUFTO29CQUNWLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDeEUsTUFBTTtnQkFDVixLQUFLLFNBQVM7b0JBQ1YsS0FBSyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUM3RSxNQUFNO2dCQUNWLEtBQUssV0FBVztvQkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztvQkFDaEgsTUFBTTtnQkFDVixLQUFLLE1BQU07b0JBQ1AsS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUE7b0JBQzNELE1BQU07Z0JBQ1YsS0FBSyxXQUFXO29CQUNaLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFBO29CQUM1RCxNQUFNOzs7O29CQUtOLE1BQU07Z0JBQ1Y7b0JBQ0ksT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNyQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDM0MsTUFBTTthQUNiO1NBQ0o7UUFBQyxXQUFNO1lBQ0osS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDOUM7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7SUFJViw4Q0FBaUI7Ozs7OztjQUFDLE1BQWtCLEVBQUUsSUFBSSxFQUFFLEtBQUs7O1FBQ3BELElBQUksYUFBYSxDQUFDOztRQUNsQixJQUFJLEtBQUssQ0FBQztRQUNWLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Ozs7WUFJbkIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsWUFBWSxHQUFBLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNoQixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNILElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFOztvQkFDekMsSUFBSSxvQkFBa0IsR0FBRyxFQUFFLENBQUM7b0JBQzVCLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBQSxTQUFTO3dCQUMzQixJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTs0QkFDbkMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO2dDQUMvQixJQUFJLENBQUMsb0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxJQUFJLEtBQUssR0FBQSxDQUFDO29DQUFFLG9CQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDakYsQ0FBQyxDQUFDO3lCQUNOOzZCQUNJOzRCQUNELElBQUksQ0FBQyxvQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLElBQUksU0FBUyxDQUFDLFdBQVcsR0FBQSxDQUFDO2dDQUFFLG9CQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQ2pIO3FCQUNKLENBQUMsQ0FBQztvQkFDSCxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxvQkFBa0IsRUFBRSxDQUFDO2lCQUNoRjtxQkFDSTs7b0JBQ0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQU8sQ0FBQzs7b0JBRWhDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEdBQUEsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzt3QkFFckIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUN6Qzt5QkFBTTt3QkFDSCxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ3JDO2lCQUNKO2FBRUo7O1lBR0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFNBQVMsR0FBQSxDQUFDLEVBQUU7Z0JBQy9CLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDN0I7U0FDSjthQUNJO1lBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QztRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7O0lBSVYsNkNBQWdCOzs7OztjQUFDLFNBQWtCLEVBQUUsWUFBWTs7UUFDcEQsSUFBSSxLQUFLLENBQUM7UUFDVixLQUFLLEdBQUcsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2hFLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDM0M7UUFDRCxPQUFPLEtBQUssQ0FBQzs7Ozs7Ozs7OztJQVVWLDREQUErQjs7Ozs7Ozs7Y0FBQyxVQUE4QixFQUFFLEtBQXlCLEVBQUUsUUFBb0IsRUFBRSxhQUFzQjs7UUFDMUksSUFBSSxLQUFLLEdBQVEsSUFBSSxDQUFDO1FBQ3RCLElBQUk7O1lBQ0EsSUFBSSxPQUFPLEdBQWUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFHL0MsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFBLENBQUMsQ0FBQztZQUV2RyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFL0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLEdBQUEsQ0FBQyxFQUFFO2dCQUMvRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQ3ZGO1NBRUo7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNULEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7Ozs7SUFTViwwREFBNkI7Ozs7Ozs7O2NBQUMsVUFBOEIsRUFBRSxLQUF5QixFQUFFLFFBQW9CLEVBQUUsYUFBc0I7O1FBQ3hJLElBQUksS0FBSyxHQUFRLElBQUksQ0FBQztRQUN0QixJQUFJOztZQUNBLElBQUksT0FBTyxHQUFlLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQy9DLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBQSxDQUFDLENBQUM7WUFDMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O2dCQUN0QyxJQUFJLFVBQVUsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQTtnQkFDMUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzthQUMvQjtZQUVELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxHQUFBLENBQUMsRUFBRTtnQkFDL0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN2RjtTQUVKO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDVCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQjtRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztJQUlULGtEQUFxQjs7Ozs7O2NBQUMsT0FBbUIsRUFBRSxRQUFvQixFQUFFLGVBQXVCOztRQUM1RixJQUFJLGFBQWEsR0FBVyxlQUFlLENBQUM7UUFFNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1lBQ3JDLElBQUksY0FBYyxHQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7O1lBQ2pELElBQUksVUFBVSxHQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDMUMsSUFBSSxhQUFhLElBQUksY0FBYyxFQUFFOztnQkFDakMsSUFBSSxPQUFPLEdBQVcsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLGFBQWEsR0FBRyxjQUFjLElBQUksQ0FBQyxFQUFFLENBQ3hDO3FCQUFNO29CQUNILE9BQU8sR0FBRyxhQUFhLEdBQUcsY0FBYyxDQUFDO29CQUN6QyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDdkQsYUFBYSxHQUFHLGFBQWEsR0FBRyxPQUFPLENBQUM7aUJBQzNDO2dCQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3BGLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDcEcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7aUJBQy9CO2dCQUNELE1BQU07YUFDVDtTQUNKOzs7Ozs7OztJQVNFLHdEQUEyQjs7Ozs7O2NBQUMsUUFBb0IsRUFBRSxPQUFPOztRQUM1RCxJQUFJLGVBQWUsR0FBRyxJQUFJLEtBQUssRUFBTyxDQUFDO1FBQ3ZDLElBQUk7WUFFQSxLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hELGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckM7U0FDSjtRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbkI7UUFFRCxPQUFPLGVBQWUsQ0FBQzs7Ozs7Ozs7O0lBV3BCLGlEQUFvQjs7Ozs7OztjQUFDLFdBQXVCLEVBQUUsU0FBdUIsRUFBRSxZQUFZOztRQUN0RixJQUFJLEtBQUssQ0FBTTtRQUNmLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3BKLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBRXJEO2FBQU07WUFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7SUFTVixzREFBeUI7Ozs7Ozs7Y0FBQyxXQUF1QixFQUFFLFNBQXVCLEVBQUUsWUFBWTs7UUFDM0YsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztJQUdqQix3REFBMkI7Ozs7OztJQUEzQixVQUE0QixZQUF3QixFQUFFLFNBQXVCLEVBQUUsWUFBWTtRQUN2RixJQUFJOztZQUNBLElBQUksS0FBSyxDQUFNO1lBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUNsSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQzthQUNyRDtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5QztTQUVKO1FBQUMsV0FBTTtZQUNKLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxLQUFLLENBQUM7S0FDaEI7Ozs7Ozs7O0lBUU0sa0RBQXFCOzs7Ozs7O2NBQUMsYUFBMkIsRUFBRSxTQUF1QixFQUFFLFlBQVk7UUFDM0YsSUFBSTs7WUFDQSxJQUFJLEtBQUssQ0FBTTtZQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtnQkFDbkgsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDOUM7U0FFSjtRQUFDLFdBQU07WUFDSixLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7SUFXVix3REFBMkI7Ozs7Ozs7Y0FBQyxhQUEyQixFQUFFLFNBQXVCLEVBQUUsWUFBWTtRQUNqRyxJQUFJOztZQUNBLElBQUksS0FBSyxDQUFNO1lBQ2YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO2dCQUNuSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQzthQUNyRDtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM5QztTQUVKO1FBQUMsV0FBTTtZQUNKLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxLQUFLLENBQUM7Ozs7Ozs7O0lBVVYsbURBQXNCOzs7Ozs7Y0FBQyxTQUF1QixFQUFFLFlBQVk7O1FBQy9ELElBQUksS0FBSyxDQUFNO1FBQ2YsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDcEwsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNILElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDakgsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDOUM7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7OztJQVFWLGtEQUFxQjs7Ozs7O2NBQUMsU0FBdUIsRUFBRSxZQUFZOzs7UUFDOUQsSUFBSSxLQUFLLENBQU07UUFDZixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3hNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBRXJEO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTs7Z0JBQy9ILEtBQXNCLElBQUEsS0FBQUMsU0FBQSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO29CQUFoRixJQUFNLE9BQU8sV0FBQTtvQkFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTt3QkFDekYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO3FCQUNwRDtpQkFDSjs7Ozs7Ozs7O1lBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdDO2FBQ0k7WUFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sS0FBSyxDQUFDOzs7Ozs7Ozs7OztJQUlWLDJEQUE4Qjs7Ozs7Ozs7O2NBQUMsV0FBdUIsRUFBRSxhQUEyQixFQUFFLFlBQXlCLEVBQ2pILGNBQXNDLEVBQUUsaUJBQXlCLEVBQUUscUJBQXFCOzs7UUFDeEYsSUFBSSxLQUFLLENBQUM7O1FBQ1YsSUFBSSxxQkFBcUIsQ0FBQztRQUMxQixRQUFRLGlCQUFpQixDQUFDLElBQUksRUFBRTtZQUM1QixLQUFLLFVBQVU7Z0JBRVgscUJBQXFCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBQSxDQUFDLENBQUM7Z0JBQ25KLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDckQsTUFBTTtZQUNWLEtBQUssWUFBWTtnQkFDYixxQkFBcUIsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFBLENBQUMsQ0FBQztnQkFDMUwsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBQ1YsS0FBSyxTQUFTO2dCQUNWLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQkFFMUwsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBQ1YsS0FBSyxVQUFVO2dCQUNYLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFBLENBQUMsQ0FBQztnQkFFak0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBQ1YsS0FBSyxVQUFVO2dCQUNYLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxLQUFJ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
|
|
16811
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2YtcmVnbGFuZWdvY2lvbTMuanMubWFwIiwic291cmNlcyI6WyJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvQ29udmVydC94bWxUb0pTb24uY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL0RhdGEvbTMtY291Y2gtbWFlc3Ryby50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvRGF0YS9tMy1kYXRhLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL2ZpbHRyb3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vTTNQcmRBZGljaW9uYWxlcy50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL00zUHJkTGlzdGEudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZEdycC50eXBlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wLWltcHVlc3Rvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBkaW5hbWljYXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtZnAudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXBlbmMtaXRlbXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXAtZW52aW9zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1mLXRyYWJham8udHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXByb2Nlc29zLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wcmVjZXBjaW9uLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWZlLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXByb2Nlc28uaW50ZXJmYWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3MudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1Byb21vY2lvbmVzL3Byb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29uZmlnbHAuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtbG9hZC1sLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9NM01hZXN0cm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLXNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXRyeC5pbnRlcmZhY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1wcm9jZXNvcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9NM1ByZFBhY2tEZXQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpQWRpY2lvbmFsZXMudHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUHJvbW9jaW9uZXMvTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtdWJpY2FjaW9uLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL20zLXJlZy1tYXNpdm8uc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmVnLW1hc2l2by1ha3ouc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcmV2ZXJzby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9SZWdpc3Ryby9tMy1wZGluYW0tYnktYWN0aXZpZGFkLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL20zLWRpbi1ieS1hY3RpdmlkYWQudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1JlZ2lzdHJvL20zLXNhbGRvcy14LWN1ZW50YS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvUmVnaXN0cm8vbTMtcmVnLXRyeC50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvQ3Vwb25lcy9jdXBvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9iZC1vZmZsaW5lLWxvZy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtbWFlc3Ryby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL3NlcnZpY2UtbTMtcHJvY2Vzby1vZmZsaW5lLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9TZXJ2aWNlcy9tMy1ub3RpZmljYWNpb25lcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL05vdGlmaWNhY2lvbmVzL00zTm9maXRpY2FjaW9uZXMubW9kZWwudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL01hZXN0cm8vbTMtcHJlc2VudGFjaW9uZXMudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL1NlcnZpY2VzL0NvbnN1bHRhc00zL20zLWNvbnN1bHRhcy5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9NYWVzdHJvL1ViaWNhY2lvbi9tMy10ZWNsYXMtcmFwaWRhcy50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvT2ZmbGluZS9jb3VjaC1wcmRzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtY29kc3ByZC5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXByb21vY2lvbmVzLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvY291Y2gtdWJpY2FjaW9uZXMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvTm90aWZpY2FjaW9uZXMvbm90aWZpY2FjaW9uZXMtbTMuc2VydmljZS50cyIsIm5nOi8vc2YtcmVnbGFuZWdvY2lvbTMvbGliL3JubTMvU2VydmljZXMvbTMtcGFjay1ieS10aXBvLnNlcnZpY2UudHMiLCJuZzovL3NmLXJlZ2xhbmVnb2Npb20zL2xpYi9ybm0zL09mZmxpbmUvU2VydmljZS9maWx0cm9zLWRpYXJpby5zZXJ2aWNlLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLXBlcnh0aXBvLnRzIiwibmc6Ly9zZi1yZWdsYW5lZ29jaW9tMy9saWIvcm5tMy9PZmZsaW5lL2NvdWNoLWRpbmFteHByb2Nlc29zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHAsIFJlcXVlc3RPcHRpb25zLCBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCdcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCdcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cC9zcmMvc3RhdGljX3Jlc3BvbnNlJ1xyXG5pbXBvcnQgeyB0aW1lb3V0LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBvc3RTZXJ2aWNlTTMge1xyXG4gICAgaWRrYXRpb3M6IHN0cmluZ1xyXG4gICAgc2Vydmlkb3I6IHN0cmluZztcclxuICAgIHNlcnZpZG9yUGVyc29uYXM6IHN0cmluZztcclxuICAgIHNlcnZpZG9yR2VuZXJhbGVzOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvck0zOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWRvckZFTVg6IHN0cmluZztcclxuICAgIHNlcnZpZG9yRG9jdW1lbnRvczogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JDb250YWJsZTogc3RyaW5nO1xyXG4gICAgc2Vydmlkb3JQcmVzdGFtbzogc3RyaW5nO1xyXG4gICAgV2ViQmFzZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5jYXJnYUluaWNpYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FyZ2FJbmljaWFsKCkge1xyXG5cclxuICAgICAgICB2YXIganNvbjogYW55O1xyXG4gICAgICAgIGxldCBzQ29uZmlnSlNPTiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpO1xyXG4gICAgICAgIGlmIChzQ29uZmlnSlNPTikge1xyXG4gICAgICAgICAgICBsZXQgakNvbmZpZ0pTT04gPSBKU09OLnBhcnNlKHNDb25maWdKU09OKTtcclxuICAgICAgICAgICAgaWYgKGpDb25maWdKU09OLlNlcnZpZG9yUGVyc29uYXMpIHtcclxuICAgICAgICAgICAgICAgIGpzb24gPSBqQ29uZmlnSlNPTjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAganNvbiA9IHJlcXVpcmUoJ0c6L0Rlc2Fycm9sbG8vQkQvV0U4L2NvbmZpZy5qc29uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENvbmZpZ0pzb24oaWRLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwID0gYXdhaXQgdGhpcy5nZXRXaXRoQm9keUdlbmVyYWxlcygnR2VuZXJhbGVzL2dldENvbmZpZ0pzb24vJyArIGlkS2F0aW9zLCBudWxsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgdmFyIHJlc3B1ZXN0YTogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BPa19nZXRDb25maWdKc29uKHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzcE9rX2dldENvbmZpZ0pzb24oanNvbikge1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JQZXJzb25hcyA9IGpzb24uU2Vydmlkb3JQZXJzb25hcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yID0ganNvbi5TZXJ2aWRvcjtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzID0ganNvbi5TZXJ2aWRvckdlbmVyYWxlcztcclxuICAgICAgICB0aGlzLnNlcnZpZG9yTTMgPSBqc29uLlNlcnZpZG9yTTM7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWRvckZFTVggPSBqc29uLlNlcnZpZG9yRkVNWDtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyA9IGpzb24uU2Vydmlkb3JEb2N1bWVudG9zO1xyXG4gICAgICAgIHRoaXMuc2Vydmlkb3JDb250YWJsZSA9IGpzb24uU2Vydmlkb3JDb250YWJsZTtcclxuICAgICAgICB0aGlzLnNlcnZpZG9yUHJlc3RhbW8gPSBqc29uLlNlcnZpZG9yUHJlc3RhbW87XHJcbiAgICAgICAgdGhpcy5XZWJCYXNlID0ganNvbi5XZWJCYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVSTFNlcnZlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWRvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVUkxTZXJ2ZXJEb2NzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGlTZXJ2aWRvciArIHVybEdldCkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9odHRwR2V0XHJcbiAgICBodHRwR2V0V2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIGlTZXJ2aWRvcjogc3RyaW5nLCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0KS5waXBlKFxyXG4gICAgICAgICAgICB0aW1lb3V0KHRpbWVvdXRUaW1lKVxyXG4gICAgICAgICkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBHZXRXaXRoQm9keSh1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRyb3NcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBodHRwR2V0V2l0aEJvZHlUaW1lT3V0KHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xyXG5cclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChpU2Vydmlkb3IgKyB1cmxHZXQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRpbWVvdXQodGltZW91dFRpbWUpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaHR0cF9nZXRfYmxvYih1cmxHZXQ6IHN0cmluZywgaVNlcnZpZG9yOiBzdHJpbmcsIHBhcmFtZXRyb3M6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xyXG5cclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpOyAgICAgICAgXHJcbiAgICAgICAgLy9oZWFkZXJzLmFwcGVuZCgnUmVzcG9uc2UgVHlvZScsICdibG9iJyk7XHJcblxyXG5cclxuICAgICAgICAvL2NvbnN0IG9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoe2hlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IHtcImNvcnJlb1wiOiBcInBhcmFtc1wifSwgcGFyYW1zOm15UGFyYW1zfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KGlTZXJ2aWRvciArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGh0dHBfZ2V0X2FycmF5YnVmZmVyKHVybEdldDogc3RyaW5nLCBpU2Vydmlkb3I6IHN0cmluZywgcGFyYW1ldHJvczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7ICAgICAgICBcclxuICAgICAgICAvL2hlYWRlcnMuYXBwZW5kKCdSZXNwb25zZSBUeW9lJywgJ2Jsb2InKTtcclxuXHJcblxyXG4gICAgICAgIC8vY29uc3Qgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7aGVhZGVyczogaGVhZGVycywgYm9keToge1wiY29ycmVvXCI6IFwicGFyYW1zXCJ9LCBwYXJhbXM6bXlQYXJhbXN9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoaVNlcnZpZG9yICsgdXJsR2V0LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYXJyYXlidWZmZXJcIixcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldHJvc1xyXG4gICAgICAgICAgICB9KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgZ2V0UHJlc3RhbW8odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0KHVybEdldCwgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0V2l0aEJvZHlNM1RpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55LCB0aW1lb3V0VGltZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5VGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgcGFyYW1zLCB0aW1lb3V0VGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlQcmVzdGFtbyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwR2V0V2l0aEJvZHkodXJsR2V0LCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8sIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFdpdGhCb2R5TTModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvck0zLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5UGVyc29uYXModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldFdpdGhCb2R5KHVybEdldCwgdGhpcy5zZXJ2aWRvclBlcnNvbmFzLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFdpdGhCb2R5R2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXM6IGFueSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoQm9keSh1cmxHZXQsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0V2l0aEJvZHlEb2N1bWVudG8odXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XHJcblxyXG4gICAgICAgIC8vaGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ3Jlc3BvbnNlVHlwZScsICdSZXNwb25zZUNvbnRlbnRUeXBlLkJsb2InKTtcclxuXHJcbiAgICAgICAgLy9jb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtoZWFkZXJzOiBoZWFkZXJzLCBib2R5OiB7XCJjb3JyZW9cIjogXCJwYXJhbXNcIn0sIHBhcmFtczpteVBhcmFtc30pO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldCh0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyArIHVybEdldCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgICAgICAgfSkubWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2Jsb2JfRG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwX2dldF9ibG9iKHVybEdldCwgdGhpcy5zZXJ2aWRvckRvY3VtZW50b3MsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0X2FycmF5YnVmZmVyX0RvY3VtZW50b3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtczogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cF9nZXRfYXJyYXlidWZmZXIodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcywgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3N0cyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQZXJzb25hcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yUGVyc29uYXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdlbmVyYWxlcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yR2VuZXJhbGVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRNMyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yTTMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE0zV2l0aFRpbWVPdXQodXJsR2V0OiBzdHJpbmcsIHRpbWVPdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXRXaXRoVGltZU91dCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JNMywgdGltZU91dCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgZ2V0RG9jdW1lbnRvcyh1cmxHZXQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBHZXQodXJsR2V0LCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENvbnRhYmxlKHVybEdldDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cEdldCh1cmxHZXQsIHRoaXMuc2Vydmlkb3JDb250YWJsZSk7XHJcbiAgICB9XHJcbiAgICAvLy9FbmQgaHR0cEdldFxyXG5cclxuICAgIGdldFBvc3RzV2l0aE91dEpzb24odXJsR2V0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLnNlcnZpZG9yICsgdXJsR2V0KS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1c1RleHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8vcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBcclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5zZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAocmVzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VSZXNwb25zZUh0dHBDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoaVNlcnZpZG9yICsgdXJsR2V0LCBwYXJhbXMpLm1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwUHJlc3RhbW9zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVJlc3BvbnNlSHR0cENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yUHJlc3RhbW8pO1xyXG4gICAgfVxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlUmVzcG9uc2VIdHRwXHJcblxyXG5cclxuICAgIC8vL3Bvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuICAgIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucyh7IGhlYWRlcnM6IGhlYWRlcnMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChpU2Vydmlkb3IgKyB1cmxHZXQsIHBhcmFtcywgb3B0aW9ucykubWFwKFxyXG4gICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwT3B0aW9ucyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zTTModXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaGVhZGVycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgaGVhZGVycywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBPcHRpb25zRG9jcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwT3B0aW9uc0NhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCBoZWFkZXJzLCB0aGlzLnNlcnZpZG9yRG9jdW1lbnRvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vRW5kIHBvc3RTZXJ2aWNlSHR0cE9wdGlvbnNcclxuXHJcbiAgICAvLy9wb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0OiBzdHJpbmcsIHBhcmFtcywgaVNlcnZpZG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbENhbGxTZXJ2aWNlKHVybEdldCwgcGFyYW1zLCB0aGlzLnNlcnZpZG9yKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQZXJzb25hcyh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JQZXJzb25hcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZVdlYkFwaSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvck0zKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWCh1cmxHZXQ6IHN0cmluZywgcGFyYW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFNlcnZpY2VXZWJBcGkodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JGRU1YKTtcclxuICAgIH1cclxuXHJcbiAgICBwb3N0U2VydmljZUh0dHBSZXNGdWxsR2VuZXJhbGVzKHVybEdldDogc3RyaW5nLCBwYXJhbXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wb3N0U2VydmljZUh0dHBSZXNGdWxsQ2FsbFNlcnZpY2UodXJsR2V0LCBwYXJhbXMsIHRoaXMuc2Vydmlkb3JHZW5lcmFsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxQcmVzdGFtb3ModXJsR2V0OiBzdHJpbmcsIHBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxDYWxsU2VydmljZSh1cmxHZXQsIHBhcmFtcywgdGhpcy5zZXJ2aWRvclByZXN0YW1vKTtcclxuICAgIH1cclxuICAgIC8vL0VuZCBwb3N0U2VydmljZUh0dHBSZXNGdWxsXHJcbiAgICBwb3N0U2VydmljZVdlYkFwaSh1cmxHZXQ6IHN0cmluZywgcGFyYW1zLCBpU2Vydmlkb3IpIHtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHsgaGVhZGVyczogaGVhZGVycyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGlTZXJ2aWRvciArIHVybEdldCwgcGFyYW1zLCBvcHRpb25zKS5tYXAoXHJcbiAgICAgICAgICAgIHJlcyA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIHhtbFRvSnNvblRGe1xyXG5cclxuICAgIGNvbnZlcnRYbWxUb0pzb24oaW5wdXRYbWwpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gcmVxdWlyZSgneG1sMmpzJykucGFyc2VTdHJpbmc7XHJcbiAgICAgICAgY29uc3QgeG1sID0gaW5wdXRYbWw7XHJcbiAgICAgICAgbGV0IHJlc3VsdGFkbztcclxuICAgICAgICBwYXJzZVN0cmluZyh4bWwsIChlcnIsIHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHRhZG89IHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcGxhY2VDaGFyWG1sKGlucHV0WG1sKXtcclxuICAgICAgICBsZXQgZ3QgPSAvJmd0Oy9naTsgICAgICAgIFxyXG4gICAgICAgIGxldCBsdCA9IC8mbHQ7L2dpO1xyXG4gICAgICAgIGxldCBxdW90ID0gLyZxdW90Oy9naTtcclxuICAgICAgICBsZXQgcmVzdWx0YWRvID0gaW5wdXRYbWwucmVwbGFjZShndCxcIj5cIik7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gcmVzdWx0YWRvLnJlcGxhY2UobHQsXCI8XCIpO1xyXG4gICAgICAgIHJlc3VsdGFkbyA9IHJlc3VsdGFkby5yZXBsYWNlKHF1b3QsXCInXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE0zQ291Y2hNYWVzdHJvIHtcclxuICAgIHB1YmxpYyBvRGF0YU0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIHNUaXBvSHViOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgc1RpcG9IdWIgPSB0aGlzLkdldFRpcG9IdWJGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICBpZiAoc0lka2F0aW9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc1RpcG9IdWIgJiYgc1RpcG9IdWIudG9VcHBlckNhc2UoKS50cmltKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tRWNjX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21FY2NfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0VFQ0MhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImluZm9tX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwiaW5mb21fXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSU5TVEFOQ0UhIcOCwqFcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Z1bmNpb24gcXVlIHRyYWVyYSBlbCB0aXBvIGRlIGh1YlxyXG4gICAgcHVibGljIEdldFRpcG9IdWJGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5UaXBvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1NVYmljYWNpb24uTTNIVUJTWzBdLlRpcG87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RGF0YVBvdWNoQkQoaXNLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpc0tleSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSk7XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIC8vICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIC8vIH07XHJcblxyXG4gICAgICAgIC8vIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAvLyAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAvLyAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICAvLyB9O1xyXG5cclxuICAgICAgICAvLyAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgLy8gdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgLy8gICAgIG9wdGlvbnMyXHJcbiAgICAgICAgLy8gfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJDb21wbGV0bzpcIiArIGNoYW5nZSlcclxuICAgICAgICAvLyB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAvLyAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgLy8gfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBkb2N1bWVudG8gcXVlIHNlIHF1aWVyZSBjb25zdWx0YXJcclxuICAgIHB1YmxpYyBHZXRLZXlEb2N1bWVudG9EQihpc0lES2F0aW9zOiBzdHJpbmcsIGlzRG9jdW1lbnRvOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaXNJREthdGlvcyArIFwiP1wiICsgaXNEb2N1bWVudG87XHJcbiAgICB9XHJcblxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM0RhdGEge1xyXG4gICAgcHVibGljIG9EYXRhTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIkNhcnJpdG9Db21wcmFzXCIsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYXIgZW4gQkQgcG91Y2guXHJcbiAgICBwdWJsaWMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoaWQ6IHN0cmluZywgZG9jdW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGRvY3VtZW50Ll9pZCA9IGlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5fcmV2ID0gcmVzdWx0Ll9yZXY7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL0FkaWNpb25hciBlbiBCRCBwb3VjaCwgQXN5bmMuXHJcbiAgICBwdWJsaWMgYXN5bmMgQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhpZDogc3RyaW5nLCBkb2N1bWVudDogYW55KSB7XHJcbiAgICAgICAgZG9jdW1lbnQuX2lkID0gaWQ7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0KGlkKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuX3JldiA9IHJlc3VsdC5fcmV2O1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnB1dChkb2N1bWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmV0dXJuIHRoaXMuZ2V0KGlkKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50Ll9yZXYgPSByZXN1bHQuX3JldjtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT0gXCI0MDRcIikge1xyXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucHV0KGRvY3VtZW50KTtcclxuICAgICAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIEdldERhdGFQb3VjaEJEKGlzS2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBiYXNlIGRlIGRhdG9zLlxyXG4gICAgcHVibGljIERlbGV0ZShpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaXNLZXkpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zMiA9IHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL3RoaXMuYXV0ZW50aWNhY2lvblNlcnZlcihyZW1vdGVEYXRhYmFzZSk7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5zeW5jKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLnN5bmMocmVtb3RlRGF0YWJhc2UsIG9wdGlvbnMyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL2FybWFyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBJREthdGlvcywgdGRvYyB5IG5kb2MuXHJcbiAgICBwdWJsaWMgR2V0S2V5Q2Fycml0b0NvbXByYXMoaXNJREthdGlvczogc3RyaW5nLCBpc1Rkb2M6IHN0cmluZywgaXNOZG9jOiBzdHJpbmcsIGlzVWJpY2FjaW9uOiBzdHJpbmcsIGlzSWRIdWI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBcIkNDP1wiICsgaXNJREthdGlvcyArIFwiP1wiICsgaXNVYmljYWNpb24gKyBcIj9cIiArIGlzSWRIdWIgKyBcIj9cIiArIGlzVGRvYyArIFwiP1wiICsgaXNOZG9jO1xyXG4gICAgfVxyXG5cclxuICAgIC8vRGVzdHJ1aXIgeSByZWNvbnN0cnVpciBsYSBiYXNlIGRlIGRhdG9zIHBvdWNoREJcclxuICAgIHB1YmxpYyBSZXNlckJEKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQignQ2Fycml0b0NvbXByYXMnLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBGaWx0cm9zIHtcclxuICAgIHB1YmxpYyBBdHJpYnV0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlzQXRyaWJ1dG86c3RyaW5nLCBpc1ZhbG9yOnN0cmluZyl7XHJcbiAgICAgICAgdGhpcy5BdHJpYnV0byA9IGlzQXRyaWJ1dG87XHJcbiAgICAgICAgdGhpcy5WYWxvciA9IGlzVmFsb3I7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUHJkQWRpY2lvbmFsZXN7XHJcbiAgICBTS1AxOnN0cmluZztcclxuICAgIEFUUklCVVRPOnN0cmluZztcclxuICAgIFZBTE9SOnN0cmluZztcclxuICAgIE5JVkVMMTpudW1iZXI7XHJcbiAgICBOSVZFTDI6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQcmVzZW50YWNpb25lcyB9IGZyb20gXCIuL20zLXByZXNlbnRhY2lvbmVzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcmRMaXN0YXtcclxuICAgIElETElTVEE6c3RyaW5nO1xyXG4gICAgU0tVOnN0cmluZztcclxuICAgIExPVEU6c3RyaW5nO1xyXG4gICAgUFJFQ0lPOm51bWJlcjtcclxuICAgIExCOiBudW1iZXI7XHJcbiAgICBMQzogbnVtYmVyO1xyXG4gICAgTEQ6IG51bWJlcjtcclxuICAgIFNVQklORElDRTogc3RyaW5nO1xyXG4gICAgUE9SSUdJTkFMOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgTTNQcmVzZW50YWNpb25lcyA9IG5ldyBBcnJheTxNM1ByZXNlbnRhY2lvbmVzPigpO1xyXG59IiwiaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tEZXQgfSBmcm9tIFwiLi9NM1ByZFBhY2tEZXRcIjtcclxuaW1wb3J0IHsgTTNDb2RzWFBSRCB9IGZyb20gXCIuL00zQ29kc1hQUkQudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZFBhY2tSZWdsYXMgfSBmcm9tIFwiLi9NM1ByZFBhY2tSZWdsYXNcIjtcclxuZXhwb3J0IGNsYXNzIE0zUHJkR2VuZXJhbCB7XHJcbiAgICBTS1U6IHN0cmluZztcclxuICAgIExPVEU6IHN0cmluZztcclxuICAgIE5PTUJSRTE6IHN0cmluZztcclxuICAgIE5PTUJSRUxBUkdPOiBzdHJpbmc7XHJcbiAgICBBQ1QxQ1RCTDogc3RyaW5nO1xyXG4gICAgQUNUMkNUQkw6IHN0cmluZztcclxuICAgIENUQkxEUFJEOiBzdHJpbmc7XHJcbiAgICBDVEJMRElNUFBSRDogc3RyaW5nO1xyXG4gICAgU0tQMTogc3RyaW5nO1xyXG4gICAgU0tQMjogc3RyaW5nO1xyXG4gICAgU0tQMzogc3RyaW5nO1xyXG4gICAgU0tQNDogc3RyaW5nO1xyXG4gICAgU0tQNTogc3RyaW5nO1xyXG4gICAgRElTUE9OSUJMRTogbnVtYmVyO1xyXG4gICAgRElTUE9OSUJMRVJlZjogbnVtYmVyO1xyXG4gICAgTTNQQUNLOiBBcnJheTxNM1ByZFBhY2tEZXQ+ID0gbnVsbDtcclxuICAgIE0zUGFja1JlZ2xhczogQXJyYXk8TTNQcmRQYWNrUmVnbGFzPiA9IG51bGw7XHJcbiAgICBMb00zTGlzdGFQcmVjaW8gPSBuZXcgQXJyYXk8TTNQcmRMaXN0YT4oKTtcclxuICAgIExvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICBNM0NvZHMgPSBuZXcgQXJyYXk8TTNDb2RzWFBSRD4oKTtcclxuICAgIEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BSREltcHVlc3Rvcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJESW1wdWVzdG9zIHtcclxuICAgIENvZEltcDogc3RyaW5nO1xyXG4gICAgTWV0b2RvbG9naWE6IHN0cmluZztcclxuICAgIFZhbG9yOiBudW1iZXI7XHJcbn0iLCJpbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNQcmRBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zUHJkUGFja0J5VGlwbyB9IGZyb20gXCIuL20zLXBhY2stYnktdGlwb1wiO1xyXG5pbXBvcnQgeyBNM1BVbmlkTWVkaWRhIH0gZnJvbSBcIi4vbTNwLXVuaWQtbWVkaWRhXCI7XHJcbmltcG9ydCB7IE0zUHJkR3JwQXNvY2lhZG8gfSBmcm9tIFwiLi9NM1ByZEdycEFzb2NpYWRvXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZU0zUHJkR3JwIHtcclxuICAgIFNLUDE6IHN0cmluZztcclxuICAgIFJBVElORzogbnVtYmVyO1xyXG4gICAgRklDSEFURUNOSUNBOiBzdHJpbmc7XHJcbiAgICBNQVJDQTogc3RyaW5nO1xyXG4gICAgQ0xBU0lGSUNBQ0lPTjogc3RyaW5nO1xyXG4gICAgTk9NQlJFOiBzdHJpbmc7XHJcbiAgICBUSVBPOiBzdHJpbmc7XHJcbiAgICBDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgQ2FtcG9zQWRpY2lvbmFsZXM6IHN0cmluZztcclxuICAgIExvTTNQcmRHZW5lcmFsID0gbmV3IEFycmF5PE0zUHJkR2VuZXJhbD4oKTtcclxuICAgIExvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBBcnJheTxNM1ByZEFkaWNpb25hbGVzPigpO1xyXG4gICAgTTNQQUNLQllUSVBPID0gbmV3IEFycmF5PE0zUHJkUGFja0J5VGlwbz4oKTtcclxuICAgIE0zUHJkR3JwQXNvY2lhZG86QXJyYXk8TTNQcmRHcnBBc29jaWFkbz4gPSBudWxsO1xyXG5cclxuICAgIGxpc3RJbWFnZW5lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICBJbXB1ZXN0b3MgPSBuZXcgQXJyYXk8VHlwZUltcHVlc3Rvc1BSRD4oKTtcclxuICAgIE0zUFVuaWRNZWRpZGE6IE0zUFVuaWRNZWRpZGE7XHJcblxyXG4gICAgZW5jb250cmFkb0xvY2FsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVHlwZUltcHVlc3Rvc1BSRCB7XHJcbiAgICBDb2RJbXA6IHN0cmluZztcclxuICAgIE1ldG9kb2xvZ2lhOiBzdHJpbmc7XHJcbiAgICBWYWxvcjogc3RyaW5nXHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQSW1wdWVzdG9ze1xyXG4gICAgcHVibGljIFBvcmNlbnRhamU6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBMaW1pdGVPcHVlc3RvOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb2RJbXB1ZXN0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgQmFzZTpudW1iZXI7XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIE0zUERldGFsbGVJdGVtcyB7XHJcbiAgICBwdWJsaWMgTm9tYnJlQ29uY2VwdG86IHN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQSXRlbXNXRUIge1xyXG4gICAgcHVibGljIGRDYW50aWRhZDogbnVtYmVyO1xyXG4gICAgcHVibGljIGRQcmVjaW9Ub3RhbDogbnVtYmVyO1xyXG4gICAgcHVibGljIEJpc1Byb2R1Y3RvUHJvbW86IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBCaXNPYnNlcXVpbzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRTUlY6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ2xhdmVQcmRVbmlkYWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgSWRQcm9jZXNvOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIG9ic2VydmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBTdWJFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBFc3RhZG9fbzogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBQYXRoSW1hZ2VuOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBJREVuY1JlcGV0aWRvOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBJREVuY1Byb2Nlc2FkbzogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgSURFbmNQYWRyZTogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgVGlwb0FncnVwYWNpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgQ29kaWdvQmFycmFzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIENhbXBvc0FkaWNpb25hbGVzID0gW107XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BEZXRhbGxlQ3Vwb24ge1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZztcclxuICAgIHB1YmxpYyBDYW50aWRhZDogbnVtYmVyO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBNM1BEaW5hbWljYXMge1xyXG4gICAgcHVibGljIFZhbG9yOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgTTNQRGluYW1CeUFjdGl2aWRhZCB9IGZyb20gXCIuL20zLXBkaW5hbS1ieS1hY3RpdmlkYWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1BFbmNGUCB7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyO1xyXG4gICAgcHVibGljIERlc2NyaXBjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG86c3RyaW5nO1xyXG4gICAgcHVibGljIElkVGlwb1BhZ286bnVtYmVyOyAvLzE6IEVmZWN0aXZvIDI6IFRhcmpldGEgZGUgY3LDg8KpZGl0byAzOiBUYXJqZXRhIERlYml0byA0OiBQU0VcclxuICAgIHB1YmxpYyBJRDpudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsQ2FtYmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBWYWxPdHJhQ2xhc2k6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxuXHJcblxyXG4gICAgLy9WYXJpYWJsZXMgU29sb0Zyb250XHJcbiAgICBwdWJsaWMgQVBMQ2FtYmlvOnN0cmluZztcclxuICAgIHB1YmxpYyBBUExGaWRlbGl6YWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIGRlamFyX2JvcnJhcjpib29sZWFuID0gdHJ1ZTtcclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEltcHVlc3RvcyB9IGZyb20gXCIuL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM1BFbnZpb3MgfSBmcm9tIFwiLi9tMy1wLWVudmlvc1wiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVuY0l0ZW1zIHtcclxuICAgIHB1YmxpYyBJZFByb2R1Y3RvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgTG90ZTogc3RyaW5nO1xyXG4gICAgcHVibGljIElEOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgT3JkZW46IG51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6IHN0cmluZztcclxuICAgIHB1YmxpYyBDb2RpZ29CYXJyYXM6IHN0cmluZztcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBESVNQT05JQkxFOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIFBhdGhJbWFnZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNERVQgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUl0ZW1zPigpOyAgICBcclxuICAgIHB1YmxpYyBNM0RldEN1cG9uZXMgPSBuZXcgQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG4gICAgcHVibGljIE0zUEltcHVlc3RvcyA9IG5ldyBBcnJheTxNM1BJbXB1ZXN0b3M+KCk7XHJcbiAgICBwdWJsaWMgTTNQRGluYW1CeUFjdGl2aWRhZCA9IG5ldyBBcnJheTxNM1BEaW5hbUJ5QWN0aXZpZGFkPigpO1xyXG5cclxuICAgIC8vRXN0YXMgcHJvcGllZGFkZXMgbm8gc29uIHJlcGxpY2EgYSBiYXNlIGRlIGRhdG9zLCBzb24gcGFyYSB1c28gaW50ZXJuby5cclxuICAgIHB1YmxpYyBQcm9tb0NvbWJpbmFkYXMgPSBuZXcgQXJyYXk8UHJvbW9jaW9uQ29tYmluYWRhPigpO1xyXG5cclxuICAgIHB1YmxpYyBJZEVuY1BhZHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvQWdydXBhY2lvbjpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWFcclxuICAgIHB1YmxpYyBHZXRQcmljZVVuaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGVsIHByZWNpbyB1bml0YXJpYSwgY29uIGRlc2N1ZW50b3MgaW5jbHVpZG9zXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VVbml0TmV0bygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdW5pdGFyaWEsIGNvbiBkZXNjdWVudG9zIGluY2x1aWRvc1xyXG4gICAgcHVibGljIFNldFByaWNlVW5pdE5ldG8oaVZhbG9yKSB7XHJcbiAgICAgICAgdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBpVmFsb3I7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBlbCBwcmVjaW8gdG90YWwuXHJcbiAgICBwdWJsaWMgR2V0UHJpY2VUb3RhbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUEVudmlvc3tcclxuICAgIHB1YmxpYyBJZEVudmlvOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZEZvcm1hRW52aW86bnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZUZFbnZpbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGlyZWNjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBQYWlzOnN0cmluZztcclxuICAgIHB1YmxpYyBDaXVkYWQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zUERpbmFtQnlBY3RpdmlkYWQgPSBuZXcgQXJyYXk8TTNQRGluYW1CeUFjdGl2aWRhZD4oKTtcclxufSIsImV4cG9ydCBjbGFzcyBNM0ZUcmFiYWpve1xyXG4gICAgcHVibGljIElkSHViOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWM6bnVtYmVyO1xyXG4gICAgcHVibGljIElkSHViUHJlOm51bWJlcjtcclxuICAgIHB1YmxpYyBJZFViaWNQcmU6bnVtYmVyO1xyXG59IiwiaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi9tMy1wZW5jLWl0ZW1zXCI7XHJcbmltcG9ydCB7IE0zUEVuY0ZQIH0gZnJvbSBcIi4vbTMtcGVuYy1mcFwiO1xyXG5pbXBvcnQgeyBNM1BEaW5hbWljYXMgfSBmcm9tIFwiLi9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSBcIi4vbTMtcHJvbS1jb21iXCI7XHJcbmltcG9ydCB7IE0zRlRyYWJham8gfSBmcm9tIFwiLi9tMy1mLXRyYWJham9cIjtcclxuaW1wb3J0IHsgTTNQRW52aW9zIH0gZnJvbSBcIi4vbTMtcC1lbnZpb3NcIjtcclxuaW1wb3J0IHsgTTNQUmVjZXBjaW9uIH0gZnJvbSBcIi4vbTMtcHJlY2VwY2lvblwiO1xyXG5pbXBvcnQgeyBQcm9tb2Npb25Db21iaW5hZGEgfSBmcm9tIFwiLi4vUHJvbW9jaW9uZXMvTW9kZWxzL00zUHJvbW9Qcm9jZXNhZGEuY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQZXJYUHJvY2VzbyB9IGZyb20gXCIuL20zLXBlci14LXByb2Nlc29cIjtcclxuaW1wb3J0IHsgTTNSZWdpc3Ryb1RyeCB9IGZyb20gXCIuL20zLXJlZy10cnhcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuL20zLW90LWNsYXNpZmljYWNpb25lc1wiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvcyB7XHJcbiAgICBwdWJsaWMgSWRNMzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRmVjaGE6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9UZXJjZXJvOm51bWJlcjtcclxuICAgIHB1YmxpYyBURG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBORG9jOnN0cmluZztcclxuICAgIHB1YmxpYyBVYmljMTpudW1iZXI7XHJcbiAgICBwdWJsaWMgVWJpYzI6bnVtYmVyO1xyXG4gICAgcHVibGljIFZhbG9yTmV0bzpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgVmFsb3I6bnVtYmVyID0wO1xyXG4gICAgcHVibGljIFZhbE90cmFDbGFzaTpudW1iZXIgPTA7XHJcbiAgICBwdWJsaWMgU3ViRXN0YWRvRGVzOnN0cmluZztcclxuICAgIHB1YmxpYyBFc3RhZG9EZXM6c3RyaW5nO1xyXG4gICAgcHVibGljIFN1YkVzdGFkb0FudDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRXN0YWRvQW50OnN0cmluZztcclxuICAgIHB1YmxpYyBUTUlkUHJvY2VzbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSUREaWFyaW86c3RyaW5nO1xyXG4gICAgcHVibGljIElERGlhcmlvQ2llcnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBJREh1YjpudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1RSWDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICBwdWJsaWMgTTNPdENsYXNpZmljYWNpb25lcyA9IG5ldyBBcnJheTxNM090Q2xhc2lmaWNhY2lvbmVzPigpO1xyXG4gICAgcHVibGljIGxNM1BEaW5hbWljYXMgPSBuZXcgQXJyYXk8TTNQRGluYW1pY2FzPigpO1xyXG4gICAgcHVibGljIE0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgIHB1YmxpYyBsTTNQRW5jRlAgPSBuZXcgQXJyYXk8TTNQRW5jRlA+KCk7XHJcbiAgICBwdWJsaWMgTTNGVHJhYmFqbyA9IG5ldyBNM0ZUcmFiYWpvKCk7XHJcbiAgICBwdWJsaWMgTTNQRW52aW9zID0gbmV3IEFycmF5PE0zUEVudmlvcz4oKTtcclxuICAgIHB1YmxpYyBNM1BSZWNlcGNpb24gPSBuZXcgQXJyYXk8TTNQUmVjZXBjaW9uPigpO1xyXG4gICAgcHVibGljIGxNM1JlZ2lzdHJvVHJ4ID0gbmV3IEFycmF5PE0zUmVnaXN0cm9Ucng+KCk7XHJcbiAgICBwdWJsaWMgZXNwZXJhOiBib29sZWFuO1xyXG4gICAgcHVibGljIGZlY2hhSG9yYTogRGF0ZTtcclxuICAgIFxyXG4gICAgcHVibGljIEZlY2hhSG9yYUVzdGFkbzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSWRFc3RhZG86c3RyaW5nO1xyXG5cclxuXHJcbiAgICAvL0VzdGFzIHByb3BpZWRhZGVzIG5vIHNvbiByZXBsaWNhIGEgYmFzZSBkZSBkYXRvcywgc29uIHBhcmEgdXNvIGludGVybm8uXHJcbiAgICAvL3B1YmxpYyBsTTNQcm9tQ29tYmluYWRhID0gbmV3IEFycmF5PE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvPigpO1xyXG5cclxuICAgIHB1YmxpYyBQcm9tb3NDb21iaW5hZGFzID0gbmV3IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4oKTtcclxuXHJcbiAgICBwdWJsaWMgQXBsUGFnb0VuTGluZWE6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBBcGxEZXNkZVNlcnZlcjpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIG5kb2NVQWN0aXZvOnN0cmluZzsgLy9KQUdNIDIwMTkxMDE3IE51ZXZvcyBwYXJhbWV0cm9zLHBhcmEgbGxldmFyIGVsIHJlZ2lzdHJvIGRlbCB1c3VhcmlvIGFjdGl2bywgcXVlIGNyZW8gZXN0ZSBwcm9jZXNvXHJcbiAgICBwdWJsaWMgdGRvY1VBY3Rpdm86c3RyaW5nOy8vSkFHTSAyMDE5MTAxNyBOdWV2b3MgcGFyYW1ldHJvcyxwYXJhIGxsZXZhciBlbCByZWdpc3RybyBkZWwgdXN1YXJpbyBhY3Rpdm8sIHF1ZSBjcmVvIGVzdGUgcHJvY2Vzb1xyXG4gICAgLy9wdWJsaWMgYkFQTENvbWJpbmFkYXNBY3VtOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuRmVjaGEgPW1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBNM1BEaW5hbUJ5QWN0aXZpZGFkIH0gZnJvbSBcIi4vbTMtcGRpbmFtLWJ5LWFjdGl2aWRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUFJlY2VwY2lvbntcclxuICAgIHB1YmxpYyBJZFJlY2VwY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRFbmM6bnVtYmVyO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBGZWNoYTpEYXRlOyAgICBcclxuICAgIHB1YmxpYyBNM1BEaW5hbUJ5QWN0aXZpZGFkID0gbmV3IEFycmF5PE0zUERpbmFtQnlBY3RpdmlkYWQ+KCk7XHJcbiAgICBwdWJsaWMgRXN0YWRvOiBzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgTTNQZXJYUHJvY2Vzb3tcclxuICAgIHB1YmxpYyBUaXBvUGVyc29uYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGRvYzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTmRvYzpzdHJpbmc7ICAgIFxyXG4gICAgcHVibGljIE5vbWJyZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgRGVzY1RpcG9QOnN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgIE0zT3RDbGFzaWZpY2FjaW9uZXN7XHJcbiAgICBwdWJsaWMgSUQ6bnVtYmVyO1xyXG4gICAgcHVibGljIElkUHJvZHVjdG86c3RyaW5nO1xyXG4gICAgcHVibGljIFZhbG9yOm51bWJlcjtcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOm51bWJlcjtcclxuICAgIHB1YmxpYyBPcmRlbjpudW1iZXI7Ly9WYXJpYWJsZSBkZSBvcmRlbmFtaWVudG8gZW4gZWwgZnJvbnRcclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VNM0ZFIHtcclxuXHJcbiAgICBwdWJsaWMgYWRkX3Byb2Nlc29fZ2VuZXJhckZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zRkUvYWRkX3Byb2Nlc29fZ2VuZXJhckZFL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvX2dlbmVyYXJOQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM0ZFL2FkZF9wcm9jZXNvX2dlbmVyYXJOQy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBhZGRQcm9jZXNvR2VuZXJhckZFQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQganNvbjtcclxuICAgICAgICBsZXQgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9hZGRfcHJvY2Vzb19nZW5lcmFyRkUvXCIgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoe1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJDYXJ0YVBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZG0zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJDYXJ0YVBvcnRlL1wiICsgc0lES2F0aW9zICsgXCIvXCIgKyBpZG0zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJGRUFudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBqRGF0YTogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsRkVNWChcIkZFTVgvZ2VuZXJhckZFQW50aWNpcG9zL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXJOQ0FudGljaXBvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbEZFTVgoXCJGRU1YL2dlbmVyYXJOQ0FudGljaXBvcy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuXHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmVuUHJvY2VzbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEluZm9GYWN0dXJhRWxlY3Ryb25pY2EoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogaWRfa2F0aW9zLnRyaW0oKSB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zRkUvZ2V0SW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSW5mbylcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRIdG1sRnJvbUZFKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGlkTTM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZXNwO1xyXG4gICAgICAgIGxldCBkYXRhID0geyAnaWRNMyc6IGlkTTMgfTtcclxuICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM0ZFL2dldEh0bWxGcm9tRkUvJyArIGlkS2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBJVV9JbmZvRmFjdHVyYUVsZWN0cm9uaWNhKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRmFjdHVyYTogYW55LCB1VEFjdGl2bzogc3RyaW5nLCB1TkFjdGl2bzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IGlkX2thdGlvcy50cmltKCksICdvRmFjdHVyYSc6IG9GYWN0dXJhLCAndVRBY3Rpdm8nOiB1VEFjdGl2bywgJ3VOQWN0aXZvJzogdU5BY3Rpdm8gfTtcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zRkUvSVVfSW5mb0ZhY3R1cmFFbGVjdHJvbmljYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsSW5zU2VyaWVzeFViaWMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNGRS9kZWxJbnNTZXJpZXN4VWJpYy9cIiArIHNJREthdGlvcywgakRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy92YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTsgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyW1wiX2JvZHlcIl0pLk1lc3NhZ2UpLlJFU1BVRVNUQVtcIjBcIl0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNQcm9jZXNvU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIGFkZF9wcm9jZXNvRUEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgakRhdGE6IGFueSwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiUHJvY2Vzb3NNMy9hZGRfcHJvY2Vzb0VBL1wiICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBvSnNvbiA9IEpTT04ucGFyc2UocmVzcC5qc29uKCkpO1xyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMuZW5Qcm9jZXNvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5qc29uKCkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBNM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnUHJvY2Vzb3NNMy9NM0dldF9Qcm9jZXNvc1BvckNhbnRpZGFkLycgKyBzSURLYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIG9sUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3MgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9sUHJvY2Vzb3MuUkVTUFVFU1RBLlRQLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCA9IG5ldyBBcnJheShvbFByb2Nlc29zLlJFU1BVRVNUQS5UUCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vT2J0ZW5lciBsYSBsaXN0YSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhLCB1biBhcnJheSBkZSBmaWx0cm9zLlxyXG4gICAgcHVibGljIE0zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0X0FjdGl2aWRhZGVzWVByb2Nlc29zLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zO1xyXG4gICAgICAgICAgICBvbFByb2Nlc29zID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgICAgICAgLy9TaSBsYXMgYWN0aXZpZGFkZXMgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIGlmIChvbFByb2Nlc29zLlJFU1BVRVNUQS5BQ1RJVklEQURFUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMgPSBuZXcgQXJyYXkob2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL1NpIGxvcyBwcm9jZXNvcyBubyB2aWVuZW4gY29tbyB1biBhcnJheSwgY29udmVydGlybG9cclxuICAgICAgICAgICAgb2xQcm9jZXNvcy5SRVNQVUVTVEEuQUNUSVZJREFERVMuZm9yRWFjaChBY3RpdmlkYWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjdGl2aWRhZC5QUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIEFjdGl2aWRhZC5QUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIEFjdGl2aWRhZC5QUk9DRVNPUyA9IG5ldyBBcnJheShBY3RpdmlkYWQuUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgbGlzdGEgZGUgcHJvZHVjdG8sIHRlbmllbmRvIGVuIGN1ZW50YSwgdW4gYXJyYXkgZGUgZmlsdHJvcy5cclxuICAgIHB1YmxpYyBNM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIHNJZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldF9NM1Byb2Nlc29zQnlJZFByb2Nlc28vJyArIHNJREthdGlvcyArICcvJyArIHNJZFByb2Nlc28sIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvbFByb2Nlc29zTTM7XHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGFzIGFjdGl2aWRhZGVzIG5vIHZpZW5lbiBjb21vIHVuIGFycmF5LCBjb252ZXJ0aXJsb1xyXG4gICAgICAgICAgICBpZiAob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBvbFByb2Nlc29zTTMuUkVTUFVFU1RBLlNVQkVTVEFET1MgPSBuZXcgQXJyYXkob2xQcm9jZXNvc00zLlJFU1BVRVNUQS5TVUJFU1RBRE9TKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9TaSBsb3MgcHJvY2Vzb3Mgbm8gdmllbmVuIGNvbW8gdW4gYXJyYXksIGNvbnZlcnRpcmxvXHJcbiAgICAgICAgICAgIG9sUHJvY2Vzb3NNMy5SRVNQVUVTVEEuU1VCRVNUQURPUy5mb3JFYWNoKHN1YnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YnMuTTNQUk9DRVNPUyAhPT0gdW5kZWZpbmVkICYmIHN1YnMuTTNQUk9DRVNPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnMuTTNQUk9DRVNPUyA9IG5ldyBBcnJheShzdWJzLk0zUFJPQ0VTT1MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob2xQcm9jZXNvc00zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgTTNwcm9jZXNvcywgZGVzZGUgZWwgaWRkaWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TTNQcm9jZXNvc0J5SWREaWFyaW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZERpYXJpbzogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZERpYXJpb1wiOiBzSWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgb00zUHJvY2VzbztcclxuICAgICAgICBvTTNQcm9jZXNvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldE0zUHJvY2Vzb3NCeUlkRGlhcmlvLycgKyBzSURLYXRpb3MsIG9EYXRhKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGluZm9ybWFjaW9uIGRlIE0zcHJvY2Vzb3MsIFRlbmllbmRvIGVsIElETTMuICAgIFxyXG4gICAgcHVibGljIE0zR2V0X00zUHJvY2Vzb3NCeUlkTTMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJRE0zOiBzdHJpbmcsIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIHViaWNFeHRlcm5vID0gZmFsc2UsIGJBUExQYWdvc1BEID0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgdmFyIG9EYXRhO1xyXG4gICAgICAgIG9EYXRhID0geyBcIklkTTNcIjogc0lETTMsIFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28gfTtcclxuICAgICAgICBpZiAoYkFQTFBhZ29zUEQpIHtcclxuICAgICAgICAgICAgb0RhdGEuYkFQTFBhZ29zUEQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL0dldFByb2Nlc29NM0J5SWRNMy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgLy9WYWxpZGFyIHF1ZSBsYSB1YmljYWNpb24gYWN0dWFsZXMgdmFsaWRhIHBhcmEgZWwgcHJvY2Vzb1xyXG4gICAgICAgICAgICAvL3BjYXN0cm8sIHNlIGNvbWVudGFyZWEgcG9ycXVlIG5vIGZ1bmNpb25hIGNvbiB0ZiwgcmV0b3JuYSBwYXJhIFRGIFNJRU1QUkUgTlVMTCwgbm8gc2UgbWFuZWphIHViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIC8vU2UgY29sb2NhIGRpZiBhIDAsIHBvciB2ZXJzaW9uIFRGLCBxdWUgbm8gdXRpbGl6YSBmdW5jaW9uYWxpZGFkIGRlIFViaWNhY2lvbmVzXHJcbiAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZS50b1N0cmluZygpICE9IFwiMFwiICYmIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlLnRvU3RyaW5nKCkgIT0gc1ViaWNhY2lvbi50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXViaWNFeHRlcm5vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b21hIGVsIHByb2Nlc28gcXVlIHRpZW5lIHBvciBkaW5hbWljYSBfSURNM1JldG9tYWRvIGVsIGlkbTMgZW52YWlkbyBwb3IgcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lETTM6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJpZE0zUmV0b21hZG9cIjogc0lETTMgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL2dldE0zUHJvY2Vzb3NCeUlkTTNSZXRvbWFkby8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkIE0zIHkgSWRwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gc0lETTMgXHJcbiAgICAgKiBAcGFyYW0gc0lkUHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBzVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgTTNHZXRfTTNQcm9jZXNvc0J5SWRNM0FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSURNMzogc3RyaW5nLFxyXG4gICAgICAgIHNJZFByb2Nlc286IHN0cmluZywgc1ViaWNhY2lvbjogc3RyaW5nLCBiQVBMUGFnb3NQRDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YTtcclxuICAgICAgICBvRGF0YSA9IHsgXCJJZE0zXCI6IHNJRE0zLCBcIklkUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH07XHJcbiAgICAgICAgdmFyIHJlc3A7XHJcbiAgICAgICAgaWYgKGJBUExQYWdvc1BEKSB7XHJcbiAgICAgICAgICAgIG9EYXRhLmJBUExQYWdvc1BEID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9HZXRQcm9jZXNvTTNCeUlkTTMvJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgcHJvY2VzbyBNMywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkRGlhcmlvXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBzSURLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gaWREaWFyaW8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtM19nZXRQcm9jZXNvTTNCeUlkRGlhcmlvQXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGlkRGlhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RhdGE7XHJcbiAgICAgICAgb0RhdGEgPSB7IFwiaWREaWFyaW9cIjogaWREaWFyaW8gfTtcclxuICAgICAgICB2YXIgcmVzcDogYW55ID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldFByb2Nlc29NM0J5SWREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIGVzdHVyY3R1cmFzIGRlIGxhcyBjYXB0dXJhcyBkaW5hbWljYXMgYXNvY2lhZGFzIGF1biBwcm9jZW9zIHkgdW4gaWRwcm9jZXNvXHJcbiAgICBwdWJsaWMgbTNfZ2V0X2RhdGFfY2FwdF9kaW5hbShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy8vb0RhdGEgPSB7XCJpZF9wcm9jZXNvXCI6XCJcIixcImlkX3N1Yl9wcm9jZXNvXCI6XCJcIn07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL20zX2dldF9kYXRhX2NhcHRfZGluYW0vJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIFJldG9ybmEgZWwgUlBUZW1wbGF0ZSBwYXJhIGVsIGFybWFkbyBkZWwgUmVwb3J0ZVxyXG4gICAgLy8gICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAvLyAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgLy8gICogQHBhcmFtIGlkX3JlcCBcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHVibGljIGFzeW5jIGdldF90ZW1wbGF0ZV9yZXBvcnRlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9yZXA6IHN0cmluZykge1xyXG4gICAgLy8gICAgIHZhciBvRGF0YTtcclxuICAgIC8vICAgICB2YXIgcmVzcDtcclxuICAgIC8vICAgICB2YXIgb0pzb247XHJcbiAgICAvLyAgICAgb0RhdGEgPSB7IFwiaWRfcmVwXCI6IGlkX3JlcCB9O1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvZ2V0X3RlbXBsYXRlX3JlcG9ydGUvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgLy8gICAgICAgICBvSnNvbiA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvSnNvbjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgY2F0Y2h7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbG9zIHByb2Nlc29zIGFzb2NpYWRvcyBhIHVuYSBwZXJzb25hXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5UGVyc29uYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdQcm9jZXNvc00zL00zR2V0UHJvY2Vzb0J5UGVyc29uYS8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb0J5SWREaWFyaW9DaWVycmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnUHJvY2Vzb3NNMy9NM0dldFByb2Nlc29CeUlkRGlhcmlvQ2llcnJlLycgKyBpZF9rYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb2Nlc29zIE9mZiBsaW5lXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZF9rYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0RhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zR2V0UHJvY2Vzb3NPZmZMaW5lKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ1Byb2Nlc29zTTMvTTNHZXRQcm9jZXNvc09mZkxpbmUvJyArIGlkX2thdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9lbmEgZWwgVERldGFsbGVQcm9jZXNvIGRlIHVuIHByb2Nlc28gZGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9tM19kZXRhbGxlUHJvY2Vzb0J5UHJvY2Vzby8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKS5SRVNQVUVTVEEuRGV0YWxsZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RlbmNpYVByb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRLYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL3ZhbGlkYXJFeGlzdGVuY2lhUHJvY2Vzby8nICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Qcm9kdWN0bzogYW55ID0gSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgIHB1YmxpYyBQcmVjaW9Ub3RhbDogbnVtYmVyOyAvL1ByZWNpbyBpbmNsdXllbmRvIGxhcyBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIFByZWNpb1RvdGFsUHJvbW9jaW9uOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JUb3RhbE1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIExpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgIHB1YmxpYyBJRFByb21vY2lvbjogbnVtYmVyO1xyXG4gICAgcHVibGljIE5vbWJyZTtcclxuICAgIHB1YmxpYyBWYWxvcjtcclxuICAgIHB1YmxpYyBWYWxvclBvcmNlbnRhamUgPSAwO1xyXG4gICAgcHVibGljIExpc3RPYnNTS1UgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgcHVibGljIFByb21vY2lvbkNvbWJpbmFkYTogUHJvbW9jaW9uQ29tYmluYWRhID0gbnVsbDtcclxuICAgIHB1YmxpYyBWYWxvck1vbmVkZXJvOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIElkQ3Vwb246IHN0cmluZyA9IG51bGw7XHJcbiAgICBwdWJsaWMgUmVnbGE6IHN0cmluZztcclxuICAgIHB1YmxpYyBBcGxpY2FkYTogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBUaXBvOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgUmVnbGFPYnNlcTogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkT2JzZXE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBmbGFncyA9IHsgZm9ybWFQYWdvOiBmYWxzZSB9O1xyXG4gICAgcHVibGljIGxJZEFjdGl2YVByb21vOiBBcnJheTxudW1iZXI+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvbW9jaW9uQ29tYmluYWRhIHtcclxuICAgIHB1YmxpYyBJZFByb21vY2lvblhQcm9jZXNvOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb25Db21iaW5hZGE6IG51bWJlcjtcclxuICAgIHB1YmxpYyBUaXBvMjogc3RyaW5nO1xyXG4gICAgcHVibGljIE5vbWJyZTogc3RyaW5nO1xyXG4gICAgcHVibGljIEFjY2lvbjogYW55O1xyXG4gICAgLy9wdWJsaWMgSWRDb25kaWNpb246c3RyaW5nOyAvL0VzdG8gcGFyYSBhZ3J1cGFjaW9uIGRlIGxhIHByb21vY2lvbiBkZSBjb21iby5cclxufSIsImV4cG9ydCBjbGFzcyBNYXRoVEYge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByb3VuZChhOiBhbnksIGRlY2ltYWxzOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgbXVsdGlwbG9EZTEwID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgrYSAqIG11bHRpcGxvRGUxMCkgLyBtdWx0aXBsb0RlMTA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJvdW5kVjIoYTogYW55LCBkZWNpbWFsczogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKCsoTWF0aC5yb3VuZCgrKGEgKyAnZScgKyBkZWNpbWFscykpICsgJ2UnICsgLWRlY2ltYWxzKSkudG9GaXhlZChkZWNpbWFscykpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgdG9GaXhlZChudW1iZXIsIGRlY2ltYWxzKSB7XHJcbiAgICAgICAgdmFyIHggPSBNYXRoLnBvdygxMCwgTnVtYmVyKGRlY2ltYWxzKSArIDEpO1xyXG4gICAgICAgIHJldHVybiAoTnVtYmVyKG51bWJlcikgKyAoMSAvIHgpKS50b0ZpeGVkKGRlY2ltYWxzKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gJy4vTW9kZWxzL00zRU5DUFJPTU8uY2xhc3MnO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gJy4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGUnO1xyXG5pbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gJy4vTW9kZWxzL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzJztcclxuaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSAnLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlJztcclxuaW1wb3J0IHsgTTNERVRDT05ESVBST01PIH0gZnJvbSAnLi9Nb2RlbHMvTTNERVRDT05ESVBST01PLmNsYXNzJztcclxuaW1wb3J0IHsgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uQ29tYmluYWRhIH0gZnJvbSAnLi9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wcm9jZXNvcyc7XHJcbmltcG9ydCB7IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvbS1jb21iJztcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWl0ZW1zJztcclxuaW1wb3J0IHsgTTNQRW5jRlAgfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZW5jLWZwJztcclxuaW1wb3J0IHsgTTNQRGluYW1pY2FzIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRpbmFtaWNhcyc7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tICcuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUnO1xyXG5pbXBvcnQgeyBNM1BEZXRhbGxlSXRlbXMsIE0zUEl0ZW1zV0VCIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXMnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUHJkR2VuZXJhbCB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRHZW5lcmFsLnR5cGUnO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tICcuLi9NaXNjZWxhbmVhL01hdGhURi5jbGFzcyc7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tICcuLi9SZWdpc3Ryby9tMy1wZXIteC1wcm9jZXNvJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IE0zUmVnU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL20zLXJlZy1zZXJ2aWNlJztcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gJy4uL01hZXN0cm8vTTNQcmRMaXN0YS50eXBlJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbmV4cG9ydCBjbGFzcyBwcm9tb2Npb25lc1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHB1YmxpYyBnb0RhdGFVc2VyOiBhbnk7XHJcbiAgICBwdWJsaWMgZ29EYXRhQWRpY2lvbmFsOiBNM1BJdGVtc1dFQjtcclxuICAgIHB1YmxpYyBnb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9EYXRhVXNlcjogYW55LCBvRGF0YUFkaWNpb25hbDogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0aGlzLmdvRGF0YVVzZXIgPSBvRGF0YVVzZXI7XHJcbiAgICAgICAgdGhpcy5nb0RhdGFBZGljaW9uYWwgPSBvRGF0YUFkaWNpb25hbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlcmF0b3JzID0ge1xyXG4gICAgICAgICc8JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPCBiIH0sXHJcbiAgICAgICAgJz4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA+IGIgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA8PSBiIH0sXHJcbiAgICAgICAgJz49JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPj0gYiB9LFxyXG4gICAgICAgICdJR1VBTCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhID09IGIgfSxcclxuICAgICAgICAnRElGRic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICE9IGIgfSxcclxuICAgICAgICAnRU4nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PT0gYiB9LFxyXG4gICAgICAgICdBTkQnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiIH0sXHJcbiAgICAgICAgJ09SJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgfHwgYiB9LFxyXG4gICAgICAgICcqJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIHRydWUgfSxcclxuICAgICAgICAnTU9EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJSBiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBPYnRlbmVyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vVmVyaWZpY2FyIHByb21vY2lvbmVzLCBpbmdyZXNhbmRvIGNvbW8gcGFyYW1ldHJvIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIHZhbGlkYXIsIFViaWNhY2lvblxyXG4gICAgcHVibGljIFZlcmlmaWNhclByb21vY2lvbmVzKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgbFRpcG9zUHJvbW86IEFycmF5PGFueT4pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGFSZXNwcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGFQcm9tb2Npb25lcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdmFyIGhveSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5nb00zRU5DUFJPTU8gPSBvTTNFTkNQUk9NTztcclxuICAgICAgICBpZiAob00zRU5DUFJPTU8pIHtcclxuICAgICAgICAgICAgb00zRU5DUFJPTU8uZmlsdGVyKHggPT4gbFRpcG9zUHJvbW8uZmluZChwcm9tbyA9PiB4LlRpcG8gPT0gcHJvbW8pKS5mb3JFYWNoKGVuY2FiZXphZG9Qcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZFZpZ2VuY2lhID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLlZpZ2VuY2lhKTtcclxuICAgICAgICAgICAgICAgIHZhciBkSW5pY2lvID0gbmV3IERhdGUoZW5jYWJlemFkb1Byb21vLkluaWNpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9KQUdNIDIwMTkxMDIzLCBzZSBxdWl0YSBUaXBvIE1hbnVhbCwgeSBzZSBkZWphIGVsIG51ZXZvIHBhcmFtZXRyby5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXJFc3RhZG9zRW5jUHJvbW8oZW5jYWJlemFkb1Byb21vKSAmJiAoZW5jYWJlemFkb1Byb21vLkVzdGFkbyAmJiBkVmlnZW5jaWEgPj0gaG95ICYmIGRJbmljaW8gPD0gaG95KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8gVmFsaWRhY2lvbjogMS4gU2kgZXMgZGlmZXJlbnRlIGEgTWFudWFsLCBubyB2YWxpZGEgVmFyaWFibGUgZXN0YWRvcyBtYW51YWxlcy4gRGUgbG8gY29udHJhcmlvIGxvIHZhbGlkYS4gLS0tIDIuIFNpIGVsIGVzdGFkbyBlbCBlc3RhZG8gZXMgdmVyZGFkZXJvIHkgbGEgdmlnZW5jaWEgZXMgbWF5b3IgbyBpZ3VhbCBhIGxhIGZlY2hhIGRlbCBtb21lbnRvXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT04uZm9yRWFjaChhZ3J1cGFjaW9uID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckFncnVwYWNpb25Qcm9tbyhvTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycCwgb00zVWJpY2FjaW9uLCBhZ3J1cGFjaW9uLCBlbmNhYmV6YWRvUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFSZXNwcy5wdXNoKGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2V0SlJlc3BGcm9tQXJyYXkoYVJlc3BzLCBlbmNhYmV6YWRvUHJvbW8uVGlwbywgZW5jYWJlemFkb1Byb21vLlRpcG8yKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhY2lvbiBkZSBhY2Npb24sIHNpIGV4aXN0ZSwgc2lubyBleGlzdGUgc2UgYWdyZWdhIGRlbCBwYXBhLiBTZSBlbnZpYSBjb21vIHJlZmVyZW5jaWEganJlc3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBlbmNhYmV6YWRvUHJvbW8uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihlbmNhYmV6YWRvUHJvbW8sIGpSZXNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYVByb21vY2lvbmVzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gYVByb21vY2lvbmVzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckVzdGFkb3NFbmNQcm9tbyhlbmNhYmV6YWRvUHJvbW86IE0zRU5DUFJPTU8pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZXN0YWRvID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc01hbnVhbCAmJiAhZW5jYWJlemFkb1Byb21vLkVzdGFkb01hbnVhbGVzKSB7XHJcbiAgICAgICAgICAgIGVzdGFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuY2FiZXphZG9Qcm9tby5Fc0FwbEN1cG9uICYmICFlbmNhYmV6YWRvUHJvbW8uRXN0YWRvQXBsQ3Vwb24pIHtcclxuICAgICAgICAgICAgZXN0YWRvID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXN0YWRvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGFncnVwYWNpb24gZGUgcHJvbW9jaW9uZXMsIGluZ3Jlc2FuZG8gY29tbyBwYXJhbWV0cm8gbGEgaW5mb3JtYWNpb24gZGVsIHByb2R1Y3RvIGEgdmFsaWRhciwgVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQWdydXBhY2lvblByb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGFncnVwYWNpb246IE0zQ09ORElBR1JVUEFDSU9OLCBvTTNFbmNQcm9tbzogTTNFTkNQUk9NTykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICB2YXIgYVJlc3BzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaWNpb246IE0zQ09ORElQUk9NTztcclxuICAgICAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICAgICAgY29uZGljaW9uID0gYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9baV07XHJcbiAgICAgICAgICAgIGpBZGljaW9uYWxlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmICghakFkaWNpb25hbGVzLlJPT1QuQUNUSVZJREFEIHx8IGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCA9PSBcIlJFR0lTVFJPXCIpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG9NM0VuY1Byb21vLlRpcG8gPT0gXCJDT01CSU5BREFcIiAmJiBvTTNFbmNQcm9tby5UaXBvMiA9PSBcIkNPTUJPXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uICYmIGFncnVwYWNpb24uT3BlcmFkb3IudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJPUlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BzLnB1c2goalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZ3J1cGFjaW9uLk9wZXJhZG9yLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQU5EXCIgJiYgIWpSZXNwLkFQTENvbmRpY2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vTGEgY29uZGljaW9uIE5PIHNlIGN1bXBsZVxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWdydXBhY2lvbi5PcGVyYWRvci50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIk9SXCIgJiYgalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MYSBjb25kaWNpb24gc2UgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGRlYmUgZ3VhcmRhciBsYSBpbmZvcm1hY2nDg8Kzbi4gU2kgc2llbXByZSBmdWVyb24gT1IgeSBGQUxTRSwgc2UgZGViZSBjb21wYXJhciBjb21vIHVuIEFORC5cclxuICAgICAgICAgICAgICAgICAgICBhUmVzcHMucHVzaChqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRKUmVzcEZyb21BcnJheShhUmVzcHMsIG9NM0VuY1Byb21vLlRpcG8sIG9NM0VuY1Byb21vLlRpcG8yKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbmRpY2lvbiBkZSBwcm9tb2Npb25lcy5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25lc1Byb21vKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PKSB7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWVzO1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqQWRpY2lvbmFlcyA9IEpTT04ucGFyc2UoY29uZGljaW9uLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckNvbmRpY2lvbkNvbnRyYURhdGEob00zUHJvY2Vzb3MsIG9UeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbiwgY29uZGljaW9uLCBqQWRpY2lvbmFlcyk7XHJcbiAgICAgICAgdGhpcy5WYWxpZGFyQWNjaW9uKGpSZXNwLCBjb25kaWNpb24uSkFkaWNpb25hbGVzKTtcclxuICAgICAgICB0aGlzLkFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uKTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGEganNvbiBkZSByZXNwdWVzdGEgc2kgc2UgZ2VuZXJvIE9LIGxhIGluZm9ybWFjaW9uIGRlIGxhIGNvbmRpY2lvblxyXG4gICAgICogQHBhcmFtIGpSZXNwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJDb25kaWNpb25PSyhqUmVzcCwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8pIHtcclxuICAgICAgICBpZiAoalJlc3AuQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLklEQ29uZGljaW9uID0gY29uZGljaW9uLklkQ29uZGljaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WZXJpZmljYSBjb25kaWNpb24sIGNvbnRyYSBkYXRhIGluZ3Jlc2FkYS5cclxuICAgIHB1YmxpYyBWZXJpZmljYXJDb25kaWNpb25Db250cmFEYXRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpOiBhbnkge1xyXG4gICAgICAgIHZhciBvYmplY3RGaW5kZWQ7XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuRXN0KSB7XHJcbiAgICAgICAgICAgICAgICAvL1ZhIGEgZXN0cnVjdHVyYSBkZSBwcm9kdWN0byBhZGljaW9uYWxcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJMb00zUHJkQWRpY2lvbmFsZXNcIjpcclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RGaW5kZWQgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaWMgPT4gYWRpYy5BVFJJQlVUTy50cmltKCkgPT0gY29uZGljaW9uLkNvbmNlcHRvLnRyaW0oKSAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oYWRpYy5WQUxPUi50cmltKCksIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKVxyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEZpbmRlZC5KQWRpY2lvbmFsZXMgPSBKU09OLnN0cmluZ2lmeShqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9iamVjdEZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUFJEVE9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvKG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0sIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUkRHUlBcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1Byb2R1Y3RvUFJER1JQKG9UeXBlTTNQcmRHcnAsIGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJNM0RFVENPTkRJUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FjaW9uTTNEZXRhbGxlQ29uZGljaW9uKG9NM1Byb2Nlc29zLCBvVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb24sIGNvbmRpY2lvbi5NM0RFVENPTkRJUFJPTU8sIGNvbmRpY2lvbi5Db25jZXB0bywgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJQUk9DRVNPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfUEFHT1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJQcm9jZXNvRm9ybWFQYWdvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24sIGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiSURfTElTVEFQXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLnZlcmlmaWNhclByb2Nlc29MaXN0YVByZWNpbyhvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YSwgY29uZGljaW9uLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlVTRVJcIjpcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESUNJT05BTFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbiwgakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIFwiQ0FSQUNURVJJU1RJQ0FTXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vRXN0YSBwcm9tb2Npw4PCs24gZXN0YSBkaXNlw4PCsWFkYSBwYXJhIHF1ZSBzZWEgcHJvY2VzYWRhIGFsIGZpbmFsIGRlIGxhIHRyYW5zYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGpSZXNwID0gdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9NM1Byb2Nlc29zLCBjb25kaWNpb24uTTNERVRDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIk5vIEVudHJvIHBvciBEZXRhbGxlIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRKUmVzcEZyb21BcnJheShhUmVzcHM6IEFycmF5PGFueT4sIHRpcG8sIHRpcG8yKSB7XHJcbiAgICAgICAgdmFyIGJBUExDb25kaWNpb247XHJcbiAgICAgICAgdmFyIGpSZXNwO1xyXG4gICAgICAgIGlmIChhUmVzcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvL0xMZWdhIGEgZXN0ZSBwdW50bywgcG9yIGFsZ3VuYSBkZSAyIHJhem9uZXM6IFxyXG4gICAgICAgICAgICAvLzEuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBPUiB5IHRvZG9zIHNvbiBGQUxTRVxyXG4gICAgICAgICAgICAvLzIuIExhIGNvbmRpY2nDg8KzbiBlcyB1biBBTkQgeSB0b2RvcyBzb24gVFJVRVxyXG4gICAgICAgICAgICBiQVBMQ29uZGljaW9uID0gYVJlc3BzLmZpbHRlcihyZXNwID0+IHJlc3AuQVBMQ29uZGljaW9uKTtcclxuICAgICAgICAgICAgaWYgKCFiQVBMQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aXBvID09IFwiQ09NQklOQURBXCIgJiYgdGlwbzIgPT0gXCJDT01CT1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFycmVnbG9Db25kaWNpb25lcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGJBUExDb25kaWNpb24uZm9yRWFjaChjb25kaWNpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uLklEQ29uZGljaW9uLmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb24uSURDb25kaWNpb24uZm9yRWFjaChpZENvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJlZ2xvQ29uZGljaW9uZXMuZmluZCh4ID0+IHggPT0gaWRDb24pKSBhcnJlZ2xvQ29uZGljaW9uZXMucHVzaChpZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyZWdsb0NvbmRpY2lvbmVzLmZpbmQoeCA9PiB4ID09IGNvbmRpY2lvbi5JRENvbmRpY2lvbikpIGFycmVnbG9Db25kaWNpb25lcy5wdXNoKGNvbmRpY2lvbi5JRENvbmRpY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBBUExDb25kaWNpb246IHRydWUsIEFjY2lvbjogbnVsbCwgSURDb25kaWNpb246IGFycmVnbG9Db25kaWNpb25lcyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFSZXNwVE1QID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmaWNhciBzaSBhbGd1bm8gZGUgbG9zIGFycmVnbG9zIHRpZW5lIGFjY2lvbiBkaWZlcmVudGUgYSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYVJlc3BUTVAgPSBhUmVzcHMuZmlsdGVyKHJlc3AgPT4gcmVzcC5BY2Npb24gIT0gbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFSZXNwVE1QLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc2FyIGVsIHVsdGltbyBpdGVtLCBxdWUgdGVuZ2EgbGEgYWNjacODwrNuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gYVJlc3BUTVBbYVJlc3BUTVAubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSBhUmVzcHNbYVJlc3BzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgbGEgcHJvbW8gZGVwZW5kZSBkZSBsYSBmb3JtYSBkZSBwYWdvIGHDg8KxYWRlIGVzdGEgaW5mb3JtYWNpw4PCs25cclxuICAgICAgICAgICAgaWYgKGFSZXNwcy5maW5kKHggPT4geC5Gb3JtYVBhZ28pKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcFtcIkZvcm1hUGFnb1wiXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLy9HZW5lcmFyIFJlc3B1ZXN0YSBkZSBjb25kaWNpb24uXHJcbiAgICBwdWJsaWMgR2VuZXJhclJlc3B1ZXN0YShiQVBMUHJvbW86IGJvb2xlYW4sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHZhciBqUmVzcDtcclxuICAgICAgICBqUmVzcCA9IHsgXCJBUExDb25kaWNpb25cIjogYkFQTFByb21vLCBcIkFjY2lvblwiOiBudWxsIH07XHJcbiAgICAgICAgaWYgKGpBZGljaW9uYWxlcyAhPSBudWxsICYmIGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGpSZXNwLkFjY2lvbiA9IGpBZGljaW9uYWxlcy5ST09ULkFjY2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyQ2xhc2lmaWNhY2lvbmVzUHJvY2VzbyhvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGxQcmVjaW9zOiBBcnJheTxhbnk+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciB2YWxvcmVzOiBBcnJheTxhbnk+ID0gY29tYmkuQWNjaW9uLlZhbG9yZXM7XHJcbiAgICAgICAgICAgIC8vdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IGxQcmVjaW9zLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGJFbnRybzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiAoYS5DYW50aWRhZCA8IGIuQ2FudGlkYWQpID8gMSA6ICgoYi5DYW50aWRhZCA8IGEuQ2FudGlkYWQpID8gLTEgOiAwKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkFwbGljYXJQcm9tb0J5VmFsb3Jlcyh2YWxvcmVzLCBsUHJlY2lvcywgbFByZWNpb3MubGVuZ3RoKTsvL0pBR00gMjAxOTA3MzEsIGZ1bmNpb24gcmVjdXJzaXZhIHBhcmEgY2FsY3VsYXIgbG9zIHByZWNpb3MgbnVldm9zLlxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBjbGFzaWZpY2FjaW9uZXMgcG9yIHByb2Nlc28uXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgUHJvY2Vzb3MgZGUgTTNcclxuICAgICAqIEBwYXJhbSBkZXRDb25kaWNpb25lcyBDb25kaWNpb25lcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIGpBZGljaW9uYWxlcyBKU09OIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBsUHJlY2lvczogQXJyYXk8YW55PiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBqUmVzcDogYW55ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JlczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5WYWxvcmVzO1xyXG4gICAgICAgICAgICB2YWxvcmVzID0gdmFsb3Jlcy5zb3J0KChhLCBiKSA9PiBhLkNhbnRpZGFkIC0gYi5DYW50aWRhZCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWxvclByb21vID0gaSA8IHZhbG9yZXMubGVuZ3RoID8gdmFsb3Jlc1tpXS5WYWxvciA6IDBcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9ICtsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSAoKCtsUHJlY2lvc1tpXS5QVU5JVE5FVE8pICogKCgrdmFsb3JQcm9tbykgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDAgJiYgbFByZWNpb3MuZmluZCh4ID0+IHguQXBsaWNhZG8gPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZmFsc2UsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBBcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlczogQXJyYXk8YW55PiwgbFByZWNpb3M6IEFycmF5PGFueT4sIHJlc2lkdW9FbnRyYW50ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGlDYW50aWRhZFJlYWw6IG51bWJlciA9IHJlc2lkdW9FbnRyYW50ZTsvLyBKQUdNIDIwMTkwNzMxIG51ZXZvIHBhcmFtZXRybyA9IGxQcmVjaW9zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWxvcmVzLmxlbmd0aDsgaSsrKSB7Ly9KQUdNIDIwMTkwNzMwIHNlIGFncmVnYSBmdW5jaW9uYWxpZGFkIHBhcmEgcXVlIHNlIHB1ZWRhIHRlbmVyIHZhcmlvcyB2YWxvcmVzLlxyXG4gICAgICAgICAgICB2YXIgaUNhbnRpZGFkUHJvbW86IG51bWJlciA9IHZhbG9yZXNbaV0uQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgIHZhciB2YWxvclByb21vOiBudW1iZXIgPSB2YWxvcmVzW2ldLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgICAgIHZhciBSZXNpZHVvOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlc2lkdW8gPSBpQ2FudGlkYWRSZWFsICUgaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUHJvbW9CeVZhbG9yZXModmFsb3JlcywgbFByZWNpb3MsIFJlc2lkdW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSArbFByZWNpb3MubGVuZ3RoIC0gK3Jlc2lkdW9FbnRyYW50ZTsgaSA8ICtsUHJlY2lvcy5sZW5ndGggLSArUmVzaWR1bzsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaV0uUFVOSVRORVRPID0gK2xQcmVjaW9zW2ldLlBVTklUTkVUTyAtICgoK2xQcmVjaW9zW2ldLlBVTklUTkVUTykgKiAoKCt2YWxvclByb21vKSAvIDEwMCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2ldLkFwbGljYWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFybWFyIG51ZXZvIGFycmVnbG8sIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBhcnJlZ2xvIGVudHJhbnRlLiBTZSByZWNvcnJlIGRlIGF0cmFzIGhhY2lhIGFkZWxhbnRlIHkgc2UgdmEgY3JlYW5kbyBlbCBudWV2byBhcnJlZ2xvXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gcmVzaWR1byBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFybWFyTnVldm9BcnJheURlc2RlUmVzaWR1byhsUHJlY2lvczogQXJyYXk8YW55PiwgcmVzaWR1bykge1xyXG4gICAgICAgIHZhciBsUHJlY2lvc1Jlc2lkdW8gPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbFByZWNpb3MubGVuZ3RoIC0gMTsgaSA+IHJlc2lkdW87IGktLSkge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NSZXNpZHVvLnB1c2gobFByZWNpb3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBcm1hck51ZXZvQXJyYXREZXNkZVJlc2lkdW9cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsUHJlY2lvc1Jlc2lkdW87XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcHJvbW9jaW9uZXMgcG9yIHByb2Nlc29zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGVsIE0zIHByb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgTTMgUHJvY2Vzb3MgT2JqZXRvLCBjb24gbGEgaW5mb3JtYWNpb24gZGUgdG9kb3MgbG9zIE0zUHJvY2Vzb3NcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gT2JqZXRvIGNvbiBpbmZvcm1hY2lvbiBkZSBjb25kaWNpb25cclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgSlNPTiBkZSBpbmZvcm1hY2lvbiBhZGljaW9uYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcmlmaWNhckluZm9Qcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9NM1Byb2Nlc29zW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIHByb2Nlc28gdGllbmUgdW5hIGZvcm1hIGRlIHBhZ28gcXVlIGN1bXBsYSBjb24gbGEgY29uZGljaW9uIGVudHJhbnRlLCBoYWNlIHVuICBwYXNzIHRydWUsIGxhIGxvZ2ljYSBzZSBoYWNlIGRlc2RlIGxhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJvY2Vzb0Zvcm1hUGFnbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIGxldCBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIGpSZXNwW1wiRm9ybWFQYWdvXCJdID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZpY2FyUHJvY2Vzb0xpc3RhUHJlY2lvKG9MaXN0YVByZWNpbzogTTNQcmRMaXN0YSwgY29uZGljaW9uOiBNM0NPTkRJUFJPTU8sIGpBZGljaW9uYWxlcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBqUmVzcDogYW55O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKG9MaXN0YVByZWNpb1tjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIHByb21vY2lvbmVzIHBvciBwcm9jZXNvcywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBNMyBwcm9jZXNvc1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIE0zIFByb2Nlc29zIE9iamV0bywgY29uIGxhIGluZm9ybWFjaW9uIGRlIHRvZG9zIGxvcyBNM1Byb2Nlc29zXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG8ob00zUHJkR2VuZXJhbDogTTNQcmRHZW5lcmFsLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob00zUHJkR2VuZXJhbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBkZSBwcm9kdWN0byBhZ3J1cGFkby5cclxuICAgICAqIEBwYXJhbSBvVHlwZU0zUHJkR3JwIFxyXG4gICAgICogQHBhcmFtIGNvbmRpY2lvbiBcclxuICAgICAqIEBwYXJhbSBqQWRpY2lvbmFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvUHJvZHVjdG9QUkRHUlAob1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBjb25kaWNpb246IE0zQ09ORElQUk9NTywgakFkaWNpb25hbGVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGpSZXNwOiBhbnk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0ob1R5cGVNM1ByZEdycFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEoZmFsc2UsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhciBpbmZvcm1hY2lvbiBhZGljaW9uYWwsIGVzdGEgaW5mb3JtYWNpb24gYWRpY2lvbmFsIGVzdGEgZW4gdW5hIHZhcmlhYmxlIGdsb2JhbDogZ29EYXRhQWRpY2lvbmFsXHJcbiAgICAgKiBAcGFyYW0gY29uZGljaW9uIE9iamV0byBjb24gaW5mb3JtYWNpb24gZGUgY29uZGljaW9uXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIEpTT04gZGUgaW5mb3JtYWNpb24gYWRpY2lvbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJpZmljYXJJbmZvQWRpY2lvbmFsKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFBZGljaW9uYWxbY29uZGljaW9uLkNvbmNlcHRvXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXSh0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dLCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YSh0cnVlLCBqQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbiA9PSBcIk1PRFwiICYmICt0aGlzLmdvRGF0YUFkaWNpb25hbFtjb25kaWNpb24uQ29uY2VwdG9dID4gK2NvbmRpY2lvbi5WYWxvcikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYXIgaW5mb3JtYWNpb24gY29udHJhIHVzdWFyaW8gZGF0YS5cclxuICAgICAqIEBwYXJhbSBjb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FySW5mb1VzZXJEYXRhKGNvbmRpY2lvbjogTTNDT05ESVBST01PLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIgalJlc3A6IGFueTtcclxuICAgICAgICBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gIT09IHVuZGVmaW5lZCAmJiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXMuUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0odGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10sIGNvbmRpY2lvbi5WYWxvci50cmltKCkpKSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKHRydWUsIGpBZGljaW9uYWxlcyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10gJiYgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uaW5jbHVkZXMoJywnKSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5nb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hW2NvbmRpY2lvbi5Db25jZXB0b10uc3BsaXQoJywnKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShlbGVtZW50LCBjb25kaWNpb24uVmFsb3IudHJpbSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVmVyaWZpY2FyIGNvbnRyYSBlbCBkZXRhbGxlIGRlIGxhIGNvbmRpY2nDg8KzblxyXG4gICAgcHVibGljIFZlcmlmaWNhY2lvbk0zRGV0YWxsZUNvbmRpY2lvbihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLFxyXG4gICAgICAgIGRldENvbmRpY2lvbmVzOiBBcnJheTxNM0RFVENPTkRJUFJPTU8+LCBjb25jZXB0b0NvbmRpY2lvbjogc3RyaW5nLCBqQWRpY2lvbmFsZXNDb25kaWNpb24pIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIG9kZXRDb25kaWNpb25lc0ZpbmRlZDtcclxuICAgICAgICBzd2l0Y2ggKGNvbmNlcHRvQ29uZGljaW9uLnRyaW0oKSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLUDFcIjpcclxuXHJcbiAgICAgICAgICAgICAgICBvZGV0Q29uZGljaW9uZXNGaW5kZWQgPSBkZXRDb25kaWNpb25lcy5maW5kKGRldCA9PiB0aGlzLm9wZXJhdG9yc1tqQWRpY2lvbmFsZXNDb25kaWNpb24uUk9PVC5Fc3RydWN0dXJhLk9wZXJhY2lvbl0oZGV0LlZhbG9yLCBvVHlwZU0zUHJkR3JwLlNLUDEpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIlBSRF9TS1AxKzJcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIG9UeXBlTTNQcmRHcnAuU0tQMSArIG9UeXBlTTNQcmRHcnAuTG9NM1ByZEdlbmVyYWxbMF0uU0tQMikpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX1NLVVwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLlNLVS50b1N0cmluZygpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiUFJEX0RJU1BcIjpcclxuICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUudG9TdHJpbmcoKSwgZGV0LlZhbG9yLnRvU3RyaW5nKCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShvZGV0Q29uZGljaW9uZXNGaW5kZWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJQUkRfVElQT1wiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVHlwZU0zUHJkR3JwLlRJUE8udG9TdHJpbmcoKSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFwiUEVSX1BST0NFU09cIjovLyogU29sbyB2YWxpZGEgdW5hIGRldENvbmRpY2lvblxyXG4gICAgICAgICAgICAgICAgbGV0IHBlclhQcm9jZXNvOiBNM1BlclhQcm9jZXNvO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgcGVyWFByb2Nlc28gPSBvTTNQcm9jZXNvcy5NM1BlclhQcm9jZXNvLmZpbmQoeCA9PiB4LlRpcG9QZXJzb25hID09IGRldENvbmRpY2lvbmVzWzBdLlZhbG9yLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJFTlwiICYmIHBlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXNbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uID09IFwiRElGRlwiICYmICFwZXJYUHJvY2Vzbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiQUxNQUNFTlwiOlxyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvTTNVYmljYWNpb24uSURVYmljYWNpb24udG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiSE9SQVJJT19IT1JBXCI6XHJcbiAgICAgICAgICAgICAgICB2YXIgb1RpbWVOb3c6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvci50b1N0cmluZygpLCBvVGltZU5vdy5nZXRIb3VycygpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkxvTTNQcmRBZGljaW9uYWxlc1wiOlxyXG4gICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuQ29uY2VwdG8gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWbHJBZGkgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKGFkaSA9PiBhZGkuQVRSSUJVVE8gPT0gakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5Db25jZXB0bykuVkFMT1JcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IudG9TdHJpbmcoKSwgVmxyQWRpLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcCA9IHRoaXMuVmFsaWRhclJlc3B1ZXN0YShudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgLy9Qcm9jZXNvc1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb25jZXB0b0NvbmRpY2lvbi5zcGxpdChcIl9cIilbMF0udHJpbSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gY29uY2VwdG9Db25kaWNpb24uc3BsaXQoXCJfXCIpWzFdLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2RldENvbmRpY2lvbmVzRmluZGVkID0gZGV0Q29uZGljaW9uZXMuZmluZChkZXQgPT4gdGhpcy5vcGVyYXRvcnNbakFkaWNpb25hbGVzQ29uZGljaW9uLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb25dKGRldC5WYWxvciwgb00zUHJvY2Vzb3NbcHJvcGVydHldKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5WYWxpZGFyUmVzcHVlc3RhKG9kZXRDb25kaWNpb25lc0ZpbmRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVU0VSXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGNvbmNlcHRvQ29uZGljaW9uLnNwbGl0KFwiX1wiKVsxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9kZXRDb25kaWNpb25lc0ZpbmRlZCA9IGRldENvbmRpY2lvbmVzLmZpbmQoZGV0ID0+IHRoaXMub3BlcmF0b3JzW2pBZGljaW9uYWxlc0NvbmRpY2lvbi5ST09ULkVzdHJ1Y3R1cmEuT3BlcmFjaW9uXShkZXQuVmFsb3IsIHRoaXMuZ29EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYVtwcm9wZXJ0eV0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLlZhbGlkYXJSZXNwdWVzdGEob2RldENvbmRpY2lvbmVzRmluZGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBFbnRybyBwb3IgRGV0YWxsZSFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL1ZhbGlkYXIgcmVzcHVlc3RhLCBjb24gb2JqZXRvIGEgdmFsaWRhclxyXG4gICAgcHVibGljIFZhbGlkYXJSZXNwdWVzdGEob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICB2YXIgalJlc3A7XHJcbiAgICAgICAgdmFyIGpBZGljaW9uYWxlcztcclxuICAgICAgICBpZiAob2JqZWN0VmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShvYmplY3RWYWxpZGF0ZS5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA2MjUgQWdyZWdhciBzZWNjaW9uIGRlIHZhbGlkYWNpb25lcy5cclxuICAgICAgICAgICAgdmFyIGJSZXNwID0gdGhpcy5WYWxpZGFjaW9uZXNCeUpBZGljaW9uYWxlcyhqQWRpY2lvbmFsZXMpXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9TZSBlbnZpYSBlbiBhZGljaW9uYWxlcywgZWwganNvbiBkZSBsYSBpbmZvcm1hY2lvbiBlbmNvbnRyYWRhIGRlbCBkZXRhbGxlLlxyXG4gICAgICAgICAgICAgICAgalJlc3AgPSB0aGlzLkdlbmVyYXJSZXNwdWVzdGEodHJ1ZSwgakFkaWNpb25hbGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gdGhpcy5HZW5lcmFyUmVzcHVlc3RhKGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBqUmVzcCA9IHRoaXMuR2VuZXJhclJlc3B1ZXN0YShmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBqUmVzcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXIgcmVnbGFzIGNvbmZpZ3VyYWRhcyBkZXNkZSBKU09OIGRlIEFkaWNpb25hbGVzXHJcbiAgICAgKiBAcGFyYW0gakFkaWNpb25hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhY2lvbmVzQnlKQWRpY2lvbmFsZXMoakFkaWNpb25hbGVzOiBhbnkpIHtcclxuICAgICAgICB2YXIgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlZhbGlkYWNpb25lc0J5SkFkaWNpb25hbGVzXCIpXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coakFkaWNpb25hbGVzKVxyXG4gICAgICAgICAgICBpZiAoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTICYmIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5USVBPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlZJR0VOQ0lBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdGhpcy5WYWxpZGFyVmlnZW5jaWEoakFkaWNpb25hbGVzLlJPT1QuVkFMSURBQ0lPTkVTLlZBTDEsIGpBZGljaW9uYWxlcy5ST09ULlZBTElEQUNJT05FUy5WQUwyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqRXJyb3JcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBWYWxpZGFyVmlnZW5jaWEodmFsMTogRGF0ZSwgdmFsMjogRGF0ZSkge1xyXG5cclxuICAgICAgICB2YXIgRmVjaGFBY3R1YWwgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHZhbDEpXHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codmFsMilcclxuXHJcbiAgICAgICAgLy8gdmFyIGRWYWwxID0gbmV3IERhdGUodmFsMSk7XHJcbiAgICAgICAgLy8gdmFyIGRWYWwyID0gbmV3IERhdGUodmFsMik7XHJcblxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwxKVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRWYWwyKVxyXG5cclxuXHJcbiAgICAgICAgdmFyIG5GZWNoYUFjdHVhbDogbnVtYmVyID0gK3RoaXMuR2V0RmVjaGFOdW1iZXIoRmVjaGFBY3R1YWwpOyAvLysoRmVjaGFBY3R1YWwuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBGZWNoYUFjdHVhbC5nZXRNb250aCgpICsgXCJcIiArIEZlY2hhQWN0dWFsLmdldERhdGUoKSk7XHJcbiAgICAgICAgdmFyIG5WYWwxOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwxKTsgLy8rKGRWYWwxLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZFZhbDEuZ2V0TW9udGgoKSArIFwiXCIgKyAoK2RWYWwxLmdldERhdGUoKSArIDEpICk7XHJcbiAgICAgICAgdmFyIG5WYWwyOiBudW1iZXIgPSArdGhpcy5HZXRGZWNoYU51bWJlcih2YWwyKSAvLysoZFZhbDIuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkVmFsMi5nZXRNb250aCgpICsgXCJcIiArICgrZFZhbDIuZ2V0RGF0ZSgpICsgMSkgKTtcclxuICAgICAgICBpZiAobkZlY2hhQWN0dWFsID49IG5WYWwxICYmIG5GZWNoYUFjdHVhbCA8PSBuVmFsMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RmVjaGFOdW1iZXIoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHZhciBkID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnWVlZWU1NREQnKTtcclxuICAgICAgICByZXR1cm4gZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIGFjY2lvbiwgc2kgbm8gdGllbmUgY2FyZ2FkYSB1bmEuIEVzdGEgYWNjaW9uIHNlIGNhcmdhIGplcmFycXVpY2FtZW50ZS5cclxuICAgIHB1YmxpYyBWYWxpZGFyQWNjaW9uKGpSZXNwLCBqQWRpY2lvbmFsZXMpIHtcclxuICAgICAgICB2YXIganNvbkFkaWMgPSBKU09OLnBhcnNlKGpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgaWYgKGpSZXNwLkFjY2lvbiA9PSBudWxsICYmIGpzb25BZGljLlJPT1QuQWNjaW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgalJlc3AuQWNjaW9uID0ganNvbkFkaWMuUk9PVC5BY2Npb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vUmV0b21hciBpbmZvcm1hY2nDg8KzbiBcclxuICAgIHB1YmxpYyBSZXRvbWFyVmFsb3Jlc1Byb21vY2lvbihvTTNFTkNQUk9NTzogTTNFTkNQUk9NTywgalJlc3ApIHtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24gPSB7fTtcclxuICAgICAgICBqUmVzcC5Qcm9tb2Npb24uTm9tYnJlID0gb00zRU5DUFJPTU8uTm9tYnJlO1xyXG4gICAgICAgIGpSZXNwLlByb21vY2lvbi5JRCA9IG9NM0VOQ1BST01PLklkUHJvbW9jaW9uO1xyXG4gICAgICAgIC8vU2kgbm8gdHV2byBuaW5ndW5hIGFjY2lvblxyXG4gICAgICAgIGlmIChqUmVzcC5BY2Npb24gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBqUmVzcC5BY2Npb24gPSB7IFwiVGlwbzJcIjogb00zRU5DUFJPTU8uVGlwbzIsIFwiVGlwb1wiOiBvTTNFTkNQUk9NTy5UaXBvIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vIFJldG9tYXIgZGVzZGUgZWwgZW5jYWJlemFkbyBwcm9tbywgc2kgbm8gZXhpc3RlIGVsIHRpcG8geSBUaXBvMlxyXG4gICAgICAgICAgICBpZiAoIWpSZXNwLkFjY2lvbi5UaXBvMikge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8yID0gb00zRU5DUFJPTU8uVGlwbzI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFqUmVzcC5BY2Npb24uVGlwbykge1xyXG4gICAgICAgICAgICAgICAgalJlc3AuQWNjaW9uLlRpcG8gPSBvTTNFTkNQUk9NTy5UaXBvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gRmluIE9idGVuZXIgaW5mb3JtYWNpb24gZGUgcHJvbW9jaW9uIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEluaWNpbyBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy9Qcm9jZXNhbWllbnRvIGRlIHByb21vY2nDg8KzbiwgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlbCBwcm9kdWN0byBhIGFwbGljYXIgbGEgcHJvbW9jaW9uIHkgbGFzIHByb21vY2lvbmVzIGEgYXBsaWNhclxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9jaW9uKEpQcm9tb2Npb25lczogQXJyYXk8YW55Piwgb1R5cGVNM1ByZEdycDogVHlwZU0zUHJkR3JwLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGdzSWRLYXRpb3MgPSBudWxsKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICBsZXQgc3BsaXRQcmVjaW8gPSB0aGlzLmdvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICB2YXIgb0xpc3RhRmluZGVkID0gb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgbGV0IHByZWNpb01vbmVkZXJvID0gMDtcclxuICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChzcGxpdFByZWNpb1sxXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxCXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxDO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkxEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgaWYgKGdzSWRLYXRpb3MgIT0gbnVsbCAmJiBnc0lkS2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgcHJlY2lvTW9uZWRlcm8gPSBvVHlwZU0zUHJkR3JwLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKS5QUkVDSU87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb1R5cGVNM1ByZEdycC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTywgcHJlY2lvTW9uZWRlcm8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvY2VzYW1pZW50byBkZSBwcm9tb2Npb24gcXVlIHNlIGhhY2VuIHZhbGlkYXMgZGVzcHVlcyBkZSByZWdpc3RyYXIgdG9kb3MgbG9zIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSBKUHJvbW9jaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vQWZ0ZXIoSlByb21vY2lvbmVzOiBBcnJheTxhbnk+LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+KTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvblByb2Nlc2FkYSA9IG5ldyBQcm9tb2Npb25Qcm9jZXNhZGEoKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IG9NM1Byb2Nlc29zLlZhbG9yTmV0bztcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lcywgb00zUHJvY2Vzb3MuVmFsb3JOZXRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiBlbiBnZW5lcmFsXHJcbiAgICAgKiBAcGFyYW0gSlByb21vY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIG5QcmVjaW8gXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9HZW5lcmFsKEpQcm9tb2Npb25lczogQXJyYXk8YW55PiwgblByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgcHJlY2lvTW9uZWRlcm8gPSAwKTogUHJvbW9jaW9uUHJvY2VzYWRhIHtcclxuICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzOiBQcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB2YXIgb0xpc3RhUHJvbW9zQXNvYyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4oKTtcclxuICAgICAgICBsZXQgcHJlY2lvQXNpZ25hZG8gPSBuUHJlY2lvO1xyXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBKUHJvbW9jaW9uZXMubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIC8vSlByb21vY2lvbmVzLmZvckVhY2gocHJvbW9jaW9uID0+IHtcclxuICAgICAgICAgICAgdmFyIHByb21vY2lvbiA9IEpQcm9tb2Npb25lc1tfaV07XHJcbiAgICAgICAgICAgIC8vIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLkFjY2lvbi5UaXBvMiAhPSBudWxsICYmIHByb21vY2lvbi5BY2Npb24uVGlwbzIgPT0gXCJNT05FREVST1wiICYmIHByZWNpb01vbmVkZXJvID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IHByZWNpb01vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0J5VGlwbyhwcm9tb2Npb24sIHByZWNpb0FzaWduYWRvLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNFTkNQUk9NTyk7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MucHVzaChvUHJvbW9jaW9uZXNBc29jaWFkYXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlZhbGlkYXJNZWpvclByb21vY2lvbihvTGlzdGFQcm9tb3NBc29jLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBwcmVjaW9Nb25lZGVybyk7XHJcblxyXG4gICAgICAgIC8vIGlmIChvUHJvbW9jaW9uZXNBc29jaWFkYXMgIT0gbnVsbCkge1xyXG4gICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5wdXNoKG9Qcm9tb2Npb25lc0Fzb2NpYWRhcyk7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgLy8gICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPCAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL0ZTIDIwMTkwNzI1IFJlZG9kbmVvIGRlIGxvcyB2YWxvcmVzIHRvdGFsZXNcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbjtcclxuICAgICAgICByZXR1cm4gb1Byb21vY2lvblByb2Nlc2FkYTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgbWVqb3Igb3BjaW9uLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIHByb21vY2lvbmVzIHByb2Nlc2FkYXMuXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RhUHJvbW9zQXNvYyBMaXN0YSBkZSBwcm9tb2Npb25lcyBwcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBQcm9tb2Npb24gcHJvY2VzYWRhLCBxdWUgcmV0b3JuYXLDg8KhIGEgZmx1am8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyTWVqb3JQcm9tb2Npb24ob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG1vbmVkZXJvOiBudW1iZXIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIGxldCBwcm9tb0Fzb2NpYWRhUmVzdHJpbmdpZG8gPSBvTGlzdGFQcm9tb3NBc29jLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAvL1NpIGVsIHByb2R1Y3RvIGVzdGEgcmVzdHJpbmdpZG8gbGUgZGEgbWF5b3IgcHJpb3JpZGFkIGEgZXN0YSBwcm9tb2Npw4PCs25cclxuICAgICAgICBpZiAoIXByb21vQXNvY2lhZGFSZXN0cmluZ2lkbykge1xyXG4gICAgICAgICAgICAvLzEuIFN1bWEgZGUgdG9kYXMgbGFzIHByb21vY2lvbmVzIEFjdW11bGFibGVzXHJcbiAgICAgICAgICAgIC8vdmFyIGRQcm9tb0FDTTogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgLy9kUHJvbW9BQ00gPSB0aGlzLkdldE1heFhSZWdsYShvTGlzdGFQcm9tb3NBc29jLCBcIkFDTVwiLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgbGV0IGRQcm9tb0VYQyA9IHRoaXMuR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2MsIFwiRVhDXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEpO1xyXG4gICAgICAgICAgICBsZXQgZFByb21vQUNNRElOID0gdGhpcy5HZXRNYXhYUmVnbGEob0xpc3RhUHJvbW9zQXNvYywgXCJBQ01ESU5cIiwgb1Byb21vY2lvblByb2Nlc2FkYSk7XHJcbiAgICAgICAgICAgIC8vUHJvbW9jaW9uZXMgTm8gQWN1bXVsYWJsZXNcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJvbW9BQ01ESU4gPCBkUHJvbW9FWEMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vRVhDKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBsaWNhUHJvbW9BQ01ESU4ob0xpc3RhUHJvbW9zQXNvYywgb1Byb21vY2lvblByb2Nlc2FkYSwgZFByb21vQUNNRElOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcblxyXG4gICAgICAgICAgICAvL1JlY29ycmVyIHRvZGFzIGxhcyBwcm9tb2Npb25lcyBBY3VtdWxhYmxlc1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiICYmICF4LmZsYWdzLmZvcm1hUGFnbykpIHtcclxuICAgICAgICAgICAgICAgIHByb21vLkFwbGljYWRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG1vbmVkZXJvICE9IDAgJiYgcHJvbW8uVGlwbyA9PSBcIk1PTkVERVJPXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCttb25lZGVybykgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gKCttb25lZGVybykgLSBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51ZXZvVmFsb3JEZXNjdWVudG8gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAqIHByb21vLlZhbG9yUG9yY2VudGFqZSAvIDEwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gbnVldm9WYWxvckRlc2N1ZW50bztcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyBudWV2b1ZhbG9yRGVzY3VlbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwpIC0gcHJvbW8uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIHByb21vLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IHByb21vLlZhbG9yTW9uZWRlcm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vLy8vLy9GVU5DSU9OQUxJREFEIFBST0RSSUEgRlVOQ0lPTkFSIE3Dg8KBUyBBREVMQU5URSwgU0kgU0UgUVVJRVJFIEFHUlVQQVIgTEFTIFBST01PQ0lPTkVTIEFDTSBZIEVYQ1xyXG4gICAgICAgICAgICAvLyBpZihkUHJvbW9BQ00gPT0gMCAmJiBkUHJvbW9FWEMgPT0gMCl7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlIGVuY29udHJhcm9uIHByb21vY2lvbmVzJyk7XHJcbiAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgaWYoZFByb21vQUNNID4gZFByb21vRVhDKXtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvL0dhbmEgcHJvbW9jaW9uZXMgYWN1bXVsYXRpdmFzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTVwiKS5mb3JFYWNoKHggPT4geC5BcGxpY2FkYSA9IHRydWUpOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgPSBvTGlzdGFQcm9tb3NBc29jOy8vLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gXCJBQ01cIilcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIGRQcm9tb0FDTSkgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBNYXRoLnJvdW5kKCgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgZFByb21vQUNNKSAqIDEwMCkgLyAxMDA7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8gKz0gb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IFwiQUNNXCIpLnJlZHVjZSgoYWNjLCBjdXIpID0+IChhY2MpICsgKCtjdXIuVmFsb3JNb25lZGVybyksIDApO1xyXG4gICAgICAgICAgICAvLyAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy9HYW5hIHByb21vY2lvbmVzIGV4Y2x1eWVudGVzLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5BcGxpY2FkYSA9IHRydWU7IC8vIE1hcmNhY2lvbiBkZSBwcm9tb2Npb24gYXBsaWNhZGFcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9MaXN0YVByb21vc0Fzb2MvLy5wdXNoKG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKSk7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IE1hdGgucm91bmQoKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgLSBkUHJvbW9FWEMpICogMTAwKSAvIDEwMDtcclxuICAgICAgICAgICAgLy8gICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gTWF0aC5yb3VuZCgoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uKSArIGRQcm9tb0VYQykgKiAxMDApIC8gMTAwO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvICs9IG9MaXN0YVByb21vc0Fzb2MuZmluZCh4ID0+IHguVmFsb3IgPT0gZFByb21vRVhDKS5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4ocHJvbW9Bc29jaWFkYVJlc3RyaW5naWRvKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCA9IDA7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICB9XHJcblxyXG4gICAgYXBsaWNhUHJvbW9FWEMob0xpc3RhUHJvbW9zQXNvYzogQXJyYXk8UHJvbW9jaW9uZXNBc29jaWFkYXM+LCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIHZhbG9yUHJvbW9FWEM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwcm9tb0V4YzogUHJvbW9jaW9uZXNBc29jaWFkYXM7XHJcbiAgICAgICAgaWYgKHZhbG9yUHJvbW9FWEMgPiAwKSB7XHJcbiAgICAgICAgICAgIHByb21vRXhjID0gb0xpc3RhUHJvbW9zQXNvYy5maW5kKHggPT4geC5WYWxvciA9PSB2YWxvclByb21vRVhDIHx8IHguVmFsb3JNb25lZGVybyA9PSB2YWxvclByb21vRVhDKTtcclxuICAgICAgICAgICAgcHJvbW9FeGMuQXBsaWNhZGEgPSB0cnVlOyAvLyBNYXJjYWNpb24gZGUgcHJvbW9jaW9uIGFwbGljYWRhXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHByb21vRXhjLlZhbG9yKTtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbiA9ICgoK29Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24pICsgcHJvbW9FeGMuVmFsb3IpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tb0V4Yy5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGFwbGljYVByb21vQUNNRElOKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCB2YWxvclByb21vQUNNRElOOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsb3JQcm9tb0FDTURJTiA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvbW8gb2Ygb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhID09IFwiQUNNRElOXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlZhbG9yVG90YWxNb25lZGVybyArPSBwcm9tby5WYWxvck1vbmVkZXJvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwgPSAoKCtvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsKSAtIHZhbG9yUHJvbW9BQ01ESU4pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uID0gKCgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbFByb21vY2lvbikgKyB2YWxvclByb21vQUNNRElOKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBtYXhpbW8gdmFsb3Igc2VndW4gbGEgcmVnbGEgYSBjb21wYXJhclxyXG4gICAgICogQHBhcmFtIG9MaXN0YVByb21vc0Fzb2MgXHJcbiAgICAgKiBAcGFyYW0gc1JlZ2xhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0TWF4WFJlZ2xhKG9MaXN0YVByb21vc0Fzb2M6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPiwgc1JlZ2xhOiBzdHJpbmcsIG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSkge1xyXG4gICAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc3dpdGNoIChzUmVnbGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNhc2UgXCJBQ01cIjpcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXN1bHQgPSBvTGlzdGFQcm9tb3NBc29jLmZpbHRlcih4ID0+IHguUmVnbGEudHJpbSgpLnRvVXBwZXJDYXNlKCkgPT0gc1JlZ2xhICYmICF4LmZsYWdzLmZvcm1hUGFnbykucmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5WYWxvciksIDApO1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFDTURJTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVjaW9BY3R1YWwgPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclRvdGFsRGVzY3VlbnRvID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9MaXN0YVByb21vc0Fzb2MuZmlsdGVyKHggPT4geC5SZWdsYS50cmltKCkudG9VcHBlckNhc2UoKSA9PSBcIkFDTURJTlwiICYmICgheC5mbGFncy5mb3JtYVBhZ28gfHwgeC5UaXBvID09IFwiTU9ORURFUk9cIikpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tby5WYWxvclBvcmNlbnRhamUgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVldm9WYWxvckRlc2N1ZW50byA9IChwcmVjaW9BY3R1YWwgKiBwcm9tby5WYWxvclBvcmNlbnRhamUgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvQWN0dWFsIC09IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IG51ZXZvVmFsb3JEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9BY3R1YWwgLT0gcHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxvclRvdGFsRGVzY3VlbnRvICs9IHByb21vLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbG9yVG90YWxEZXNjdWVudG87XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRVhDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgb0xpc3RhUHJvbW9zQXNvYy5maWx0ZXIoeCA9PiB4LlJlZ2xhLnRyaW0oKS50b1VwcGVyQ2FzZSgpID09IHNSZWdsYSAmJiAoIXguZmxhZ3MuZm9ybWFQYWdvIHx8IHguVGlwbyA9PSBcIk1PTkVERVJPXCIpKS5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8uVmFsb3IgPiBvLlZhbG9yTW9uZWRlcm8gPyBvLlZhbG9yIDogby5WYWxvck1vbmVkZXJvOyB9KSlcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1Byb2Nlc2FyIHByb21vY2lvbiBzZWd1biBlbCB0aXBvIFxyXG4gICAgcHVibGljIFByb2Nlc2FyUHJvbW9CeVRpcG8ocHJvbW9jaW9uOiBhbnksIFByZWNpbzogbnVtYmVyLCBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPik6IFByb21vY2lvbmVzQXNvY2lhZGFzIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgQWNjaW9uO1xyXG4gICAgICAgICAgICB2YXIgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbmV3IFByb21vY2lvbmVzQXNvY2lhZGFzKCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uICE9IG51bGwgJiYgcHJvbW9jaW9uLlByb21vY2lvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbiA9IHByb21vY2lvbi5Qcm9tb2Npb24uSUQ7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTm9tYnJlID0gcHJvbW9jaW9uLlByb21vY2lvbi5Ob21icmU7XHJcbiAgICAgICAgICAgICAgICBBY2Npb24gPSBwcm9tb2Npb24uQWNjaW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKEFjY2lvbi5SZWdsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5SZWdsYSA9IEFjY2lvbi5SZWdsYTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlJlZ2xhID0gXCJFWENcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMjtcclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEVE9fJVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvclBvcmNlbnRhamUgPSArQWNjaW9uLlZhbG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9ICgrUHJlY2lvKSAqICgoK0FjY2lvbi5WYWxvcikgLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX1ZBTE9SXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRFRPX0VYQUNUXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gKCtQcmVjaW8pIC0gKCtBY2Npb24uVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBBY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUmVnbGFPYnNlcSA9IEFjY2lvbi5SZWdsYU9ic2VxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYXJDYW50aWRhZE9ic2VxdWlvcyhvTTNFTkNQUk9NTywgQWNjaW9uLk9CU0VRVUlPUywgb1Byb21vY2lvbmVzQXNvY2lhZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy92YWxpZGFyIGNhbnRpZGFkIHZzIGNhbnRpZGFkIGRlIG9ic3F1aW9zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNT05FREVST1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuTGlzdE9ic1NLVSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvck1vbmVkZXJvID0gK0FjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9GUyAyMDE5MDgyNyBZYSBubyBzZSBndWFyZGEgZWwgdmFsb3IgdG90YWwgZGVsIG1vbmVkZXJvIHNpIG5vIHVuaWNhbWVudGUgZWwgcG9yY2VudGFqZS4uLiBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVmFsb3JNb25lZGVybyA9ICgrb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCkgKiAoKCtBY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNVUE9OXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLklkQ3Vwb24gPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJBQ1RJVkFfUFJPTU9cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMubElkQWN0aXZhUHJvbW8gPSBBY2Npb24uVmFsb3Iuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlJFU1RSSUNDSU9OX1BBR09cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiUkVTVFJJQ0NJT05cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLkxpc3RPYnNTS1UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuVGlwbyA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBcIk1PRF9DQU5USURBRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAvL3RoaXMuQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQob1Byb21vY2lvbmVzQXNvY2lhZGFzLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQWNjaW9uLlRpcG8gPT0gXCJDT01CSU5BREFcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlZhbG9yID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5MaXN0T2JzU0tVID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEgPSBuZXcgUHJvbW9jaW9uQ29tYmluYWRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLklEUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzLlByb21vY2lvbkNvbWJpbmFkYS5UaXBvMiA9IEFjY2lvbi5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuTm9tYnJlID0gb1Byb21vY2lvbmVzQXNvY2lhZGFzLk5vbWJyZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uID0gQWNjaW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckNhbXBvc0FkaWNpb25hbGVzKG9NM0VOQ1BST01PLCBvUHJvbW9jaW9uZXNBc29jaWFkYXMuUHJvbW9jaW9uQ29tYmluYWRhLCBwcm9tb2Npb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbmVzQXNvY2lhZGFzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLkZvcm1hUGFnbykge1xyXG4gICAgICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5mbGFncy5mb3JtYVBhZ28gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsaWRhckNhbnRpZGFkT2JzZXF1aW9zKG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPixcclxuICAgICAgICBvYnNlcXVpb3M6IEFycmF5PGFueT4sIG9Qcm9tb2Npb25lc0Fzb2NpYWRhczogUHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcHJvbW86IE0zRU5DUFJPTU87XHJcbiAgICAgICAgICAgIHZhciBWYWxvckNhbnRQUkQ6IG51bWJlciA9IC0xO1xyXG4gICAgICAgICAgICB2YXIgVmFsb3JDYW50UFJEUmVhbDogbnVtYmVyID0gdGhpcy5nb0RhdGFBZGljaW9uYWwuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICBwcm9tbyA9IG9NM0VOQ1BST01PLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uID09IG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5JRFByb21vY2lvbik7XHJcbiAgICAgICAgICAgIHByb21vLk0zQ09ORElBR1JVUEFDSU9OLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBWYWxvckNhbnRQUkQgPSAreC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25lc0Fzb2NpYWRhcy5DYW50aWRhZE9ic2VxID0gVmFsb3JDYW50UFJEXHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBjYW1wb3MgYWRpY2lvbmFsZXMgZW4gcHJvbW9jaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNFTkNQUk9NTyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uQ29tYmluYWRhIFxyXG4gICAgICogQHBhcmFtIHByb21vY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJDYW1wb3NBZGljaW9uYWxlcyhvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYSwgcHJvbW9jaW9uOiBhbnkpIHtcclxuICAgICAgICBzd2l0Y2ggKG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIpIHtcclxuICAgICAgICAgICAgY2FzZSBcIk9CU0VRX0NJRVJSRVwiOlxyXG4gICAgICAgICAgICAgICAgLy9BZ3JlZ2FyIENhbnRpZGFkLlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgdmFyIHNWYWxvckNhbnRpZGFkOiBzdHJpbmcgPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICBwcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvckNhbnRpZGFkID0geC5NM0NPTkRJUFJPTU8uZmluZCh4ID0+IHguQ29uY2VwdG8gPT0gXCJkQ2FudGlkYWRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Db21iaW5hZGEuQWNjaW9uLkNhbnRpZGFkT2JzcSA9IHNWYWxvckNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FcIjpcclxuICAgICAgICAgICAgICAgIC8vIHZhciBwcm9tbzogTTNFTkNQUk9NTztcclxuICAgICAgICAgICAgICAgIC8vIHByb21vID0gb00zRU5DUFJPTU8uZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gb1Byb21vY2lvbkNvbWJpbmFkYS5JZFByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgakFkaWM6YW55ID0gSlNPTi5wYXJzZShwcm9tby5KQWRpY2lvbmFsZXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uQ2xhc2lmaWNhY2lvbiA9IGpBZGljLlJPT1QuQWNjaW9uLkNhcmFjdGVyaXN0aWNhO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJDT01CT1wiOlxyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vOiBNM0VOQ1BST01PO1xyXG4gICAgICAgICAgICAgICAgcHJvbW8gPSBvTTNFTkNQUk9NTy5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uTnVtQ29uZGljaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvUHJvbW9jaW9uQ29tYmluYWRhLkFjY2lvbi5OdW1Db25kaWNpb25lcyA9IHByb21vLk0zQ09ORElBR1JVUEFDSU9OWzBdLk0zQ09ORElQUk9NTy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvbW9jaW9uLklEQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb1Byb21vY2lvbkNvbWJpbmFkYS5BY2Npb24uSWRDb25kaWNpb24gPSBwcm9tb2Npb24uSURDb25kaWNpb25cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEZpbiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbiA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gSW5pY2lvIFByb2Nlc2FtaWVudG8gQ29tYmluYWRhIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAgIC8vUHJvY2VzYXIgcHJvbW9jaW9uZXMgY29tYmluYWRhc1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5Qcm9tb0NvbWJpbmFkYXNWMihvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb2Nlc2FyQ29tYmluYWRhXCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVjIgQ09NQklOQURBXHJcbiAgICAvKipcclxuICAgKiBQcm9jZXNhbWllbnRvIGRlIHByb21vY2lvbmVzIGNvbWJpbmFkYXMsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzIGRlIE0zUHJvY2Vzb3NcclxuICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gT2JqZXRvIE0zIFByb2Nlc29zLCBlbCBjdWFsIHNlIHJlY29ycmVyw4PCoSBsYSBpbmZvcm1hY2lvbiBkZSBsaXN0YSBkZSBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9Db21iaW5hZGFzVjIoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+O1xyXG4gICAgICAgIGxldCBlbmNDb25MYUNhbnRpZGFkT3JpZ2luYWwgPSBfLmNsb25lRGVlcChpb00zUHJvY2Vzby5NM0VOQyk7XHJcblxyXG4gICAgICAgIGlmIChpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5HZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5BZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgdmFyIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXNBY3VtdWxhYmxlID0gdGhpcy5HZXRFc0FjdW11bGFibGVQcm9tbyhjb21iaSlcclxuICAgICAgICAgICAgLy8vT2J0ZW5lciB0b2RvcyBsb3MgRW5jYWJlemFkb3MgcXVlIGFwbGljYW4gYSBsYSBwcm9tb2Npb24gYSBsYSBxdWUgc2UgZXN0YSBpdGVyYW5kb1xyXG4gICAgICAgICAgICBvTGlzdEVuY2FiID0gdGhpcy5HZXRFbmNhYmV6YWRvQnlDb21iaShjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGNvbWJpLlRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTU9EX0NBTlRJREFEXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzOiAzIGdhc2Vvc2FzIHBvciAkNTAwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BcGxpY2FyUmVnbGFNb2RDYW50aWRhZChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfQ0lFUlJFXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlByb2Nlc2FyUHJvbW9PYnNxQ2llcnJlKGxQcmVjaW9zLCBjb21iaSwgaW9NM1Byb2Nlc28sIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiT0JTRVFfU1VNVE9UQUxcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc2FyT2JzZXFTdW1Ub3RhbChvTGlzdEVuY2FiLCBjb21iaSwgaW9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlhDQVJBQ1RFUklTVElDQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5WZXJpZmljYXJDbGFzaWZpY2FjaW9uZXNQcm9jZXNvKG9MaXN0RW5jYWIsIGNvbWJpLCBsUHJlY2lvcywgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJYQ0FSQUNURVJJU1RJQ0FQQVJDSUFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmRlbmFyTGlzdGFFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbFByZWNpb3MgPSB0aGlzLlByb2Nlc2FyUHJvbW9Db21ieUJ5TGlzdEVuYyhvTGlzdEVuY2FiLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJDYXJhY3RlcmlzdGljYVBhcmNpYWwob0xpc3RFbmNhYiwgY29tYmksIGxQcmVjaW9zLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNPTUJPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwbENvbWJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYXBsQ29tYm8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsQ29tYm8gPSB0aGlzLlByb21vY2lvbkNvbWJpbmFkYUNvbWJvKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlLCBpb00zUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRUT19WQUxPUlRPVEFMXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxQcmVjaW9zID0gdGhpcy5Qcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYiwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlBST0RfQVBMREVTQ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9kdWN0b0FwbERlc2Mob0xpc3RFbmNhYiwgY29tYmksIGlvTTNQcm9jZXNvLCBlc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvL0VzdGEgcHJvbW9jaW9uIGVzIHBhcmEgMngxLCAzeDEsIDR4MiwgLi4uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9MaXN0RW5jYWIgJiYgb0xpc3RFbmNhYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWIsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjKGxQcmVjaW9zLCBvTGlzdEVuY2FiLCBjb21iaSwgZXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWVzdGFibGVjZSBsYSBjYW50aWRhZCBvcmlnaW5hbCBwYXJhIHF1ZSBubyBzZSBxdWVkZSBlbiB1biBidXZsZSBpbmZpbml0b1xyXG4gICAgICAgIGZvciAoY29uc3Qgb00zUEVuY09yaWdpbmFsZXMgb2YgZW5jQ29uTGFDYW50aWRhZE9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZE9yaWdpbmFsID0gb00zUEVuY09yaWdpbmFsZXMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQWN0dWFsID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY09yaWdpbmFsZXMuSUQpO1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gY2FudGlkYWRPcmlnaW5hbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3JkZW5hckxpc3RhRW5jKG9saXN0YUVuYzogTTNQRW5jSXRlbXNbXSwgZXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgaWYgKGVzQWN1bXVsYWJsZSkgb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVRORVRPJykuVmFsb3IpIC0gKCthLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09ICdQVU5JVE5FVE8nKS5WYWxvcikpO1xyXG4gICAgICAgIGVsc2Ugb2xpc3RhRW5jLnNvcnQoKGEsIGIpID0+ICgrYi5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSAnUFVOSVQnKS5WYWxvcikgLSAoK2EuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gJ1BVTklUJykuVmFsb3IpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFwbFJlZ2xhQ29tYlZhbG9yVG90YWwobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkRGVzY1Byb21vOiBudW1iZXIgPSArQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBwcmVjaW9Ub3RhbENvbXByYTogbnVtYmVyID0gbFByZWNpb3MucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICsgTnVtYmVyKGIuUFVOSVRORVRPKTsgfSwgMCk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmVjaW9Ub3RhbENvbXByYSk7XHJcbiAgICAgICAgbGV0IGRlc2NBY3VtID0gMDtcclxuICAgICAgICBsZXQgZGVzY1Byb2RBY3R1YWw7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbFByZWNpb3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgZGVzY1Byb2RBY3R1YWwgPSAobFByZWNpb3NbaV0uUFVOSVRORVRPIC8gcHJlY2lvVG90YWxDb21wcmEpICogY2FudGlkYWREZXNjUHJvbW8gLy80MFxyXG4gICAgICAgICAgICBkZXNjQWN1bSArPSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gLSBkZXNjUHJvZEFjdHVhbDtcclxuICAgICAgICAgICAgLy8gaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gMCkge1xyXG4gICAgICAgICAgICAvLyAgICAgbFByZWNpb3NbaV0uQXBsaWNhZG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKGxQcmVjaW9zW2ldLlBVTklUTkVUTyA8IGNhbnRpZGFkRGVzY1Byb21vKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgY2FudGlkYWREZXNjUHJvbW8gLT0gbFByZWNpb3NbaV0uUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICBlbHNle1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIGxQcmVjaW9zW2ldLlBVTklUTkVUTyAtPSBjYW50aWRhZERlc2NQcm9tbztcclxuICAgICAgICAgICAgLy8gICAgICAgICBjYW50aWRhZERlc2NQcm9tbyA9IDA7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnRpZGFkRGVzY1Byb21vID4gZGVzY0FjdW0gfHwgY2FudGlkYWREZXNjUHJvbW8gPCBkZXNjQWN1bSkge1xyXG4gICAgICAgICAgICAvL2ZpbmQgZGVsIHVsdGltbyBcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkVuY29udHJlIGRpZmVyZW5jaWEgZW4gcHJvbW9zIGNvbWJpbmFkYXM6IFwiICsgY2FudGlkYWREZXNjUHJvbW8gKyBcIiB2cyBcIiArIGRlc2NBY3VtKTtcclxuICAgICAgICAgICAgbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPID0gbFByZWNpb3NbbFByZWNpb3MubGVuZ3RoIC0gMV0uUFVOSVRORVRPIC0gKGNhbnRpZGFkRGVzY1Byb21vIC0gZGVzY0FjdW0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWRcIilcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3MsIG9MaXN0RW5jYWIsIGNvbWJpLCB0cnVlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNhck9ic2VxU3VtVG90YWwocHJvZHVjdG9zQXBsaWNhUHJvbW86IE0zUEVuY0l0ZW1zW10sIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgbGV0IHZhbG9yUHJvbW8gPSArY29tYmkuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgIGxldCBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgIGxldCBjYW50aWRhZE9ic2VxdWlvcyA9IDA7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkUHJvZHVjdG9BY3R1YWwgPSAxO1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGVuY0l0ZW0gb2YgcHJvZHVjdG9zQXBsaWNhUHJvbW8pIHtcclxuICAgICAgICAgICAgY2FudGlkYWRQcm9kdWN0b0FjdHVhbCA9IDE7XHJcbiAgICAgICAgICAgIGxldCBwVW5pdEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZEFjdHVhbCA9ICtlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHdoaWxlIChjYW50aWRhZFByb2R1Y3RvQWN0dWFsIDw9IGNhbnRpZGFkQWN0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgKz0gcFVuaXRBY3R1YWw7XHJcbiAgICAgICAgICAgICAgICBjYW50aWRhZFByb2R1Y3RvQWN0dWFsKys7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RvUmV2aXNhZG8gPSBwcm9kdWN0b3NSZXZpc2Fkb3MuZmluZCh4ID0+IHguSWQgPT0gZW5jSXRlbS5JRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZHVjdG9SZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RvUmV2aXNhZG8uQ2FudGlkYWQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rvc1JldmlzYWRvcy5wdXNoKHsgSWQ6IGVuY0l0ZW0uSUQsIENhbnRpZGFkOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHN1bWFWYWxvclByb2R1Y3RvcyArIGRpZmVyZW5jaWEgPj0gdmFsb3JQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zU3VtVG90YWwocHJvZHVjdG9zSGlqb3NEZWxDb21ibywgb00zUHJvY2Vzb3MsIHByb2R1Y3Rvc1JldmlzYWRvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWRPYnNlcXVpb3MrKztcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gc3VtYVZhbG9yUHJvZHVjdG9zIC0gdmFsb3JQcm9tbztcclxuICAgICAgICAgICAgICAgICAgICBzdW1hVmFsb3JQcm9kdWN0b3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgdmFsb3JDb21ibywgMSk7XHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBwcm9kdWN0b0NvbWJvLCBjYW50aWRhZE9ic2VxdWlvcyk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wib00zUmVnU2VydmljZVwiXSA9IG9NM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvc1N1bVRvdGFsKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJvY2VzbzogTTNQcm9jZXNvcywgcHJvZHVjdG9zUmV2aXNhZG9zKSB7XHJcbiAgICAgICAgbGV0IG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIGxldCBwcm9kSGlqbzogTTNQRW5jSXRlbXM7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHByb2RSZXZpc2FkbyBvZiBwcm9kdWN0b3NSZXZpc2Fkb3MpIHtcclxuICAgICAgICAgICAgaWYgKHByb2RSZXZpc2Fkbykge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9NM1BFbmNJdGVtcyA9IG9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSUQgPT0gcHJvZFJldmlzYWRvLklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcyA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGQgPT4gZC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9ICgrb00zUERldGFsbGVJdGVtcy5WYWxvciAtIHByb2RSZXZpc2Fkby5DYW50aWRhZCkudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2RIaWpvID0gXy5jbG9uZURlZXAob00zUEVuY0l0ZW1zKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2Vzbyhwcm9kSGlqbywgcHJvZFJldmlzYWRvLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5wdXNoKHByb2RIaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyQVByb2R1Y3Rvc1F1aXRhckNvbWJpKG9NM1Byb2Nlc28sIHByb2RIaWpvLCBwcm9kUmV2aXNhZG8uQ2FudGlkYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9kdXRvUHJvbW9Db21ib1N1bVRvdGFsKHByb2R1Y3Rvc0VuTTNQcm9jZXNvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk6IE0zUEVuY0l0ZW1zIHtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExpc3RhUHJlY2lvcyhsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGxQcmVjaW9zRmlsdGVyID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHkgPT4geS5JRCA9PSBvTGlzdEVuY2FiW2ldLklEKS5mb3JFYWNoKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3NGaWx0ZXIucHVzaCh4KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3NGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9tb2Npb24gZGUgY29tYm8sIHggcHJvZHVjdG9zLCB5IHByb2R1Y3RvcywgLi4uIG4gcHJvZHVjdG9zIFxyXG4gICAgICogcG9yICQxMDAwXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqIEBwYXJhbSBiRXNBY3VtdWxhYmxlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUHJvbW9jaW9uQ29tYmluYWRhQ29tYm8obFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbiwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgbGV0IGZsYWdBcGxpY29Qcm9tbyA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBuTnVtZXJvQ29uZGljaW9uZXM6IG51bWJlciA9ICtjb21iaS5BY2Npb24uTnVtQ29uZGljaW9uZXM7XHJcbiAgICAgICAgICAgIHZhciBWYWxvclByb21vID0gK2NvbWJpLkFjY2lvbi5WYWxvcjtcclxuICAgICAgICAgICAgdmFyIExpc3RDb25kaWNpb25lcyA9IG5ldyBBcnJheTxBcnJheTxhbnk+PigpO1xyXG4gICAgICAgICAgICB2YXIgbWluaW1vSXRlbXM6IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGxldCBwb3JjZW50YWplUHJvbW8gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFNpblByb21vID0gMDtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8gPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIGxldCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2U7XHJcblxyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbk51bWVyb0NvbmRpY2lvbmVzOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGNvbmRpY2lvbiAxLlxyXG4gICAgICAgICAgICAgICAgdmFyIExpc3RQcm9tb0NvbWJpOiBBcnJheTxNM1BFbmNJdGVtcz4gPSB0aGlzLkJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiLCBpLnRvU3RyaW5nKCksIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgTGlzdENvbmRpY2lvbmVzLnB1c2godGhpcy5HZXRMaXN0YVByZWNpb3MobFByZWNpb3MsIExpc3RQcm9tb0NvbWJpKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsdHJhckxpc3RhQ29uZGljaW9uZXNDb21ibyhMaXN0Q29uZGljaW9uZXMsIG9MaXN0RW5jYWIpO1xyXG4gICAgICAgICAgICBpZiAoTGlzdENvbmRpY2lvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vQnVzY2FyIGVsIHZhbG9yIG1lbm9yIGRlIGxhcyBpdGVtcyBhZ3JlZ2FkYXNcclxuICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gTGlzdENvbmRpY2lvbmVzWzBdLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaisrKSB7Ly9Db21pZW56YSBkZXNkZSAxIHBvcnF1ZSBlbCAwIHlhIHNlIHZhbGlkbyBlbiBsYSBhbnRlcmlvciBsaW5lYVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtc1ByZWNpb3M6IEFycmF5PGFueT4gPSBMaXN0Q29uZGljaW9uZXNbal07XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld01pbiA9IGl0ZW1zUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01pbiA8IG1pbmltb0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltb0l0ZW1zID0gbmV3TWluO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vTG9zIGNvbWJvcyBkZWJlbiBwcm9jZXNhcnNlIGRlIGEgdW5vIHBhcmEgc3UgY29ycmVjdG8gZnVuY2lvbmFtaWVudG9cclxuICAgICAgICAgICAgICAgIGlmIChtaW5pbW9JdGVtcyA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbW9JdGVtcyA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy9SZWNvcnJlIHRvZG9zIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3MgZGUgbGEgcHJvbW8gcGFyYSBzYWJlciBjdWFsIGVzIGVsIHZhbG9yIHJvYWwgZGUgbGEgcHJvbW9cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpblByb21vICs9ICtsUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5JbmRpY2UgPT0gZW5jLkluZGljZSkuUFVOSVRORVRPO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvL0NhbGN1bGEgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgbGEgcHJvbW8gYSBwYXJ0aXIgZGVsIGNhbG9yIGRlbCBjb21ibyB5IGRlIGxhIHN1bWEgZGUgbG9zIHByZWNpb3Mgb3JpZ2luYWxlcyBkZSBsb3MgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBwb3JjZW50YWplUHJvbW8gPSAxMDAgLSAoK1ZhbG9yUHJvbW8gKiAxMDAgLyB2YWxvclRvdGFsU2luUHJvbW8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgTGlzdENvbmRpY2lvbmVzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpID0gTGlzdENvbmRpY2lvbmVzW2tdO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgbWluaW1vSXRlbXM7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jOiBhbnkgPSBjb25kaVtsXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLmZvckVhY2gocHJlY2lvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjaW8uSW5kaWNlID09IGVuYy5JbmRpY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWNpby5Qcm9tb0FwbGljYWRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxvciA9IHByZWNpby5QVU5JVE5FVE87XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01vZGlmaWNhIGVsIHByZWNpbyBkZSBsb3MgcHJvZHVjdG9zIGEgc3UgbnVldm8gdmFsb3IgY29uIGxhIHByb21vY2lvbiBhcGxpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gdmFsb3IgLSAodmFsb3IgKiBwb3JjZW50YWplUHJvbW8gLyAxMDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUHJvbW9BcGxpY2FkYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWdyZWdhclByb2R1Y3RvQVByb2R1Y3Rvc0hpam9zKHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8sIGlvTTNQcm9jZXNvLCBwcmVjaW8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbiBsYXMgcHJvbW9zIHBvciBjb21ibyBubyBhcGxpY2FuIGVsIHByZWNpbyBkZSBsb3Mgb3Ryb3MgcHJvZHVjdG9zIHF1ZSBubyBoYWNlbiBwYXJ0ZSBkZWwgY29tYm8gOilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW8uUFVOSVRORVRPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbFByZWNpb3MuZmluZCh4ID0+IHguSUQgPT0gZW5jLklEICYmIHguSW5kaWNlID09IGVuYy5JbmRpY2UpLlBVTklUTkVUTyA9IC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnQXBsaWNvUHJvbW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ0FwbGljb1Byb21vKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgcHJvZHVjdG9Qcm9tb0NvbWJpRXhpc3RlbnRlID0gaW9NM1Byb2Nlc28uTTNFTkMuZmluZCh4ID0+IHguSWRQcm9kdWN0byA9PSBjb21iaS5BY2Npb24uQ29kaWdvKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXByb2R1Y3RvUHJvbW9Db21iaUV4aXN0ZW50ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaSwgdHJ1ZSwgYkVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLmxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhpb00zUHJvY2VzbywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibywgY29tYmkuQWNjaW9uLkNvZGlnbywgY29tYmkuQWNjaW9uLlZhbG9yLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5saW1waWFyRW5jSXRlbVByZENvbmRpKG9MaXN0RW5jYWIpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21vY2lvbkNvbWJpbmFkYUNvbWJvXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZ0FwbGljb1Byb21vO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBmaWx0cmFyTGlzdGFDb25kaWNpb25lc0NvbWJvKGxpc3RDb25kaWNpb25lczogQXJyYXk8YW55Piwgb00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RDb25kaWNpb25lcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgbGV0IG51ZXZhQ29uZGljaW9uID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGljaW9uIG9mIGxpc3RDb25kaWNpb25lc1tfaV0pIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbmNJdGVtID0gb00zUEVuY0l0ZW1zTGlzdC5maW5kKHggPT4geC5JRCA9PSBjb25kaWNpb24uSUQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuY0l0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBlbmNJdGVtLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdID0gZW5jSXRlbVtcIlByZENvbmRpXCJdID8gZW5jSXRlbVtcIlByZENvbmRpXCJdIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0Q2FudGlkYWQgPiBlbmNJdGVtW1wiUHJkQ29uZGlcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVldmFDb25kaWNpb24gPSBbY29uZGljaW9uXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jSXRlbVtcIlByZENvbmRpXCJdKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsaXN0Q29uZGljaW9uZXNbX2ldID0gbnVldmFDb25kaWNpb247XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxpbXBpYXJFbmNJdGVtUHJkQ29uZGkob00zUEVuY0l0ZW1zTGlzdDogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zTGlzdC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgZWxlbWVudFtcIlByZENvbmRpXCJdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2VzbzogTTNQcm9jZXNvcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgY2FudGlkYWQgPSAxKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvUXVpdGFyO1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb1tcIlByb2R1Y3Rvc0NvbWJpXCJdKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29bXCJQcm9kdWN0b3NDb21iaVwiXSA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvZHVjdG9RdWl0YXIgPSBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0uZmluZCh4ID0+IHguSUQgPT0gb00zUEVuY0l0ZW1zLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b1F1aXRhcikge1xyXG4gICAgICAgICAgICBwcm9kdWN0b1F1aXRhci5DYW50aWRhZCArPSAoLTEgKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvW1wiUHJvZHVjdG9zQ29tYmlcIl0ucHVzaCh7IElEOiBvTTNQRW5jSXRlbXMuSWRQcm9kdWN0bywgQ2FudGlkYWQ6ICgtMSAqIGNhbnRpZGFkKSB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0FncmVnYSBlbCBwcm9kdWN0byBkZSBsYSBsaXN0YSBkZSBlbnRyYWRhIGEgdW4gYXJyZWdsbyBkZSBwcm9kdWN0b3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlcmEgbG9zIHByb2R1Y3RvcyBoaWpvcyBkZWwgcHJvZHVjdG8gQ29tYm9cclxuICAgIGFncmVnYXJQcm9kdWN0b0FQcm9kdWN0b3NIaWpvcyhwcm9kdWN0b3NIaWpvc0RlbENvbWJvOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgIGxldCBvTTNQRW5jSXRlbXMgPSB0aGlzLmdldFByb2R1dG9Qcm9tb0NvbWJvKG9NM1Byb2Nlc28uTTNFTkMsIG9QcmVjaW9EZWxQcm9kdWN0b0FjdHVhbCk7XHJcbiAgICAgICAgaWYgKG9NM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICBsZXQgb00zUmVnU2VydmljZSA9IG5ldyBNM1JlZ1NlcnZpY2UobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgICAgICAgICAgIC8vTGEgY2FudGlkYWQgZGlzbWludXllIHBlcm8gZXN0ZSBtb3ZpbWllbnRvIHNlIHJldmVyc2EgYWwgdGVybWluYXIgZGUgdmFsaWRhciBlc3RhIHByb21vXHJcbiAgICAgICAgICAgIG9NM1JlZ1NlcnZpY2UuVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtcywgMSk7XHJcbiAgICAgICAgICAgIHByb2R1Y3Rvc0hpam9zRGVsQ29tYm8ucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFncmVnYXJBUHJvZHVjdG9zUXVpdGFyQ29tYmkob00zUHJvY2Vzbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vRGlzbWludXllIGVuIHVubyBsYSBjYW50aWRhZCBkZWwgcHJvZHVjdG8geSByZXRvcm5hIHVuIGNsb24gZGUgZXN0ZVxyXG4gICAgZ2V0UHJvZHV0b1Byb21vQ29tYm8ocHJvZHVjdG9zRW5NM1Byb2Nlc286IEFycmF5PE0zUEVuY0l0ZW1zPiwgb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIGxldCBwcm9kdWN0b3NEZWxDb21ibyA9IG5ldyBBcnJheTxNM1BFbmNJdGVtcz4oKTtcclxuICAgICAgICBsZXQgb00zUEVuY0l0ZW1zID0gcHJvZHVjdG9zRW5NM1Byb2Nlc28uZmluZCh4ID0+IHguSUQgPT0gb1ByZWNpb0RlbFByb2R1Y3RvQWN0dWFsLklEKVxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgIGlmICgrb00zUERldGFsbGVJdGVtcy5WYWxvciA+IDApIHtcclxuICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSAoK29NM1BEZXRhbGxlSXRlbXMuVmFsb3IgLSAxKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGVuIGhhc2htYXAgZGUgcHJlY2lvc1xyXG4gICAgICogQHBhcmFtIGhtbFByZWNpb3MgXHJcbiAgICAgKiBAcGFyYW0gSUQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGR0b0htUHJlY2lvcyhobWxQcmVjaW9zOiBBcnJheTxhbnk+LCBJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGZpbmRlZDogYW55ID0gaG1sUHJlY2lvcy5maW5kKHggPT4geC5JRCA9PSBJRCk7XHJcbiAgICAgICAgaWYgKGZpbmRlZCkge1xyXG4gICAgICAgICAgICBmaW5kZWQuSW5kaWNlID0gK2ZpbmRlZC5JbmRpY2UgKyArMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaW5kZWQgPSB7IFwiSURcIjogSUQsIFwiSW5kaWNlXCI6IDAgfTtcclxuICAgICAgICAgICAgaG1sUHJlY2lvcy5wdXNoKGZpbmRlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmaW5kZWQuSW5kaWNlO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVzY2FyIGVuY2FiZXphZG9zIHF1ZSB0ZW5nYSBsYSBwcm9tb2Npb24geSBjb25kaWNpb24gZW52aWFkYSBjb21vIHBhcmFtZXRyb1xyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gSWRDb25kaWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaWRQcm9tb2Npb25lcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEJ1c2NhckVuY0J5UHJvbW9ZQ29uZChvTGlzdEVuY2FiOiBBcnJheTxNM1BFbmNJdGVtcz4sIElkQ29uZGljaW9uOiBzdHJpbmcsIGlkUHJvbW9jaW9uZXM6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRW5jRmluZGVkID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSlcclxuICAgICAgICAgICAgICAgIGlmICghb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgfHwgIShvTTNQRW5jSXRlbXMuSWRFbmNQYWRyZSA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBST01PQ09NQklcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRldENhbnRpZGFkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldCAmJiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb3M6IEFycmF5PGFueT4gPSBKU09OLnBhcnNlKGRldC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb0ZpbmRlZCA9IHByb21vcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBpZFByb21vY2lvbmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW9GaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaWNpb25GaW5kZWQgPSBwcm9tb0ZpbmRlZC5BY2Npb24uSWRDb25kaWNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpY2lvbkZpbmRlZC5maW5kKHggPT4geCA9PSBJZENvbmRpY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9FbmNGaW5kZWQucHVzaChvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGljaW9uRmluZGVkID09IElkQ29uZGljaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvRW5jRmluZGVkLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9FbmNGaW5kZWQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDg8KzbiBzaSBsYSBwcm9tb2Npw4PCs24gcXVlIGxsZWdhIGNvbW8gcGFyYW1ldHJvLCBlcyBhY3VtdWxhYmxlIG8gbm9cclxuICAgICAqIEBwYXJhbSBwcm9tb2Npb24gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRFc0FjdW11bGFibGVQcm9tbyhwcm9tb2Npb246IFByb21vY2lvbkNvbWJpbmFkYSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9tb2Npb24uQWNjaW9uLlJlZ2xhICYmIHByb21vY2lvbi5BY2Npb24uUmVnbGEgPT0gXCJBQ01cIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldEVzQWN1bXVsYWJsZVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc2FyUHJvZHVjdG9BcGxEZXNjKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIGxldCBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgbGV0IHByb2RzQXBsRGVzY3VlbnRvOiBBcnJheTxNM1BFbmNJdGVtcz4gPSBbXTtcclxuICAgICAgICBsZXQgc2t1QXBsRGVzY3VlbnRvczogQXJyYXk8YW55PiA9IGNvbWJpLkFjY2lvbi5za3VBcGxEZXNjOyAvL1t7U0tVOlwiWFhYWFhYXCJ9LCB7U0tVOlwiWVlZWVlZWVwifV1cclxuICAgICAgICBsZXQgbWF4TnVtRGVzY3VlbnRvcyA9ICtjb21iaS5BY2Npb24ubWF4TnVtRGVzYztcclxuICAgICAgICBsZXQgY29udERlc2NBcGxpY2Fkb3MgPSAwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL0NhbGN1bGEgZWwgbnVtZXJvIG1heGltbyBkZSBkZXNjaW5ldG9zIHF1ZSBwdWVkZSBhcGxpY2FyIGxhIHByb21vIHF1ZSBlcyBjb21iaS5BY2Npb24ubWF4TnVtRGVzYyBtdWx0aXBsaWNhZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgcGFsaWNhbiBsYSBwcm9tbyBlbiBlbCBwcm9jZXNvXHJcbiAgICAgICAgICAgIG1heE51bURlc2N1ZW50b3MgPSBvTGlzdEVuY2FiLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyArY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB9LCAwKSAqIG1heE51bURlc2N1ZW50b3M7XHJcblxyXG4gICAgICAgICAgICAvL0RlIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gZmlsdHJvIGxvcyBwcm9kdWN0b3MgcXVlIGFwbGljYXJhbiBlbCBkZXNjdWVudG8gc2VndW4gbG9zIFNLVSBjb25maWd1cmFkb3MgZW4gY29tYmkuQWNjaW9uLnNrdUFwbERlc2NcclxuICAgICAgICAgICAgaW9NM1Byb2Nlc28uTTNFTkMuZm9yRWFjaChvTTNQRW5jSXRlbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNrdUFwbERlc2N1ZW50b3MuZmluZCh4ID0+IHguU0tVID09IG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RzQXBsRGVzY3VlbnRvLnB1c2gob00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL0PDg8KhbGN1bG8gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zIGRlIGxvcyBwcm9kdWN0b3MgYSBsb3MgcXVlIGxhIHByb21vIGFwbGljYXJhIGRlc2N1ZW50b1xyXG4gICAgICAgICAgICBsUHJlY2lvcyA9IHRoaXMuUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKHByb2RzQXBsRGVzY3VlbnRvLCBlc0FjdW11bGFibGUpO1xyXG5cclxuICAgICAgICAgICAgLy9BcGxpY2EgdGFudG9zIGRlc2N1ZW50b3Mgc2UgcHVlZGFuIGEgcGxhaWNhciBhIGNhZGEgdmFsb3IgZGUgbFByZWNpb1xyXG4gICAgICAgICAgICB3aGlsZSAoY29udERlc2NBcGxpY2Fkb3MgPCBtYXhOdW1EZXNjdWVudG9zICYmIGNvbnREZXNjQXBsaWNhZG9zIDwgbFByZWNpb3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICBsUHJlY2lvc1tjb250RGVzY0FwbGljYWRvc10uUFVOSVRORVRPIC09ICgrbFByZWNpb3NbY29udERlc2NBcGxpY2Fkb3NdLlBVTklUTkVUTykgKiAoKCtjb21iaS5BY2Npb24uVmFsb3IpIC8gMTAwKTtcclxuICAgICAgICAgICAgICAgIGNvbnREZXNjQXBsaWNhZG9zKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vUmVjYWxjdWxhIGxvcyB2YWxvcmVzIGRlbCBwcm9kdWN0byBhcGxpY2FuZG8gZWwgZGVzY3VlbnRvXHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlVG90YWxQcmljZUZyb21MaXN0KGxQcmVjaW9zLCBwcm9kc0FwbERlc2N1ZW50bywgY29tYmksIHRydWUsIGVzQWN1bXVsYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvcyBlbiBlbCBjaWVycmVcclxuICAgICAqIFZhbGlkYSB0b2RhIGxhIGxpc3RhIGRlIGVuY2FiZXphZG9zLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhIGVuIGVsIGNhcnJpdG8gZGUgY29tcHJhc1xyXG4gICAgICogVmFsaWRhIGxhIHByb21vY2nDg8KzbiwgcG9yIGNhZGEgY3VhbnRvcyBwcm9kdWN0b3MgaW5ncmVzYWRvcywgY3XDg8KhbnRvcyBvYnNlcXVpb3Mgc2UgcHVlZGVuIGRhci5cclxuICAgICAqIFRyYWUgdG9kb3MgbG9zIG9ic2VxdWlvcyBxdWUgc2UgaW5ncmVzYXJvbiBlbiBlbCBjYXJyaXRvIGRlIGNvbXByYXMsIGxvcyBsaXN0YVxyXG4gICAgICogY29sb2NhIGVuIHZhbG9yIDAgbG9zIG9ic2VxdWlvcyBxdWUgc2VsZWNjaW9ubyBhdXRvbWF0aWNhbWVudGUgZWwgYWxnb3JpdG1vXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcywgaW1wdWVzdG9zIHkgZGVtYXMgdmFsb3JlcyB0b3RhbGVzLlxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgbG9zIHByb2R1Y3RvcyBpbmdyZXNhZG9zIGFsIGNhcnJpdG8gcXVlIHRpZW5lbiBvYnNlcXVpb1xyXG4gICAgICogQHBhcmFtIGNvbWJpIEluZm9ybWFjacODwrNuIGRlIHByb21vY2nDg8KzbiBkZSBvYnNlcXVpb3NcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBQcm9jZXNvIGNvbiB0b2RvcyBsb3MgcHJvZHVjdG9zIGUgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jZXNhclByb21vT2JzcUNpZXJyZShvTGlzdEVuY2FiOiBBcnJheTxhbnk+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhLCBpb00zUHJvY2VzbzogTTNQcm9jZXNvcywgZXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29bJ1Byb2R1Y3Rvc0NvbWJpJ10gPSBbXTtcclxuICAgICAgICBsZXQgY2FudFBvck9icyA9ICtjb21iaS5BY2Npb24uQ2FudGlkYWRPYnNxOyAvL1BvciBjYWRhIGN1YW50b3MgcHJvZHVjdG9zIGNvbiBsYSBwcm9tb2Npw4PCs24gc2UgZGFyw4PCoSBlbCBvYnNlcXVpby5cclxuICAgICAgICBsZXQgY2FudEFncmVnYWRhID0gMDtcclxuICAgICAgICBsZXQgc3VtYVZhbG9yUHJvZHVjdG9zID0gMDtcclxuICAgICAgICBsZXQgY2FudGlkYWRPYnNlcXVpb3MgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckNvbWJvID0gMDtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zUmV2aXNhZG9zID0gW107XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rvc0hpam9zRGVsQ29tYm86IEFycmF5PE0zUEVuY0l0ZW1zPiA9IFtdO1xyXG4gICAgICAgIGxldCBtM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NFeGMgPSB0cnVlO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgICAgIG0zUmVnU2VydmljZS5vYnNlcXVpb3NDYW50aWRhZCA9IDBcclxuICAgICAgICAvLyB2YXIgY2FudE9ic2VxdWlvczogbnVtYmVyID0gMDsgLy9DYW50aWRhZCBkZSBvYnNlcXVpb3MgcXVlIHNlIGRhcsODwqEgcG9yIGVzdGEgY29tcHJhLlxyXG5cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9kdWN0byBvZiBvTGlzdEVuY2FiKSB7XHJcbiAgICAgICAgICAgIHN1bWFWYWxvclByb2R1Y3RvcyArPSBwcm9kdWN0by5QVU5JVE5FVE87XHJcbiAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSsrO1xyXG4gICAgICAgICAgICBsZXQgcHJvZHVjdG9SZXZpc2FkbyA9IHByb2R1Y3Rvc1JldmlzYWRvcy5maW5kKHggPT4geC5JZCA9PSBwcm9kdWN0by5JRCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0b1JldmlzYWRvKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b1JldmlzYWRvLkNhbnRpZGFkKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MucHVzaCh7IElkOiBwcm9kdWN0by5JRCwgQ2FudGlkYWQ6IDEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjYW50QWdyZWdhZGEgPT09IGNhbnRQb3JPYnMpIHtcclxuICAgICAgICAgICAgICAgIHZhbG9yQ29tYm8gKz0gc3VtYVZhbG9yUHJvZHVjdG9zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ3JlZ2FyUHJvZHVjdG9BUHJvZHVjdG9zSGlqb3NTdW1Ub3RhbChwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBpb00zUHJvY2VzbywgcHJvZHVjdG9zUmV2aXNhZG9zKTtcclxuICAgICAgICAgICAgICAgIGNhbnRpZGFkT2JzZXF1aW9zKys7XHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0b3NSZXZpc2Fkb3MgPSBbXTtcclxuICAgICAgICAgICAgICAgIGNhbnRBZ3JlZ2FkYSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb21iaS5BY2Npb24uQ29kaWdvKSBjb25zb2xlLmVycm9yKCdFbCBjw4PCs2RpZ28gZGVsIGNvbWJvIG5vIGVzdGEgY29uZmlndXJhZG8gZW4gTTNERVRDT05ESVBST01PJylcclxuICAgICAgICBpZiAocHJvZHVjdG9zSGlqb3NEZWxDb21iby5sZW5ndGggPiAwICYmIGNvbWJpLkFjY2lvbi5Db2RpZ28pIHtcclxuICAgICAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBtM1JlZ1NlcnZpY2UubG9hZE0zUEVuY0l0ZW1zRnJvbVByb21vY2lvbkNvbWJvKGlvTTNQcm9jZXNvLCBwcm9kdWN0b3NIaWpvc0RlbENvbWJvLCBjb21iaS5BY2Npb24uQ29kaWdvLCB2YWxvckNvbWJvLCAxKTtcclxuICAgICAgICAgICAgbTNSZWdTZXJ2aWNlLmFybWFyTGlzdGFPYnNlcXVpb3NDb21iaVNLVShjb21iaSwgcHJvZHVjdG9Db21ibywgY2FudGlkYWRPYnNlcXVpb3MpO1xyXG4gICAgICAgICAgICBpb00zUHJvY2Vzb1tcIm9NM1JlZ1NlcnZpY2VcIl0gPSBtM1JlZ1NlcnZpY2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogQXBsaWNhciByZWdsYXMsIHJlc3BlY3RvIGEgbGEgY2FudGlkYWQgaW5ncmVzYWRhLlxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvbmVzQXNvY2lhZGFzIFxyXG4gICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICovXHJcbiAgICBwdWJsaWMgQXBsaWNhclJlZ2xhTW9kQ2FudGlkYWQobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBBY2Npb24gPSBjb21iaS5BY2Npb247XHJcblxyXG4gICAgICAgIHZhciBpQ2FudGlkYWRQcm9tbzogbnVtYmVyID0gQWNjaW9uLkNhbnRpZGFkOyAvL0VqZW1wbG8gOiAzXHJcbiAgICAgICAgLy92YXIgaUNhbnRpZGFkQVBMUHJvbW86IG51bWJlcjsgLy9OdW1lcm8gcmVhbCBkZSBhcGxpY2FjaW9uIGRlIHByb21vY2lvbmVzLCBTaSBhcGxpY2EgcmVzdGEgZWwgcmVzaWR1by5cclxuICAgICAgICB2YXIgaUNhbnRpZGFkUmVhbDogbnVtYmVyOyAvL0NhbnRpZGFkIHJlYWwgaW5ncmVzYWRhLlxyXG4gICAgICAgIHZhciBWYWxvclByb21vOiBudW1iZXIgPSBBY2Npb24uVmFsb3I7XHJcbiAgICAgICAgdmFyIHZhbG9yUHJvbW9Vbml0OiBudW1iZXIgPSAoK1ZhbG9yUHJvbW8pIC8gKCtpQ2FudGlkYWRQcm9tbylcclxuICAgICAgICBpQ2FudGlkYWRSZWFsID0gbFByZWNpb3MubGVuZ3RoO1xyXG5cclxuICAgICAgICBpZiAoaUNhbnRpZGFkUmVhbCA+PSBpQ2FudGlkYWRQcm9tbykgeyAvL0pBR00gMjAxOTA0MjYgU0UgQ0FNQklBLCBBTlRFUyBFU1RBQkEgTEEgRlVOQ0lPTkFMSURBRCBERSBDQU5USURBRCBSRUFMIFZTIENBTlRJREFEIFBST01PQ0lPTi5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbyA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2lDYW50aWRhZEFQTFByb21vID0gaUNhbnRpZGFkUmVhbCAvIGlDYW50aWRhZFByb21vO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIFJlc2lkdW86IG51bWJlciA9IGlDYW50aWRhZFJlYWwgJSBpQ2FudGlkYWRQcm9tbztcclxuICAgICAgICAgICAgICAgIGlDYW50aWRhZFJlYWwgPSBpQ2FudGlkYWRSZWFsIC0gUmVzaWR1bztcclxuICAgICAgICAgICAgICAgIC8vaUNhbnRpZGFkQVBMUHJvbW8gPSBpQ2FudGlkYWRSZWFsIC8gaUNhbnRpZGFkUHJvbW87XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaUNhbnRpZGFkUmVhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobFByZWNpb3NbaV0uUFVOSVRORVRPID4gdmFsb3JQcm9tb1VuaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5QVU5JVE5FVE8gPSB2YWxvclByb21vVW5pdDtcclxuICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tpXS5BcGxpY2FkbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGxQcmVjaW9zLmZpbmQoeCA9PiB4LkFwbGljYWRvKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkFwbGljYXJSZWdsYU1vZENhbnRpZGFkXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIHRydWUsIGJFc0FjdW11bGFibGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FyZ2FyIGNvbWJpbmFkYXMgZGVzZGUgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRDb21iaW5hZGFzRnJvbURpbmFtaWNhcyhpb00zUHJvY2VzbzogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBzQ29tYmluYWRhID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIHZhciBvQ29tYmluYWRhID0gSlNPTi5wYXJzZShzQ29tYmluYWRhKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMgPSBvQ29tYmluYWRhO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgYSBkaW5hbWljYXMgcHJvY2VzbyBkZSBjb21iaW5hZGFzXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREaW5hbWljYVByb2Nlc29Db21iaW5hZGFzKGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIG9NM1BEaW5hbWljYXNGaW5kZWQ6IE0zUERpbmFtaWNhcztcclxuICAgICAgICBvTTNQRGluYW1pY2FzRmluZGVkID0gaW9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJDT01CSU5BREFcIik7XHJcbiAgICAgICAgaWYgKG9NM1BEaW5hbWljYXNGaW5kZWQpIHtcclxuICAgICAgICAgICAgdmFyIGFyclByb21vOiBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+ID0gSlNPTi5wYXJzZShvTTNQRGluYW1pY2FzRmluZGVkLlZhbG9yKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJQcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9Qcm9tb0NvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEgPSBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IGFyclByb21vW2ldLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgIGlmICghb1Byb21vQ29tYmkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzLnB1c2goYXJyUHJvbW9baV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgb00zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcy5Ob21icmUgPSBcIkNPTUJJTkFEQVwiO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLlZhbG9yID0gSlNPTi5zdHJpbmdpZnkoaW9NM1Byb2Nlc28uUHJvbW9zQ29tYmluYWRhcyk7XHJcblxyXG4gICAgICAgICAgICBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGFyIHByb21vY2lvbmVzLCBzZWd1biBsYSBsaXN0YSBkZSBwcmVjaW9zIGRpdmlkaWRhLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGRlIHByZWNpb3MsIGNvbnRyYSBlc3RlIG9iamV0byBzZSBpdGVyYXLDg8KhIHkgc2Ugb3JkZW5hcsODwqEgZGUgbWF5b3IgYSBtZW5vclxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgXHJcbiAgICAgKiBAcGFyYW0gY29tYmkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByb21vY2lvbmVzQnlMaXN0YVByZWMobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBUaXBvUHJvbW8gPSBjb21iaS5UaXBvMjtcclxuICAgICAgICB2YXIgaXg6IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGl5OiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciB4OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVsxXVxyXG4gICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAgICAgdmFyIHJlc2lkdW9YOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBiRW50cm86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHgudG9TdHJpbmcoKS5zcGxpdChcIi5cIikubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgICAgICAgICB4ID0gK3gudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy9TZSBpdGVyYSBlbCBhcnJlZ2xvIGRlIHByaW5jaXBpbyBhIGZpbiB5IGRlIGZpbiBhIHByaW5jaXBpby4uLiBcclxuICAgICAgICAvLy9Db25mb3JtZSBzZSByZWNvcnJlIGVsIGFycmVnbG8gZGUgZmluIGEgcHJpbmljaW8sIHNlIHZhIGRhbmRvIGxhIHByb21vY2nDg8KzbiBhIGxvcyBwcm9kdWN0b3MgZGUgbWVub3IgdmFsb3IuXHJcbiAgICAgICAgLy8vU2kgbGEgcHJvbW9jacODwrNuIGVzdGEgaW5jb21wbGV0YSwgbG9zIHByb2R1Y3RvcyBkZSBsYSBtaXRhZCBxdWVkYW4gc2luIHByb21vY2nDg8KzbiBcclxuICAgICAgICB2YXIgaTogbnVtYmVyID0gMDtcclxuICAgICAgICBsUHJlY2lvcyA9IGxQcmVjaW9zLnNvcnQoKGEsIGIpID0+IGEuUFVOSVRORVRPIDwgYi5QVU5JVE5FVE8gPyAxIDogYS5QVU5JVE5FVE8gPiBiLlBVTklUTkVUTyA/IC0xIDogMClcclxuICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB2YXIgaiA9ICtsUHJlY2lvcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGxQcmVjaW9zLmxlbmd0aCAmJiBqID49IGkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpeCA9IDA7XHJcbiAgICAgICAgICAgICAgICBpeSA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGl4IDwgeCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpeCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChpeSA8IHkgJiYgaiA+PSBpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNpZHVvWCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJFbnRybyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxQcmVjaW9zW2pdLlBVTklUTkVUTyA9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8vUGFyYSBsYXMgcHJvbW9jaW9uIGNvbW86IDJYMS41LCAuLi5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9Fc3RhIHNvcG9ydGFuZG8gc29sbyBwYXJhOiAyWDEuNVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsUHJlY2lvc1tqXS5QVU5JVE5FVE8gPSArbFByZWNpb3Nbal0uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXkrKztcclxuICAgICAgICAgICAgICAgICAgICBqLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgICAgIC8vVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBwcmVjaW9zIHVuaXRhcmlvcy5cclxuICAgICAgICAgICAgLy9KR0FNIDIwMTkxMDIzLCBmdW5jaW9uYWxpZGFkIGRlIHF1ZSBzb2xvIGVudHJhIGFjw4PCoSBjdWFuZG8gc2UgY2FtYmlvIGFsZ3VuIHByZWNpb1xyXG4gICAgICAgICAgICBpZiAoYkVudHJvKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZVRvdGFsUHJpY2VGcm9tTGlzdChsUHJlY2lvcywgb0xpc3RFbmNhYiwgY29tYmksIGZhbHNlLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICAvLyAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHJlZHVjZSgoYWNjLCBjdXIpID0+ICgrYWNjKSArICgrY3VyLlBVTklUTkVUTyksIDApO1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuU2V0VmFsb3JQcm9tb2Npb25lcyhlbmMpO1xyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyTGlzdGFQcm9tbyhlbmMsIGNvbWJpKTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXIgcHJlY2lvIHRvdGFsIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICAgKiBAcGFyYW0gbFByZWNpb3MgTGlzdGEgZGUgcHJlY2lvcyBhIHRlbmVyIGVuIGN1ZW50YVxyXG4gICAgICogQHBhcmFtIG9MaXN0RW5jYWIgTGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgICAqIEBwYXJhbSBjb21iaSBQcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhdGVUb3RhbFByaWNlRnJvbUxpc3QobFByZWNpb3M6IEFycmF5PGFueT4sIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgY29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSwgYkFwbFZhbGlkYTogYm9vbGVhbiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAgICAgLy9UZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gZGUgbG9zIHByZWNpb3MgdW5pdGFyaW9zLlxyXG4gICAgICAgIHZhciBkVmFsb3JQcm9tb0FudDogbnVtYmVyID0gMDtcclxuICAgICAgICAvL3ZhciBkVmFsb3JQcm9tb0FudEFjdW06IG51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGRWYWxvckFjdDogbnVtYmVyID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGVuYzogTTNQRW5jSXRlbXMgPSBvTGlzdEVuY2FiW2ldO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb051ZXZvID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKCthY2MpICsgKCtjdXIuUFVOSVRORVRPKSwgMCk7XHJcbiAgICAgICAgICAgIHZhciBwcmVjaW9Ub3RhbEFudGVyaW9yO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbEFudGVyaW9yID0gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yO1xyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzE4IFNFIFFVSVRBIFZBTElEQUNJT04sIFBPUiBGTFVKTyBRVUUgU0kgU0UgREVWVUVMVkUgVFJBRSBMQSBQUk9NTywgUEVSTyBTSSBTRSBCT1JSQS4gaWYgKGRQcmVjaW9OdWV2byA8IHByZWNpb1RvdGFsQW50ZXJpb3IpIHsgLy8gU2UgYWdyZWdhIHZhbGlkYWNpb24gZGUgcHJlY2lvLCBwYXJhIGVzY29nZXIgZWwgbWVqb3IuIE5vIHB1ZWRlbiBhIHZlciAyIHByb21vY2lvbmVzLlxyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgPSBkUHJlY2lvTnVldm87XHJcbiAgICAgICAgICAgIC8vZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMUkVBTFwiKS5WYWxvciA9IGRQcmVjaW9OdWV2bztcclxuICAgICAgICAgICAgLy9MaW1waWFyIHByb21vY2lvbmVzXHJcbiAgICAgICAgICAgIGlmICgodGhpcy5WYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zLCBlbmMpIHx8ICFiQXBsVmFsaWRhKSAmJiAhYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST01PQ1wiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST01PQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJOT01CX1BST19DT01CSVwiKS5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVkFMX1BST19DT01CSVwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiSURfUFJPX0NPTUJJXCIpLlZhbG9yID0gXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5RdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgLy8gZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlZBTF9QUk9NT0NcIikuVmFsb3IgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgZFZhbG9yQWN0ID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRWYWxvclByb21vQW50ID0gdGhpcy5HZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3MsIGVuYyk7XHJcbiAgICAgICAgICAgICAgICBkVmFsb3JBY3QgPSB0aGlzLkdldFZhbG9yUHJvbW9BQ3QoZW5jLCBkVmFsb3JQcm9tb0FudCwgZFByZWNpb051ZXZvLCBwcmVjaW9Ub3RhbEFudGVyaW9yLCBiRXNBY3VtdWxhYmxlKTtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDczMCBzZSBhZ3JlZ2EgcGFyYSBwcm9tb2Npb25lcyBhY3VtdWxhYmxlcy4gYWN1bXVsYWJcclxuICAgICAgICAgICAgICAgIGlmICghYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPTU9DXCIpLlZhbG9yID0gZFZhbG9yUHJvbW9BbnQudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FcyBhY3VtdWxhYmxlLCB1dGlsaXphciBsYSBpbmZvcm1hY2nDg8KzbiBcclxuICAgICAgICAgICAgICAgICAgICBkVmFsb3JQcm9tb0FudCA9ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yIC0gcHJlY2lvVG90YWxBbnRlcmlvcilcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5TZXRWYWxvclByb21vY2lvbmVzKGVuYywgZFZhbG9yQWN0ICsgZFZhbG9yUHJvbW9BbnQpO1xyXG4gICAgICAgICAgICB0aGlzLkFncmVnYXJMaXN0YVByb21vKGVuYywgY29tYmksIGRWYWxvckFjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb1VuaXRGcm9tVG90YWwoZW5jLCBkUHJlY2lvTnVldm8pO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NEaXJlY3RhcyhlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZW5jLk0zREVULmZpbHRlcih4ID0+IHguTm9tYnJlQ29uY2VwdG8udG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiVkFMX1BST01PQ19cIikpLmZvckVhY2goZGV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGRldC5WYWxvciA9IFwiMFwiO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBRdWl0YXJMYXNQcm9tb3NDb21iaW5hZGFzKGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBlbmMuTTNERVQuZmlsdGVyKHggPT4geC5Ob21icmVDb25jZXB0by50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJWQUxfUFJPX0NPTUJJX1wiKSkuZm9yRWFjaChkZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGFyIHByZWNpbyB1bml0YXJpbywgYSBwYXJ0aXIgZGUgdW4gbnVldm8gcHJlY2lvIFRvdGFsLlxyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBuZXdQcmljZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFJlY2FsY3VsYXJQcmVjaW9Vbml0RnJvbVRvdGFsKGVuYzogTTNQRW5jSXRlbXMsIG5ld1ByaWNlOiBudW1iZXIpIHtcclxuICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yID0gKCtuZXdQcmljZSAvICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIHRvZG9zIGxvcyBwcmVjaW9zIGRlIHVuIHByb2R1Y3RvIHNlIGNhbWJpYXJvbiBvIG5vLlxyXG4gICAgICogQHBhcmFtIGxQcmVjaW9zIExpc3RhIGNvbiB0b2RvcyBsb3MgaXRlbXNcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyU2lUb2Rvc0FQTFByb21vQ29tYmluYWRhKGxQcmVjaW9zOiBBcnJheTxhbnk+LCBlbmM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgLy9DaGVjaywgc2kgYWxndW5vIGRlIGxhIGxpc3RhIGRlIHByZWNpbyBlcyBpZ3VhbCBhbCBwcmVjaW8gYW50ZXJpb3JcclxuICAgICAgICB2YXIgcHJlY2lvQW50ZXJpb3IgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCkuZmluZCh4ID0+IHguUFVOSVRORVRPID09IGVuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvcik7XHJcbiAgICAgICAgaWYgKHByZWNpb0FudGVyaW9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yZXMgZGUgcHJvbW9jaW9uZXMgZGVwZW5kaWVuZG8gZGVsIG51bWVybyBkZSBpdGVtcyBxdWUgbm8gc2UgbW9kaWZpY2Fyb25cclxuICAgICAqIEBwYXJhbSBsUHJlY2lvcyBcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQW50ZXJpb3IobFByZWNpb3M6IEFycmF5PGFueT4sIGVuYzogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZFZhbG9yID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgbnVtZXJvSXRlbXMgPSBsUHJlY2lvcy5maWx0ZXIoeCA9PiB4LklEID09IGVuYy5JRCAmJiB4LlBVTklUTkVUTyA9PSBkVmFsb3IpLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIGRVbml0UHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICByZXR1cm4gK251bWVyb0l0ZW1zICogK2RVbml0UHJvbW87XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgdmFsb3IgZGUgbGEgcHJvbW9jaW9uIHF1ZSBzZSBlc3RhIHByb2Nlc2FuZG8gYWN0dWFsbWVudGVcclxuICAgICAqIEBwYXJhbSBlbmMgXHJcbiAgICAgKiBAcGFyYW0gdmFsb3JQcm9tb0FudCBcclxuICAgICAqIEBwYXJhbSB2YWxvdFRvdGFsTnVldm8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHZXRWYWxvclByb21vQUN0KGVuYzogTTNQRW5jSXRlbXMsIHZhbG9yUHJvbW9BbnQ6IG51bWJlciwgdmFsb3RUb3RhbE51ZXZvOiBudW1iZXIsIHByZWNpb1RvdGFsQW50OiBudW1iZXIsIGJFc0FjdW11bGFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JUb3RhbFNpbkR0bzogbnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQcm9tb0FjdDogbnVtYmVyO1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgc2kgdmllbmUgYWN1bXVsYWJsZSB1dGlsaXphciBlbCBwcmVjaW8gYW50ZXJpb3IsIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBkdG8uXHJcbiAgICAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxvclRvdGFsU2luRHRvID0gcHJlY2lvVG90YWxBbnQ7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3RUb3RhbE51ZXZvO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFsb3JUb3RhbFNpbkR0byA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxTSU5EVE9cIikuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB2YWxvclByb21vQWN0ID0gK3ZhbG9yVG90YWxTaW5EdG8gLSArdmFsb3JQcm9tb0FudCAtICt2YWxvdFRvdGFsTnVldm87XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3JQcm9tb0FjdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIEdldFZhbG9yUHJvbW9BQ3Q6IFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldGVhciBlbCB2YWxvciBkZSBsYSBwcm9tb2Npb25cclxuICAgICAqIEBwYXJhbSBlbmMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2V0VmFsb3JQcm9tb2Npb25lcyhlbmM6IE0zUEVuY0l0ZW1zLCB2YWxvclByb21vOiBudW1iZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvL2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKCgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMU0lORFRPXCIpLlZhbG9yKSAtICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yKSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgLy9GUyAyMDE5MDcyNSBSZWRvbmRlbyBkZWwgdmFsb3IgZGUgcHJvbW9jaW9uXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gKE1hdGgucm91bmQodmFsb3JQcm9tbyAqIDEwMCkgLyAxMDApLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYxOCBTZSBhZ3JlZ2EgZWwgdmFsb3IgdW5pdGFyaW8gZGUgbGEgcHJvbW9jacODwrNuXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWVU5JVFBST01PXCIpLlZhbG9yID0gKCsoTWF0aC5yb3VuZCh2YWxvclByb21vICogMTAwKSAvIDEwMCkgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gIC8qKlxyXG4gICAgLy8gICogU2V0ZWFyIGVsIHZhbG9yIGRlIGxhIHByb21vY2lvblxyXG4gICAgLy8gICogQHBhcmFtIGVuYyBFbmNhYmV6YWRvIGRlIGl0ZW1zXHJcbiAgICAvLyAgKi9cclxuICAgIC8vIHB1YmxpYyBTZXRWYWxvclByb21vY2lvbmVzRnJvbUxpc3RhUHJlY2lvcyhlbmM6IE0zUEVuY0l0ZW1zLCBsUHJlY2lvczogQXJyYXk8YW55Pikge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQgJiYgeC5QVU5JVE5FVE8gPT0gZFZhbG9yKVxyXG4gICAgLy8gICAgIH0gY2F0Y2h7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBwdWJsaWMgQ2FsY3VsYXJQcm9tb2Npb25lc0J5TGlzdGFQcmVjQmV0YShsUHJlY2lvczogQXJyYXk8YW55Piwgb0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb21iaTogUHJvbW9jaW9uQ29tYmluYWRhKSB7XHJcbiAgICAvLyAgICAgaWYgKGxQcmVjaW9zLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgdmFyIFRpcG9Qcm9tbyA9IGNvbWJpLlRpcG8yO1xyXG4gICAgLy8gICAgICAgICB2YXIgaVNpemVQcmVjOiBudW1iZXIgPSBsUHJlY2lvcy5sZW5ndGg7XHJcbiAgICAvLyAgICAgICAgIHZhciBpTWl0YWQ6IG51bWJlcjtcclxuXHJcbiAgICAvLyAgICAgICAgIHZhciByZXNpZHVvWDogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICAgICAgdmFyIHg6IG51bWJlciA9ICtUaXBvUHJvbW8uc3BsaXQoXCJYXCIpWzFdXHJcbiAgICAvLyAgICAgICAgIHZhciB5OiBudW1iZXIgPSArVGlwb1Byb21vLnNwbGl0KFwiWFwiKVswXSAtICgreCk7XHJcbiAgICAvLyAgICAgICAgIHZhciBpRHRvOiBudW1iZXI7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoeC50b1N0cmluZygpLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxKSB7XHJcbiAgICAvLyAgICAgICAgICAgICByZXNpZHVvWCA9ICt4LnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSAoK3kpIC8gKCtpU2l6ZVByZWMpO1xyXG4gICAgLy8gICAgICAgICBpTWl0YWQgPSBNYXRoLmNlaWwoKCtpTWl0YWQpICogKCt4KSkgLSAxO1xyXG5cclxuICAgIC8vICAgICAgICAgbFByZWNpb3MgPSBsUHJlY2lvcy5zb3J0KChhLCBiKSA9PiBhLlBVTklUTkVUTyA8IGIuUFVOSVRORVRPID8gMSA6IGEuUFVOSVRORVRPID4gYi5QVU5JVE5FVE8gPyAtMSA6IDApXHJcblxyXG4gICAgLy8gICAgICAgICB2YXIgaVggPSAwO1xyXG4gICAgLy8gICAgICAgICBpZiAobFByZWNpb3MubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgaUR0byA9IGlNaXRhZDtcclxuICAgIC8vICAgICAgICAgICAgIHdoaWxlIChpRHRvIDwgaVNpemVQcmVjKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJlc2lkdW9YID09IDApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaUR0bysrO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vL1BhcmEgbGFzIHByb21vY2lvbiBjb21vOiAyWDEuNSwgLi4uXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vRXN0YSBzb3BvcnRhbmRvIHNvbG8gcGFyYTogMlgxLjVcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbFByZWNpb3NbaUR0b10uUFVOSVRORVRPID0gK2xQcmVjaW9zW2lEdG9dLlBVTklUTkVUTyAqICgrcmVzaWR1b1ggLyAxMCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlKGlYIDwgeCl7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsUHJlY2lvc1tpRHRvXS5QVU5JVE5FVE8gPSArbFByZWNpb3NbaUR0b10uUFVOSVRORVRPICogKCtyZXNpZHVvWCAvIDEwKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlYKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpRHRvKys7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gaVggPSAwO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgICAgIC8vQ2FsY3VsYXIgcHJlY2lvcyB0b3RhbGVzXHJcbiAgICAvLyAgICAgICAgICAgICAvL1RlbmllbmRvIGVuIGN1ZW50YSBsYSBpbmZvcm1hY2lvbiBkZSBsb3MgcHJlY2lvcyB1bml0YXJpb3MuXHJcbiAgICAvLyAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9MaXN0RW5jYWIubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1RPVEFMXCIpLlZhbG9yID0gbFByZWNpb3MuZmlsdGVyKHggPT4geC5JRCA9PSBlbmMuSUQpLlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoK2FjYykgKyAoK2N1ci5QVU5JVE5FVE8pLCAwKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGxpc3RhIGRlIGRldGFsbGUgZWw6ICBOT01CX1BST01PQywgVkFMX1BST01PQyB5IElEX1BST01PQ1xyXG4gICAgICogQHBhcmFtIGVuYyBcclxuICAgICAqIEBwYXJhbSBjb21iaSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFncmVnYXJMaXN0YVByb21vKGVuYzogTTNQRW5jSXRlbXMsIGNvbWJpOiBQcm9tb2Npb25Db21iaW5hZGEsIGRWYWxvclByb21vQ29tYmk6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkZXROb21icmVzOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIGRldFZhbG9yZXM6IHN0cmluZztcclxuICAgICAgICB2YXIgZGV0SWRzOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zTmFtZXM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zVmFsczogTTNQRGV0YWxsZUl0ZW1zLy8gPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXNJZHM6IE0zUERldGFsbGVJdGVtcy8vID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG5cclxuXHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiTk9NQl9QUk9fQ09NQklcIik7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJWQUxfUFJPX0NPTUJJXCIpO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMgPSBlbmMuTTNERVQuZmluZChkID0+IGQuTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9fQ09NQklcIik7XHJcblxyXG4gICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzID0gbmV3IE0zUERldGFsbGVJdGVtcygpO1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zVmFscyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc05hbWVzLk5vbWJyZUNvbmNlcHRvID0gXCJOT01CX1BST19DT01CSVwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNWYWxzLk5vbWJyZUNvbmNlcHRvID0gXCJWQUxfUFJPX0NPTUJJXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc0lkcy5Ob21icmVDb25jZXB0byA9IFwiSURfUFJPX0NPTUJJXCJcclxuXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNOYW1lcy5WYWxvciA9IFwiXCJcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBcIlwiXHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IgPSBcIlwiXHJcblxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zTmFtZXMpXHJcbiAgICAgICAgICAgIGVuYy5NM0RFVC5wdXNoKG9NM1BEZXRhbGxlSXRlbXNWYWxzKVxyXG4gICAgICAgICAgICBlbmMuTTNERVQucHVzaChvTTNQRGV0YWxsZUl0ZW1zSWRzKVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IgKyBjb21iaS5Ob21icmUgKyBcIixcIjtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zSWRzLlZhbG9yID0gb00zUERldGFsbGVJdGVtc0lkcy5WYWxvciArIGNvbWJpLklkUHJvbW9jaW9uQ29tYmluYWRhICsgXCIsXCI7XHJcbiAgICAgICAgb00zUERldGFsbGVJdGVtc1ZhbHMuVmFsb3IgPSBvTTNQRGV0YWxsZUl0ZW1zVmFscy5WYWxvciArIGRWYWxvclByb21vQ29tYmkudG9TdHJpbmcoKSArIFwiLFwiO1xyXG5cclxuICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgbGV0IGxpc3ROb21icmUgPSBvTTNQRGV0YWxsZUl0ZW1zTmFtZXMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RJZCA9IG9NM1BEZXRhbGxlSXRlbXNJZHMuVmFsb3IucmVwbGFjZSgvLiQvLCBcIlwiKS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgbGV0IGxpc3RWYWxvciA9IG9NM1BEZXRhbGxlSXRlbXNWYWxzLlZhbG9yLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdElkLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJOT01CX1BST19DT01CSV9cIiArIF9pKTtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGVuYy5NM0RFVCwgbGlzdE5vbWJyZVtfaV0sIFwiSURfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbGl6YXJPQ3JlYXJQRGluYW1pY2EoZW5jLk0zREVULCBsaXN0Tm9tYnJlW19pXSwgXCJWQUxfUFJPX0NPTUJJX1wiICsgX2kpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhY3R1YWxpemFyT0NyZWFyUERpbmFtaWNhKGFycmF5RGluYW1pY2FzOiBBcnJheTxNM1BEZXRhbGxlSXRlbXM+LCBub21icmVEaW5hbWljYTogc3RyaW5nLCBWYWxvckRpbmFtaWNhOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgb00zUERldGFsbGVJdGVtcyA9IGFycmF5RGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IG5vbWJyZURpbmFtaWNhKTtcclxuICAgICAgICBpZiAob00zUERldGFsbGVJdGVtcykge1xyXG4gICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gVmFsb3JEaW5hbWljYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBuZXcgTTNQRGV0YWxsZUl0ZW1zKCk7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuTm9tYnJlQ29uY2VwdG8gPSBub21icmVEaW5hbWljYTtcclxuICAgICAgICAgICAgb00zUERldGFsbGVJdGVtcy5WYWxvciA9IFZhbG9yRGluYW1pY2E7XHJcbiAgICAgICAgICAgIGFycmF5RGluYW1pY2FzLnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBsYSBsaXN0YSBkZSBlbmNhYmV6YWRvcywgcXVlIGFwbGljYW4gYSBsYSBsaXN0YSBjb21iaW5hZGEgcXVlIHRpZW5lXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvbkNvbWJpbmFkYSBPYmpldG8gZGUgcHJvbW9jaW9uIGNvbWJpYW5kYVxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvIE9iamV0byBkZSBNM1Byb2Nlc29cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRFbmNhYmV6YWRvQnlDb21iaShvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEsIGlvTTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPjtcclxuICAgICAgICAgICAgb0xpc3RFbmNhYiA9IGlvTTNQcm9jZXNvLk0zRU5DLmZpbHRlcihlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYy5Qcm9tb0NvbWJpbmFkYXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0UHJvbW9Db21iaW5hZGFFTkMoZW5jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghKGVuYy5JZEVuY1BhZHJlID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5jLlByb21vQ29tYmluYWRhcyAmJiArZW5jLk0zREVULmZpbmQoZCA9PiBkLk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTIwOCBzZSBjYW1iaWEgdmFsaWRhY2lvbiwgcGFyYSBxdWUgdGVuZ2EgZW4gY3VlbnRhIGN1YWxxdWllciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmMuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jLlByb21vQ29tYmluYWRhcy5maW5kKHggPT4geC5JZFByb21vY2lvbkNvbWJpbmFkYSA9PSBvUHJvbW9jaW9uQ29tYmluYWRhLklkUHJvbW9jaW9uQ29tYmluYWRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9MaXN0RW5jYWI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0UHJvbW9Db21iaW5hZGFFTkMob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGV0YWxsZUl0ZW1zOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJQUk9NT0NPTUJJXCIpXHJcbiAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzID0gSlNPTi5wYXJzZShvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhciBsaXN0YSBkZSBwcmVjaW9zIHkgaWQgZGUgZW5jYWJlemFkbywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjaW9uIGxpc3RhIGRlIGVuY2FiZXphZG9zXHJcbiAgICAgKiBAcGFyYW0gb0xpc3RFbmNhYiBMaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByb2Nlc2FyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUHJvY2VzYXJQcm9tb0NvbWJ5QnlMaXN0RW5jKG9MaXN0RW5jYWI6IEFycmF5PE0zUEVuY0l0ZW1zPiwgYkVzQWN1bXVsYWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vL0Rlc0Fjb3BsYXIgbGlzdGEgZGUgZW5jYWJlemFkb3MgYSBwcmVjaW9zIHRvdGFsZXNcclxuICAgICAgICB2YXIgbFByZWNpb3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb0xpc3RFbmNhYi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgZW5jOiBNM1BFbmNJdGVtcyA9IG9MaXN0RW5jYWJbaV07XHJcbiAgICAgICAgICAgIHZhciBuQ2FudGlkYWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG5QcmVjaW9Vbml0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIG5DYW50aWRhZCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3I7XHJcblxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTA3MzAgdmFsaWRhIHNpIGxhIHByb21vY2lvbiBlcyBhY3VtdWxhYmxlLlxyXG4gICAgICAgICAgICBpZiAoYkVzQWN1bXVsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvclxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgblByZWNpb1VuaXQgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ2FudGlkYWQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgbFByZWNpb3MucHVzaCh7IFwiSW5kaWNlXCI6IGosIFwiUFVOSVRORVRPXCI6IG5QcmVjaW9Vbml0LCBcIklEXCI6IGVuYy5JRCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbFByZWNpb3M7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyAvKipcclxuICAgIC8vICAqIENyZWFyIGxpc3RhIGRlIHByZWNpb3MgeSBpZCBkZSBlbmNhYmV6YWRvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgaW5mb3JtYWNpb24gbGlzdGEgZGUgZW5jYWJlemFkb3NcclxuICAgIC8vICAqIEBwYXJhbSBvTGlzdEVuY2FiIExpc3RhIGRlIGVuY2FiZXphZG9zIGEgcHJvY2VzYXJcclxuICAgIC8vICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBQcm9jZXNhclByb21vQ29tYnlCeUxpc3RFbmMob0xpc3RFbmNhYjogQXJyYXk8TTNQRW5jSXRlbXM+LCBiRXNBY3VtdWxhYmxlOiBib29sZWFuKSB7XHJcbiAgICAvLyAgICAgLy8vRGVzQWNvcGxhciBsaXN0YSBkZSBlbmNhYmV6YWRvcyBhIHByZWNpb3MgdG90YWxlc1xyXG4gICAgLy8gICAgIHZhciBsUHJlY2lvcyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAvLyAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvTGlzdEVuY2FiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIHZhciBlbmM6IE0zUEVuY0l0ZW1zID0gb0xpc3RFbmNhYltpXTtcclxuICAgIC8vICAgICAgICAgdmFyIG5DYW50aWRhZDogbnVtYmVyO1xyXG4gICAgLy8gICAgICAgICB2YXIgblByZWNpb1VuaXQ6IG51bWJlcjtcclxuICAgIC8vICAgICAgICAgbkNhbnRpZGFkID0gK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuXHJcbiAgICAvLyAgICAgICAgIC8vSkFHTSAyMDE5MDczMCB2YWxpZGEgc2kgbGEgcHJvbW9jaW9uIGVzIGFjdW11bGFibGUuXHJcbiAgICAvLyAgICAgICAgIGlmIChiRXNBY3VtdWxhYmxlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yXHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICBuUHJlY2lvVW5pdCA9ICtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRcIikuVmFsb3JcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5DYW50aWRhZDsgaisrKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsUHJlY2lvcy5wdXNoKHsgXCJJbmRpY2VcIjogaiwgXCJQVU5JVE5FVE9cIjogblByZWNpb1VuaXQsIFwiSURcIjogZW5jLklEIH0pO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBsUHJlY2lvcztcclxuXHJcbiAgICAvLyB9XHJcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vRklOIFYyIENPTUJJTkFEQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICogUHJvY2VzYXJDb21iaW5hZGFYcG9yWVxyXG4gICAgKiBQcm9jZXNhciBwcm9tb2Npb24gY29tYmluYWRhIHF1ZSBzZSBsbGV2YW4geCBwcm9kdWN0b3MgcG9yIGVsIHByZWNpb24gZGUgeSBwcm9kdWN0b3MuXHJcbiAgICAqL1xyXG4gICAgcHVibGljIFByb2Nlc2FyQ29tYmluYWRhWHBvclkob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG86IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgdmFyIG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgdmFyIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvO1xyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBhZ3JlZ2FkbywgdGllbmUgdW5hIG1pc21hIHByb21vY2lvbiBhY3RpdmEgZW4gbGEgZmFjdHVyYS5cclxuICAgICAgICAvLyBpZiAob00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSAhPSBudWxsICYmIG9NM1Byb2Nlc29zLmxNM1Byb21Db21iaW5hZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vICAgICBtM0NvbWJpbmFkYXhQcm9jZXNvID0gb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYS5maW5kKGNvbWJpbmFkYXMgPT4gY29tYmluYWRhcy5JZFByb21vY2lvbiA9PSBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvbkNvbWJpbmFkYSAmJiBjb21iaW5hZGFzLlRlcm1pbmFkYSA9PSBmYWxzZSk7XHJcbiAgICAgICAgLy8gICAgIC8vVmFsaWRhIHNpIHlhIGV4aXN0ZSB1biBwcm9jZXNvLlxyXG4gICAgICAgIC8vICAgICBpZiAobTNDb21iaW5hZGF4UHJvY2VzbyAhPSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBtM0VuY0FncmVnYWRvLlByb21vQ29tYmluYWRhc1swXS5JZFByb21vY2lvblhQcm9jZXNvID0gbTNDb21iaW5hZGF4UHJvY2Vzby5JZFByb21vY2lvblhQcm9jZXNvO1xyXG4gICAgICAgIC8vICAgICAgICAgLy9UcmFlIGxvcyBFbmNhYmV6YWRvcyBjb24gbGEgcHJvbW9jaW9uIFxyXG4gICAgICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jcyA9PiBlbmNzLlByb21vQ29tYmluYWRhcyAhPSBudWxsICYmIGVuY3MuUHJvbW9Db21iaW5hZGFzLmxlbmd0aCA+IDAgJiYgZW5jcy5Qcm9tb0NvbWJpbmFkYXNbMF0uSWRQcm9tb2Npb25YUHJvY2VzbyA9PSBtM0NvbWJpbmFkYXhQcm9jZXNvLklkUHJvbW9jaW9uWFByb2Nlc28pO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJvbW9YUG9yWShtM0VuY3NDb25Qcm9tbywgbTNDb21iaW5hZGF4UHJvY2Vzbyk7XHJcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkFncmVnYXJQcm9tb2Npb25Db21iaW5hZGFBUHJvY2VzbyhvTTNQcm9jZXNvcywgbTNFbmNBZ3JlZ2Fkby5Qcm9tb0NvbWJpbmFkYXNbMF0pO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb00zUHJvY2Vzb3MubE0zUHJvbUNvbWJpbmFkYSA9IG5ldyBBcnJheTxNM1Byb21Db21iaW5hZGFYUHJvY2Vzbz4oKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5BZ3JlZ2FyUHJvbW9jaW9uQ29tYmluYWRhQVByb2Nlc28ob00zUHJvY2Vzb3MsIG0zRW5jQWdyZWdhZG8uUHJvbW9Db21iaW5hZGFzWzBdKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vcmVjYWxjdWxhciBwcm9tb2Npb24sIGRlcGVuZGllbmRvIGRlIGxhIGluZm9ybWFjaW9uIGRlIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIC8vMS5WYWxpZGFyIHNpIHlhIGVzdGFuIHRvZG9zIGxvcyBpdGVtcyBwYXJhIHJlY2FsY3VsYXIgbGEgcHJvbW9jaW9uXHJcbiAgICAvLzIuIE9yZGVuYXIgbG9zIGVuY2FiZXphZG9zIGRlIG1heW9yIGEgbWVub3IgcHJlY2lvLlxyXG4gICAgLy8zLiBEZWphciBlbCBwcmVjaW8gZGUgbG9zIGl0ZW1zIGRlIG1lbm9yIHByZWNpb24gZW4gMFxyXG4gICAgLy8gcHVibGljIFJlY2FsY3VsYXJQcm9tb1hQb3JZKG0zRW5jc0NvblByb21vOiBBcnJheTxNM1BFbmNJdGVtcz4sIG0zQ29tYmluYWRheFByb2Nlc286IE0zUHJvbUNvbWJpbmFkYVhQcm9jZXNvKSB7XHJcbiAgICAvLyAgICAgdmFyIG9Qcm9tb2Npb25Db21iaW5hZGE6IFByb21vY2lvbkNvbWJpbmFkYTtcclxuICAgIC8vICAgICB2YXIgdmFyeDogbnVtYmVyO1xyXG4gICAgLy8gICAgIHZhciB2YXJ5OiBudW1iZXI7XHJcbiAgICAvLyAgICAgdmFyIHBhcnRlRGVjWTogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvUHJvbW9jaW9uQ29tYmluYWRhID0gbTNFbmNzQ29uUHJvbW9bMF0uUHJvbW9Db21iaW5hZGFzWzBdO1xyXG5cclxuICAgIC8vICAgICB2YXJ4ID0gcGFyc2VGbG9hdChvUHJvbW9jaW9uQ29tYmluYWRhLlRpcG8yLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnNwbGl0KFwiX1wiKVsxXS5zcGxpdChcIlhcIilbMF0pO1xyXG4gICAgLy8gICAgIHZhcnkgPSBwYXJzZUZsb2F0KG9Qcm9tb2Npb25Db21iaW5hZGEuVGlwbzIudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3BsaXQoXCJfXCIpWzFdLnNwbGl0KFwiWFwiKVsxXSk7XHJcblxyXG4gICAgLy8gICAgIGlmIChTdHJpbmcodmFyeSkuaW5jbHVkZXMoXCIuXCIpKSB7XHJcbiAgICAvLyAgICAgICAgIHBhcnRlRGVjWSA9IHBhcnNlRmxvYXQob1Byb21vY2lvbkNvbWJpbmFkYS5UaXBvMi50cmltKCkudG9VcHBlckNhc2UoKS5zcGxpdChcIl9cIilbMV0uc3BsaXQoXCJYXCIpWzFdLnNwbGl0KFwiLlwiKVsxXSk7XHJcbiAgICAvLyAgICAgICAgIHZhcnkgPSBwYXJzZUZsb2F0KFN0cmluZyh2YXJ5KS5zcGxpdChcIi5cIilbMF0pO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgaWYgKHZhcnggPT0gbTNFbmNzQ29uUHJvbW8ubGVuZ3RoKSB7XHJcbiAgICAvLyAgICAgICAgIG0zQ29tYmluYWRheFByb2Nlc28uVGVybWluYWRhID0gdHJ1ZTtcclxuICAgIC8vICAgICAgICAgLy9PcmRlbmFyIGxvcyBlbmNhYmV6YWRvcyBwb3IgcHJlY2lvIG1heW9yIGEgbWVub3JcclxuICAgIC8vICAgICAgICAgbTNFbmNzQ29uUHJvbW8gPSBtM0VuY3NDb25Qcm9tby5zb3J0KChhLCBiKSA9PlxyXG4gICAgLy8gICAgICAgICAgICAgKGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yIDwgYi5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpID8gMSA6XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKChiLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUTkVUT1wiKS5WYWxvciA8IGEuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKSA/IC0xIDogMCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtM0VuY3NDb25Qcm9tby5sZW5ndGg7IGkrKykge1xyXG4gICAgLy8gICAgICAgICAgICAgLy9WYWxpZGEgc2kgeWEgXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGFydGVEZWNZICE9IDAgJiYgKCtpKSA9PSAoK3ZhcnkpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFydGVEZWNZKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSAoKCttM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpICogKCsoK3BhcnRlRGVjWSkgLyAxMDApKS50b1N0cmluZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfSBlbHNlIGlmICgoK2kpICsgMSA+IHZhcnkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtM0VuY3NDb25Qcm9tb1tpXS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IgPSBcIjBcIjtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBGaW4gUHJvY2VzYW1pZW50byBDb21iaW5hZGEgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRvdGFsIGRlIHB1bnRvcyBkZSBmaWRlbGl6YWNpb24gZW4gbGEgdHJhbnNhY2Npw4PCs24gcmVkb25kZWFkb3MgaGFjw4PCrWEgYWJham9cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF90b3RhbF9maWRlbGl6YWNpb24ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgdG90YWxfZmlkZWxpemFjaW9uID0gMDtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcy5NM0VOQyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvdGFsX2ZpZGVsaXphY2lvbiA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiRklERUxJWkFDSU9OXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoKCgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkZJREVMSVpBQ0lPTlwiKS5WYWxvcikgLyAxMDApICogKCtjdXIuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpKSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9TZSByZWRvbmRlYXJhIG5vIGFjYSBzaW5vIGVuIGxhIHN1bWEgdG90YWwgZGVsIGZpZGVsaXphY2lvbiBkZSBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAgICByZXR1cm4gdG90YWxfZmlkZWxpemFjaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBlbCB2YWxvciBkZWwgZmlkZWxpemFjaW9uIGRlIHVuIHByb2Nlc28sIGV2YWx1YW5kbyBjYWRhIGZvcm1hIGRlIHBhZ29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPikge1xyXG5cclxuICAgICAgICB2YXIgcGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIgPSBwcm9jZXNvLlZhbG9yTmV0bztcclxuICAgICAgICAvL3ZhciBtYXhfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSB0aGlzLmdldF90b3RhbF9maWRlbGl6YWNpb24ocHJvY2Vzbyk7XHJcbiAgICAgICAgdmFyIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICB2YXIgbGlzdF9jb25kaV9wcm9tbyA9IHRoaXMuZ2V0X2xpc3RfY29uZGlfcHJvbW9fYnlfYWN0aXZpZGFkKGxpc3RfZW5jX3Byb21vLCBcIlBBR09cIiwgXCJNT05FREVST1wiKTtcclxuXHJcbiAgICAgICAgaWYgKHByb2Nlc28ubE0zUEVuY0ZQKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBwcm9jZXNvLmxNM1BFbmNGUC5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtYV9wYWdvOiBNM1BFbmNGUCA9IHByb2Nlc28ubE0zUEVuY0ZQW19pXTtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9tb0FwbGljYWRhOiBNM0NPTkRJUFJPTU87XHJcbiAgICAgICAgICAgICAgICBsZXQgYXBsaWNhX2ZpZGVsaXphY2lvbiA9IHRoaXMudmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvLCBsaXN0X2NvbmRpX3Byb21vKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXBsaWNhX2ZpZGVsaXphY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yUGFnbyA9IGZvcm1hX3BhZ28uVmFsb3IgLSBmb3JtYV9wYWdvLlZhbENhbWJpbztcclxuICAgICAgICAgICAgICAgICAgICByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbiArPSB0aGlzLmNhbGN1bGF0ZV9maWRlbGl6YWNpb25fYnlfZm9ybWFfcGFnbyhwYWdvX3RvdGFsX3Byb2Nlc28sIHByb2Nlc28uTTNFTkMsIHZhbG9yUGFnbywgYXBsaWNhX2ZpZGVsaXphY2lvbiwgbGlzdF9lbmNfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiAocmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPiBtYXhfdmFsdWVfZmlkZWxpemFjaW9uKSB7XHJcbiAgICAgICAgLy8gICAgIHJlYWxfdmFsdWVfZmlkZWxpemFjaW9uID0gbWF4X3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmVhbF92YWx1ZV9maWRlbGl6YWNpb24gPSB0aGlzLm9NYXRoVEYucm91bmQocmVhbF92YWx1ZV9maWRlbGl6YWNpb24sIDIpO1xyXG4gICAgICAgIHJldHVybiByZWFsX3ZhbHVlX2ZpZGVsaXphY2lvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBkZSB0aXBvIGRlIHBhZ28gYSBwYXJ0aXIgZGUgQXJyYXk8TTNDT05ESVBST01PPlxyXG4gICAgICogQHBhcmFtIGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkbyAuXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zRW5jSXRlbSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvOiBBcnJheTxNM0NPTkRJUFJPTU8+LCBsaXN0TTNFbmNJdGVtOiBBcnJheTxNM1BFbmNJdGVtcz4pOiBBcnJheTxNM0NPTkRJUFJPTU8+IHtcclxuICAgICAgICBsZXQgcmVzdHJpY2Npb25lc0FjdGl2YXMgPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIGlmIChsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgbGlzdE0zRW5jSXRlbS5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0TTNEZXQgPSBsaXN0TTNFbmNJdGVtW19pXS5NM0RFVDtcclxuICAgICAgICAgICAgICAgIGlmICgrbGlzdE0zRW5jSXRlbVtfaV0uTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW9jaW9uZXMgPSBsaXN0TTNEZXQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJJRF9QUk9NT0NcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkUHJvbW9jaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkUHJvbW8gPSBpZFByb21vY2lvbmVzLlZhbG9yLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGlkUHJvbW8ubGVuZ3RoOyBfaysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSAraWRQcm9tb1tfa107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGlQcm9tbyA9IGxpc3RDb25kaVByb21vVFBSZXN0cmluZ2lkby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZGlQcm9tbyAmJiAhcmVzdHJpY2Npb25lc0FjdGl2YXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb24gPT0gcHJvbW8pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY2Npb25lc0FjdGl2YXMucHVzaChjb25kaVByb21vKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN0cmljY2lvbmVzQWN0aXZhcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgbGFzIHJlc3RyaWNjaW9uZXMgQWN0aXZhcyBwYXJhIGxvcyBwcm9kdWN0b3MgZGVsIHByb2Nlc28gYWN0dWFsXHJcbiAgICAgKiBAcGFyYW0gbGlzdEVuY1Byb21vIFxyXG4gICAgICogQHBhcmFtIGxpc3RNM0VuY0l0ZW0gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRSZXN0cmljY2lvbmVzVGlwb1BhZ29BY3RpdmFzRnJvbUVuY1Byb21vKGxpc3RFbmNQcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGxpc3RNM0VuY0l0ZW06IEFycmF5PE0zUEVuY0l0ZW1zPikge1xyXG4gICAgICAgIGxldCBsaXN0Q29uZGlQcm9tb1RQUmVzdHJpbmdpZG8gPSB0aGlzLmdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0RW5jUHJvbW8sIFwiUEFHT1wiLCBcIlJFU1RSSUNDSU9OX1BBR09cIik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlc3RyaWNjaW9uZXNUaXBvUGFnb0FjdGl2YXMobGlzdENvbmRpUHJvbW9UUFJlc3RyaW5naWRvLCBsaXN0TTNFbmNJdGVtKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGxvcyBtb3ZpbWllbnRvcyByZWFsaXphZG9zIHBvciB1biBtM3NhbGRvc3hjdWVudGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRrYXRpb3M6IHN0cmluZywgZGF0YTogYW55LFxyXG4gICAgICAgIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy92YXIgZGF0YSA9IHsgXCJpZF9tM1wiOiBpZG0zLCBcImlkX3Byb2Nlc29cIjogcHJvY2VzbyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zL20zX2dldF9tb3ZpbWllbnRvc19maWRlbGl6YWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgbW92cyA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BfbW92czogQXJyYXk8YW55PjtcclxuICAgICAgICAgICAgaWYgKCFtb3ZzLk1PVlMuTU9WLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgICAgIHJlc3BfbW92cy5wdXNoKG1vdnMuTU9WUy5NT1YpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzcF9tb3ZzID0gbW92cy5NT1ZTLk1PVjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3BfbW92cyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGxhIGZvcm1hIGRlIHBhZ28gY3VtcGxlIGFsZ3VuYSBjb25kaWNpb24gZGUgZmlkZWxpemFjaW9uXHJcbiAgICAgKiBAcGFyYW0gZm9ybWFfcGFnbyBcclxuICAgICAqIEBwYXJhbSBsaXN0X2NvbmRpX3Byb21vOiBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIGRlIGZpZGVsaXphY2lvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdmFsaWRhdGVfY29uZGlfYnlfZm9ybWFfcGFnbyhmb3JtYV9wYWdvOiBNM1BFbmNGUCwgbGlzdF9jb25kaV9wcm9tbzogQXJyYXk8TTNDT05ESVBST01PPikge1xyXG4gICAgICAgIC8vcmV0dXJuIGxpc3RfY29uZGlfcHJvbW9bMF07XHJcbiAgICAgICAgbGV0IHByb21vc0FwbGljYWRhcyA9IG5ldyBBcnJheTxNM0NPTkRJUFJPTU8+KCk7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGxpc3RfY29uZGlfcHJvbW8ubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb25kaV9wcm9tbyA9IGxpc3RfY29uZGlfcHJvbW9bX2ldO1xyXG4gICAgICAgICAgICB2YXIgakFkaWNpb25hbGVzID0gSlNPTi5wYXJzZShjb25kaV9wcm9tby5KQWRpY2lvbmFsZXMpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChjb25kaV9wcm9tby5Db25jZXB0by50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJJRF9QQUdPXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TaSBlbCBvcGVyYWRvciBlcyBESUZGIGNyZWEgdW5hIGV4cHJlc2lvbiByZWd1bGEgcGFyYSBleGNsdWlyIGxvIHRpcG9kZXBhZ28gY29uZmlndXJhZG9zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkVzdHJ1Y3R1cmEgJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gJiYgakFkaWNpb25hbGVzLlJPT1QuRXN0cnVjdHVyYS5PcGVyYWNpb24gPT0gXCJESUZGXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGlfcHJvbW8uVmFsb3IgPSBcIl4oPyEoXCIgKyBjb25kaV9wcm9tby5WYWxvciArIFwiKVxcXFxiKVxcXFx3KyRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpX3Byb21vLlZhbG9yID0gXCJeKFwiICsgY29uZGlfcHJvbW8uVmFsb3IgKyBcIikkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAoY29uZGlfcHJvbW8uVmFsb3IsIFwiaVwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmUudGVzdChmb3JtYV9wYWdvLklkVGlwb1BhZ28udG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW9zQXBsaWNhZGFzLnB1c2goY29uZGlfcHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvbW9zQXBsaWNhZGFzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCBsaXN0YWRvIGRlIGNvbmRpY2lvbmVzIHZhbGlkYXMgcGFyYSB1bmEgYWN0aXZpZGFkIGRhZGFcclxuICAgICAqIEBwYXJhbSBsaXN0X2VuY19wcm9tbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2NvbmRpX3Byb21vX2J5X2FjdGl2aWRhZChsaXN0X2VuY19wcm9tbzogQXJyYXk8TTNFTkNQUk9NTz4sIGFjdGl2aWRhZDogc3RyaW5nLCB0aXBvMjogc3RyaW5nKTogQXJyYXk8TTNDT05ESVBST01PPiB7XHJcbiAgICAgICAgdmFyIGxpc3RfY29uZGlfcHJvbW86IEFycmF5PE0zQ09ORElQUk9NTz4gPSBuZXcgQXJyYXk8TTNDT05ESVBST01PPigpO1xyXG4gICAgICAgIHZhciBob3kgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAobGlzdF9lbmNfcHJvbW8pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2sgPSAwOyBfayA8IGxpc3RfZW5jX3Byb21vLmxlbmd0aDsgX2srKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuY2FiZXphZG9Qcm9tbyA9IGxpc3RfZW5jX3Byb21vW19rXTtcclxuICAgICAgICAgICAgICAgIHZhciBkVmlnZW5jaWEgPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uVmlnZW5jaWEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGRJbmljaW8gPSBuZXcgRGF0ZShlbmNhYmV6YWRvUHJvbW8uSW5pY2lvKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbmNhYmV6YWRvUHJvbW8uRXN0YWRvICYmIGRWaWdlbmNpYSA+PSBob3kgJiYgZEluaWNpbyA8PSBob3kgJiYgZW5jYWJlemFkb1Byb21vLlRpcG8yID09IHRpcG8yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IGVuY2FiZXphZG9Qcm9tby5NM0NPTkRJQUdSVVBBQ0lPTi5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX2FncnVwYWNpb24gPSBlbmNhYmV6YWRvUHJvbW8uTTNDT05ESUFHUlVQQUNJT05bX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgX2ogPSAwOyBfaiA8IGNvbmRpX2FncnVwYWNpb24uTTNDT05ESVBST01PLmxlbmd0aDsgX2orKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpX3Byb21vID0gY29uZGlfYWdydXBhY2lvbi5NM0NPTkRJUFJPTU9bX2pdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKGNvbmRpX3Byb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpBZGljaW9uYWxlcy5ST09ULkFDVElWSURBRCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BQ1RJVklEQUQgPT0gYWN0aXZpZGFkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfY29uZGlfcHJvbW8ucHVzaChjb25kaV9wcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jb25kaV9wcm9tbztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGEgZWwgdmFsb3IgZGVsIGZpZGVsaXphY2lvbiBkZSB1bmEgZm9ybWEgZGUgcGFnbyBkZSBhY3VlcmRvIGEgc3UgcG9yY2VudGFqZSByZXNwZWN0byBlbCB2YWxvciB0b3RhbCBkZWwgcHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHBhZ29fdG90YWxfcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSBtYXhfdmFsdWVfZmlkZWxpemFjaW9uIFxyXG4gICAgICogQHBhcmFtIHZhbHVlX2Zvcm1hX3BhZ28gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWxjdWxhdGVfZmlkZWxpemFjaW9uX2J5X2Zvcm1hX3BhZ28ocGFnb190b3RhbF9wcm9jZXNvOiBudW1iZXIsIGxpc3RNM0VuYzogTTNQRW5jSXRlbXNbXSwgdmFsdWVfZm9ybWFfcGFnbzogbnVtYmVyLCBwcm9tb3NBcGxpY2FkYTogQXJyYXk8TTNDT05ESVBST01PPiwgbGlzdF9lbmNfcHJvbW86IEFycmF5PE0zRU5DUFJPTU8+KSB7XHJcbiAgICAgICAgbGV0IGxpc3RQcm9tb3NBcGxpY2FkYXM7XHJcbiAgICAgICAgbGV0IGRldGFsbGVJZFByb21vYztcclxuICAgICAgICBsZXQgdmFsb3JGaWRlbGl6YWNpb24gPSAwO1xyXG4gICAgICAgIGxldCBwZXJjZW50X2Zvcm1hX3BhZ286IG51bWJlciA9IHZhbHVlX2Zvcm1hX3BhZ28gLyBwYWdvX3RvdGFsX3Byb2Nlc287XHJcbiAgICAgICAgdmFyIHByZWNpb1Byb2R1Y3RvID0gMDtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdE0zRW5jKSB7XHJcbiAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZGV0YWxsZUlkUHJvbW9jID0gaXRlbS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIklEX1BST01PQ1wiKTtcclxuICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSAraXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgbGV0IHByZWNpb1NSID0gaXRlbS5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9TUlwiKTtcclxuICAgICAgICAgICAgaWYgKHByZWNpb1NSICE9IG51bGwgJiYgcHJlY2lvU1IuVmFsb3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHJlY2lvUHJvZHVjdG8gPSArcHJlY2lvU1IuVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRldGFsbGVJZFByb21vYyAmJiBkZXRhbGxlSWRQcm9tb2MuVmFsb3IpIHtcclxuICAgICAgICAgICAgICAgIGxpc3RQcm9tb3NBcGxpY2FkYXMgPSBkZXRhbGxlSWRQcm9tb2MuVmFsb3Iuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbW9BcGwgb2YgcHJvbW9zQXBsaWNhZGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0UHJvbW9zQXBsaWNhZGFzLmZpbmQoeCA9PiAreCA9PSBwcm9tb0FwbC5JZFByb21vY2lvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW8gPSBsaXN0X2VuY19wcm9tby5maW5kKHggPT4geC5JZFByb21vY2lvbiA9PSBwcm9tb0FwbC5JZFByb21vY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbG9yID0gdGhpcy52YWxpZGFyUmVkb25kZW8ocHJvbW8sIHByZWNpb1Byb2R1Y3RvICogdGhpcy5nZXRQb3JjZW50YWplRmlkZWxpemFjaW9uRnJvbUVuY1Byb21vKHByb21vKSAvIDEwMCkgKiAocGVyY2VudF9mb3JtYV9wYWdvKTtcclxuICAgICAgICAgICAgICAgICAgICB2YWxvckZpZGVsaXphY2lvbiArPSB2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3JGaWRlbGl6YWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9yY2VudGFqZUZpZGVsaXphY2lvbkZyb21FbmNQcm9tbyhwcm9tbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXJSZWRvbmRlbyhwcm9tbywgdmFsb3I6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBqQWRpY2lvbmFsZXMgPSBKU09OLnBhcnNlKHByb21vLkpBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIGlmIChqQWRpY2lvbmFsZXMuUk9PVCAmJiBqQWRpY2lvbmFsZXMuUk9PVC5BY2Npb24gJiYgakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yLCArakFkaWNpb25hbGVzLlJPT1QuQWNjaW9uLlJlZG9uZGVvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWxvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hIHVuYSBkaW5hbWljYSBjb24gZWwgdmFsb3IgZGUgbGEgZmlkZWxpemFjacODwrNuIGRlIGRpY2hvIHByb2Nlc28geSByZXRvcm5hIGRpY2hvIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIGxpc3RfZW5jX3Byb21vIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkX2RpbmFtaWNhX2ZpZGVsaXphY2lvbl90b19wcm9jZXNvKHByb2Nlc286IE0zUHJvY2Vzb3MsIGxpc3RfZW5jX3Byb21vOiBBcnJheTxNM0VOQ1BST01PPik6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIHZhciB2YWx1ZV9maWRlbGl6YWNpb24gPSAwXHJcbiAgICAgICAgaWYgKGxpc3RfZW5jX3Byb21vKSB7XHJcbiAgICAgICAgICAgIHZhbHVlX2ZpZGVsaXphY2lvbiA9IHRoaXMuZ2V0X3ZhbHVlX2ZpZGVsaXphY2lvbl9ieV9wcm9jZXNvKHByb2Nlc28sIGxpc3RfZW5jX3Byb21vKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZV9maWRlbGl6YWNpb24gPiAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYV9maWRlbGl6YWNpb246IE0zUERpbmFtaWNhcyA9IG5ldyBNM1BEaW5hbWljYXMoKTtcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLk5vbWJyZSA9IFwiRklERUxJWkFDSU9OXCJcclxuICAgICAgICAgICAgZGluYW1pY2FfZmlkZWxpemFjaW9uLlZhbG9yID0gdmFsdWVfZmlkZWxpemFjaW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgICAgICBwcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChkaW5hbWljYV9maWRlbGl6YWNpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgbGEgZXhpc3RlbmNpYSBkZSB1biBkb2N1bWVudG8gZGUgZmlkZWxpemFjaW9uIGVuIGxhIHRhYmxhIE0zU2FsZG9zWEN1ZW50YVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRvIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWxpZGF0ZV9kb2NfZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhdGVfZG9jX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzYWxkb194X2N1ZW50YTtcclxuICAgICAgICAgICAgc2FsZG9feF9jdWVudGEgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkuUkVTUFVFU1RBLk0zU2FsZG9zWEN1ZW50YTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHNhbGRvX3hfY3VlbnRhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3R1YWxpemEgZWwgc2FsZG8gc3VtYW5kb2xlIGVsIHZhbG9yIGVudmlhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdHVhbGl6YXJfc2FsZG9fZmlkZWxpemFjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgLy9kYXRhID0ge1wiZG9jdW1lbnRvXCI6ZG9jdW1lbnRvLCBcInZhbG9yX21vdmltaWVudG9cIjp2YWxvcl9tb3ZpZW50bywgXCJwYWdvXCI6cGFnbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9hY3R1YWxpemFyX3NhbGRvX2ZpZGVsaXphY2lvbi9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEucGFnby5pZERpYXJpbyA9IHJlc3BbXCJfYm9keVwiXS5yZXBsYWNlKCdcIicsICcnKS5yZXBsYWNlKCdcIicsICcnKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKGRhdGEucGFnbyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBVbiBib25vIGRlIGRldm9sdWNpb24gcG9yIGVsIHZhbG9yIGRhZG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgPSB7XCJwcm9jZXNvXCIscHJvY2VzbyxcInZhbG9yXCI6dmFsb3J9XHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG0zX2dlbmVyYXJfYm9ub19kZXZvbHVjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlka2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvbTNfZ2VuZXJhcl9ib25vX2Rldm9sdWNpb24vXCIgKyBpZGthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWEgdW4gbnVldm8gcmVnaXN0cm8gZW4gbGEgdGFibGEgU2FsZG9YQ3VlbnRhXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBpZGthdGlvcyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM0luc2VydFNhbGRvWEN1ZW50YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIC8vdmFyIGRhdGEgPSB7ICdEb2N1bWVudG8nOiB0aGlzLmRvY3VtZW50bywgJ1REb2NUaXR1bGFyJzogJzUnLCAnTkRvY1RpdHVsYXInOiB0aGlzLm5kb2NfY2xpZW50ZSwgJ05vbUN1ZW50YSc6ICdGSURFTElaQUNJT04nLCAnVmFsQ3VlbnRhJzogMCB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNMy9tM0luc2VydFNhbGRvWEN1ZW50YS9cIiArIGlka2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKE0zRU5DOiBBcnJheTxNM1BFbmNJdGVtcz4pIHtcclxuICAgICAgICBpZiAoTTNFTkMpIHtcclxuICAgICAgICAgICAgdmFyIGRDYW50aWRhZCA9IE0zRU5DLmZpbHRlcihlbmMgPT4gKCtlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpID4gMCkuXHJcbiAgICAgICAgICAgICAgICByZWR1Y2UoKGFjYywgY3VyKSA9PiAoYWNjKSArICgrY3VyLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSwgMCk7XHJcbiAgICAgICAgICAgIGlmIChkQ2FudGlkYWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoQ29uZmlnTFBTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBpZGthdGlvczogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRGbGFnU3luY0NvdWNoKCkge1xyXG4gICAgICAgIHZhciBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIHZhciBvU1ViaWNhY2lvbjtcclxuICAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAgICAgbGV0IGNvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5NM0hVQlMgJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKG9TVWJpY2FjaW9uLk0zSFVCU1swXS5Db25maWd1cmFjaW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gbnVsbCAmJiBjb25maWcuU3luY0NvdWNoQXV0byAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmbGFnID0gY29uZmlnLlN5bmNDb3VjaEF1dG87XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJDb25maWdMUF9cIiArIHRoaXMuaWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJhZGFwdGVyXCIpXHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLmRhdGFiYXNlLmFkYXB0ZXIpO1xyXG4gICAgICAgIHZhciBzSWRrYXRpb3M6IHN0cmluZztcclxuXHJcbiAgICAgICAgLy8gdGhpcy52YWxpZGFyUGFxdWV0ZXMoKVxyXG4gICAgICAgIHRoaXMuc3luY0NvdWNoKCk7XHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIENPTkZJR0xQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vIHZhbGlkYXJQYXF1ZXRlcygpIHtcclxuICAgIC8vICAgICBpZiAodGhpcy5hcGxQYXF1ZXRlcykge1xyXG4gICAgLy8gICAgICAgICBsZXQgdWJpY2FjaW9uID0gdGhpcy5nZXRVYmljYWNpb24oKTtcclxuICAgIC8vICAgICAgICAgaWYgKHViaWNhY2lvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNhXCIgKyB1YmljYWNpb24gKyBcIl9cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvbmZpZ2xwX1wiICsgdGhpcy5pZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VWJpY2FjaW9uKCkge1xyXG4gICAgICAgIGxldCBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIGxldCBvU1ViaWNhY2lvbjtcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIC8vIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgLy8gICAgIHZhciBLYXRpb3MgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnS2F0aW9zXCIgKyB0aGlzLmlka2F0aW9zLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgLy8gICAgIGlmIChLYXRpb3MgIT09IHVuZGVmaW5lZCAmJiBLYXRpb3MgIT0gbnVsbCkge1xyXG4gICAgLy8gICAgICAgICB2YXIgakthdGlvc00zID0gSlNPTi5wYXJzZShLYXRpb3MpO1xyXG4gICAgLy8gICAgICAgICBpZiAoakthdGlvc00zICYmIGpLYXRpb3NNMy5LYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zTTMuYXBsUGFxcykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hcGxQYXF1ZXRlcyA9IGpLYXRpb3NNMy5LYXRpb3NNMy5hcGxQYXFzXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koaWRrYXRpb3MpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFwbFN5bmNDb3VjaEF1dG8gPSB0aGlzLmdldEZsYWdTeW5jQ291Y2goKTtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRoaXMuYXBsU3luY0NvdWNoQXV0byxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBDT05GSUdMUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gQ09ORklHTFAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgLy8gYm9vLCBzb21ldGhpbmcgd2VudCB3cm9uZyFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0KGlkOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUxwKGlkKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5nZXQoaWQpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UucmVtb3ZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERlbGV0ZUFsbERvY3MoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pLnRoZW4oYWxsRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxEb2NzLnJvd3MubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBfaWQ6IHJvdy5pZCwgX3Jldjogcm93LmRvYy5fcmV2LCBfZGVsZXRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KS50aGVuKGRlbGV0ZURvY3MgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5idWxrRG9jcyhkZWxldGVEb2NzKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgeyBDb3VjaENvbmZpZ0xQU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLWNvbmZpZ2xwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTWF0aFRGIH0gZnJvbSBcIi4uL01pc2NlbGFuZWEvTWF0aFRGLmNsYXNzXCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvIHtcclxuICAgIHByaXZhdGUgb01hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgZ3NpZGthdGlvczogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBhcGxQcmVjaW9zRGluYW1pY29zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWRrYXRpb3MpIHtcclxuICAgICAgICB0aGlzLmdzaWRrYXRpb3MgPSBpZGthdGlvcztcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICBsZXQgS2F0aW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJDb25maWdLYXRpb3NcIiArIHRoaXMuZ3NpZGthdGlvcy50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoS2F0aW9zICE9PSB1bmRlZmluZWQgJiYgS2F0aW9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIGpLYXRpb3NNMyA9IEpTT04ucGFyc2UoS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYgKGpLYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zICYmIGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhcGwgPSBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zLmZpbmQoeCA9PiB4LkxsYXZlLnRvVXBwZXJDYXNlKCkgPT0gXCJBUExMUERJTkFNSUNPU1wiKTtcclxuICAgICAgICAgICAgICAgIGlmIChhcGwgJiYgYXBsLlZhbG9yID09IFwiMVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGxQcmVjaW9zRGluYW1pY29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLy9Bc2lnbmFyIGxpc3RhIGRlIHByZWNpb3MsIHNlZ3VuIGxpc3RhIGRlIHByZWNpb3MgYXNvY2lhZG8gYSB1c3VhcmlvIHBvciBjYWRhIHVqbm8gZGUgIGxvcyBwcm9kdWN0b3MgaGlqb3NcclxuICAgIHB1YmxpYyBhc3luYyBBc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvOiBUeXBlTTNQcmRHcnAsIG9EYXRhVXNlcjogYW55LCBvUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMykge1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9NM1ByZEdycEFzb2NpYWRvIG9mIFByb2R1Y3RvTWFlc3Ryby5NM1ByZEdycEFzb2NpYWRvKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuQXNpZ25hckxpc3RhUHJlY2lvKG9NM1ByZEdycEFzb2NpYWRvLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmRHZW5lcmFsIG9mIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbCkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG0zUGFjayBvZiBwcmRHZW5lcmFsLk0zUEFDSykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW8obTNQYWNrLk0zR1JQLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vL0FzaWduYXIgbGlzdGEgZGUgcHJlY2lvcywgc2VndW4gbGlzdGEgZGUgcHJlY2lvcyBhc29jaWFkbyBhIHVzdWFyaW8uXHJcbiAgICBwdWJsaWMgYXN5bmMgQXNpZ25hckxpc3RhUHJlY2lvKFByb2R1Y3RvTWFlc3RybzogVHlwZU0zUHJkR3JwLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT09IHVuZGVmaW5lZCAmJiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvICE9IC0xICYmIFByb2R1Y3RvTWFlc3Rybykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByZEdybCA9IFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkR2VuZXJhbFtpXTtcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8uc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBzcGxpdFByZWNpb1swXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0xpc3RhRmluZGVkICYmIHNwbGl0UHJlY2lvICYmIHNwbGl0UHJlY2lvLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBsUHJlY2lvc0RpbmFtaWNvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0UHJlY2lvWzFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTEJcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuUFJFQ0lPID0gb0xpc3RhRmluZGVkLkxCO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxDXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IG9MaXN0YUZpbmRlZC5MQztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9MaXN0YUZpbmRlZC5QUkVDSU8gPSBvTGlzdGFGaW5kZWQuTEQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9Db3VjaENvbmZpZ0xQU2VydmljZSA9IG5ldyBDb3VjaENvbmZpZ0xQU2VydmljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpc3RhQ291Y2ggPSBhd2FpdCBvQ291Y2hDb25maWdMUFNlcnZpY2UuZ2V0KHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpDb25maWdMUCA9IEpTT04ucGFyc2UobGlzdGFDb3VjaC5KQ29uZmlndXJhY2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoakNvbmZpZ0xQICYmIGpDb25maWdMUC5GYWN0b3JlcyAmJiBqQ29uZmlnTFAuRmFjdG9yZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmYWN0b3IgPSBwYXJzZUZsb2F0KGpDb25maWdMUC5GYWN0b3Jlcy5maW5kKHggPT4geC5Ob21icmUgPT0gc3BsaXRQcmVjaW9bMV0pLkZhY3Rvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb0xpc3RhRmluZGVkLlBSRUNJTyA9IHRoaXMub01hdGhURi5yb3VuZChvTGlzdGFGaW5kZWQuUFJFQ0lPICogZmFjdG9yLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvTGlzdGFGaW5kZWQuTTNQcmVzZW50YWNpb25lcy5mb3JFYWNoKHByZXNlbnRhY2lvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhY2lvbi5WQUxPUiA9IHRoaXMub01hdGhURi5yb3VuZChwcmVzZW50YWNpb24uVkFMT1IgKiBmYWN0b3IsIDIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGVuIGFzaWduYXJsaXN0YXByZWNpbzogXCIgKyBFeC5tZXNzYWdlICsgXCIgLSBcIiArIHNwbGl0UHJlY2lvWzBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChvTGlzdGFGaW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHByZEdybC5Mb00zUHJkTGlzdGEgPSBvTGlzdGFGaW5kZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuVmFsaWRhckRhdGFGcm9tSW52ZW50YXJpbyhwcmRHcmwsIG9EYXRhVXNlciwgb1Bvc3RTZXJ2aWNlTTMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBvTTNQcmRBZGljaW9uYWxlcyA9IG5ldyBNM1ByZEFkaWNpb25hbGVzKCk7XHJcbiAgICAgICAgICAgIG9NM1ByZEFkaWNpb25hbGVzLkFUUklCVVRPID0gXCJMSVNUQVBSRUNJT1wiO1xyXG4gICAgICAgICAgICBvTTNQcmRBZGljaW9uYWxlcy5WQUxPUiA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW87XHJcbiAgICAgICAgICAgIFByb2R1Y3RvTWFlc3Ryby5Mb00zUHJkQWRpY2lvbmFsZXMucHVzaChvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChQcm9kdWN0b01hZXN0cm8pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5Bc2lnbmFyTGlzdGFQcmVjaW9NM1BhY2soUHJvZHVjdG9NYWVzdHJvLCBvRGF0YVVzZXIsIG9Qb3N0U2VydmljZU0zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIEFzaWduYXJMaXN0YVByZWNpb0FHZW5lcmFsKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbyAhPT0gdW5kZWZpbmVkICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JRExQcmVjaW8gIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIG9MaXN0YUZpbmRlZCA9IHByZEdybC5Mb00zTGlzdGFQcmVjaW8uZmluZChsUHJlID0+IGxQcmUuSURMSVNUQSA9PSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvKTtcclxuICAgICAgICAgICAgaWYgKG9MaXN0YUZpbmRlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb0xpc3RhRmluZGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5WYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybCwgb0RhdGFVc2VyLCBvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBWYWxpZGFyRGF0YUZyb21JbnZlbnRhcmlvKHByZEdybDogTTNQcmRHZW5lcmFsLCBvRGF0YVVzZXI6IGFueSwgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICAgICAgICB2YXIgc0xpc3RhOiBzdHJpbmcgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURMUHJlY2lvO1xyXG4gICAgICAgIHZhciBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG51bGwsIG51bGwsIG51bGwpO1xyXG4gICAgICAgIC8vVmFsaWRhciBzaSBlcyB1biB2YWxvciBkZSBpbnZlbnRhcmlvLlxyXG4gICAgICAgIGlmIChzTGlzdGEuc3BsaXQoJ18nKVswXSA9PSBcIklOVlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBqRGF0YTogYW55ID0geyBcInViaWNhY2lvblwiOiBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBcInNrdVwiOiBwcmRHcmwuU0tVLCBcImxvdGVcIjogcHJkR3JsLkxPVEUsIFwiY29uY2VwdG9cIjogc0xpc3RhLnNwbGl0KCdfJylbMV0gfTtcclxuICAgICAgICAgICAgdmFyIHByZWNpbyA9IGF3YWl0IG9NM1JlZ1NlcnZpY2UuR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihvUG9zdFNlcnZpY2VNMywgdGhpcy5nc2lka2F0aW9zLCBqRGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChwcmVjaW8gJiYgcHJlY2lvICE9IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQcmRMaXN0YSA9IG5ldyBNM1ByZExpc3RhKCk7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmRMaXN0YS5JRExJU1RBID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklETFByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLkxPVEUgPSBwcmRHcmwuTE9URTtcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlBSRUNJTyA9IHByZWNpbztcclxuICAgICAgICAgICAgICAgIG9NM1ByZExpc3RhLlNLVSA9IHByZEdybC5TS1U7XHJcbiAgICAgICAgICAgICAgICBwcmRHcmwuTG9NM1ByZExpc3RhID0gb00zUHJkTGlzdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxufSIsImltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG4vL2ltcG9ydCB7IHNlc3Npb25XRTggfSBmcm9tIFwiLi4vLi4vLi4vU2Vzc2lvbi9zZXNzaW9uLmNsYXNzXCI7XHJcbmltcG9ydCB7IEZpbHRyb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9maWx0cm9zXCI7XHJcbmltcG9ydCB7IE0zQ291Y2hNYWVzdHJvIH0gZnJvbSBcIi4uL0RhdGEvbTMtY291Y2gtbWFlc3Ryb1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgU2VydmljZUxpc3RhUHJlY2lvIH0gZnJvbSBcIi4vbTMtbGlzdGEtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2VydmljZUxvYWRMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxvYWQtbC1wcmVjaW8uc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyDDicK1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTTNNYWVzdHJvIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb3NQb3JDcmVkaXRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRNM1Byb2Nlc29zUG9yQ3JlZGl0by8nICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIGdldE0zUHJvY2Vzb0J5SWRQcmVzdGFtbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkUHJlc3RhbW86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvZ2V0TTNQcm9jZXNvQnlJZFByZXN0YW1vLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRQcmVzdGFtbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IGFueTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgXHJcblxyXG4gICAgLy9yYWUgZWwgVElQTywgU0tQMSwgTk9NQlJFIGRlIGxhIHRhYmxhIHByZGdycFxyXG4gICAgcHVibGljIG0zR2V0UFJER1JQKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0TTNQUkRHUlAvJyArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gSlNPTi5wYXJzZShyZXNwKTtcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0sob0RhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGEgY2FudGlkYWQgZGlzcG9uaWJsZSBkZSBwcm9kdWN0bywgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIFNLUDEgeSBsYSB1YmljYWNpw4PCs24uXHJcbiAgICAvL0xhIGRhdGEgZGViZSB0ZW5lciB1bmEgZXN0cnVjdHVyYToge1wiVUJJQ0FDSU9OXCI6XCIxMTExXCIsIFwiU0tQMVwiOlwiOTk5OWFcIn1cclxuICAgIHB1YmxpYyBNM0dldENhbnRpZGFkQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXRDYW50aWRhZEJ5U0tQMS8nICsgc0lES2F0aW9zLCBvRGF0YVNlbmQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBvRGF0YSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdmFyIGdvRGF0YURpc3A6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmIChvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vTm8gZXMgYXJyYXlcclxuICAgICAgICAgICAgICAgIGdvRGF0YURpc3AgPSBuZXcgQXJyYXk8YW55PihvRGF0YS5SRVNQVUVTVEEuRElTUE9OSUJJTElEQUQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ29EYXRhRGlzcCA9IG9EYXRhLlJFU1BVRVNUQS5ESVNQT05JQklMSURBRDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnb0RhdGFEaXNwKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhnb0RhdGFEaXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIGxhIGxpc3RhIGRlIHByb2R1Y3RvLCB0ZW5pZW5kbyBlbiBjdWVudGEsIHVuIGFycmF5IGRlIGZpbHRyb3MuXHJcbiAgICBHZXRMaXN0YVByZFhGaWx0cm9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9sRmlsdHJvczogQXJyYXk8RmlsdHJvcz4sIHNJRExpc3RhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGlkVWJpY2FjaW9uID0gXCItMVwiLCBAT3B0aW9uYWwoKSBhcGxVbHRpbW9GaWx0cm8gPSB0cnVlLCBAT3B0aW9uYWwoKSB0b3BMaW1pdCA9IFwiMFwiLCBAT3B0aW9uYWwoKSBmaWx0cmFySW52VWJpYyA9IFwiMFwiKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZDtcclxuICAgICAgICBvRGF0YVNlbmQgPSB7IFwiRmlsdHJvc1wiOiBKU09OLnN0cmluZ2lmeShvbEZpbHRyb3MpLCBcIklkTGlzdGFcIjogc0lETGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiYXBsVWx0aW1vRmlsdHJvXCI6IGFwbFVsdGltb0ZpbHRybywgXCJ0b3BMaW1pdFwiOiB0b3BMaW1pdCwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIGlmIChvbEZpbHRyb3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTGlzdFBSREZpbHRyb3MvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwLCBvbEZpbHRyb3MpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihcIk5vIGhheSBmaWx0cm9zIHBhcmEgbGEgYnVzcXVlZGFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0NhdGVnb3JpYTogc3RyaW5nLCBvRGF0YUNsYXNpZmljYWNpb24sIElkTGlzdGE6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgQE9wdGlvbmFsKCkgaWRVYmljYWNpb24gPSBcIi0xXCIsIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG4gICAgICAgIHZhciBvbEZpbHRyb3M6IEFycmF5PEZpbHRyb3M+O1xyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb2xGaWx0cm9zID0gdGhpcy5GaW5kRmlsdGVySW5DbGFzaWZpY2FjaW9uKHNDYXRlZ29yaWEsIHNJREthdGlvcywgb0RhdGFDbGFzaWZpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcIkZpbHRyb3NcIjogSlNPTi5zdHJpbmdpZnkob2xGaWx0cm9zKSwgXCJJZExpc3RhXCI6IElkTGlzdGEsIFwiSWRVYmljYWNpb25cIjogaWRVYmljYWNpb24sIFwiZmlsdHJhckludlViaWNcIjogZmlsdHJhckludlViaWMgfTtcclxuICAgICAgICBpZiAob2xGaWx0cm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vR2V0X0xpc3RQUkRGaWx0cm9zLycgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgb2xGaWx0cm9zKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiTm8gaGF5IGZpbHRyb3MgcGFyYSBsYSBidXNxdWVkYVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfS8vRW5kIEdldExpc3RhUHJkWENhdGVnb3JpYVxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBsYSBjYXRlZ29yaWEuXHJcbiAgICBHZXRMaXN0YVByZFhDYXRlZ29yaWFXaXRoT3V0RmlsdGVycyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzQ2F0ZWdvcmlhOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlDbGFzaWZpY2FjaW9uLycgKyBzSURLYXRpb3MgKyAnLycgKyBzQ2F0ZWdvcmlhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCwgbnVsbCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0TGlzdGFQcmRYQ2F0ZWdvcmlhXHJcblxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgbGlzdGEgZGUgcHJvZHVjdG9zLCBzZWd1biBlbCBub21icmUgbyBkZXNjcmlwY2nDg8Kzbi5cclxuICAgIEdldExpc3RhUHJkWE5vbWJyZShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0TGlzdGFQcm9kQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FyZ2FyTGlzdFByZEJ5R2VuZXJpYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzTm9tYnJlOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcsIHNJREthdGlvczogc3RyaW5nLCBzSURMaXN0YTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIEBPcHRpb25hbCgpIGZpbHRyYXJJbnZVYmljOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiSWRMaXN0YVwiOiBzSURMaXN0YSwgXCJpZFViaWNhY2lvblwiOiBpZFViaWNhY2lvbiwgXCJmaWx0cmFySW52VWJpY1wiOiBmaWx0cmFySW52VWJpYyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2Nhcmdhckxpc3RQcmRCeUdlbmVyaWMvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vY2FyZ2FyIGluZm9ybWFjaW9uIGRlIGNsYXNpZmljYWNpb25cclxuICAgIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBqc29uUmVzcCxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vdmFyIG9zZXNzaW9uV0U4ID0gbmV3IHNlc3Npb25XRTgoKTtcclxuXHJcbiAgICAgICAgLy9qc29uUmVzcCA9IG9zZXNzaW9uV0U4LkdldERhdGFDTEFTSUZJQ0FDSU9OKHNJREthdGlvcyk7XHJcbiAgICAgICAgaWYgKGpzb25SZXNwID09PSB1bmRlZmluZWQgfHwganNvblJlc3AgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL00zR2V0Q2xhc2lmaWNhY2lvbi9cIiArIHNJREthdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAganNvblJlc3AgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5WYWxpZGFyQXJyYXlDbGFzaWZpY2FjaW9uKGpzb25SZXNwKTtcclxuICAgICAgICAgICAgICAgIC8vb3Nlc3Npb25XRTguU2V0RGF0YUNMQVNJRklDQUNJT04oanNvblJlc3AsIHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqc29uUmVzcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfS8vRW5kIGNhcmdhckluZm9DbGFzaWZpY2FjaW9uXHJcblxyXG4gICAgLy9WYWxpZGFyIHF1ZSBsYSBjbGFzaWZpY2FjaW9uLCBlc3RlbiBjb21vIGFycmF5LlxyXG4gICAgVmFsaWRhckFycmF5Q2xhc2lmaWNhY2lvbihvRGF0YUNsYXMpIHtcclxuICAgICAgICB0aGlzLlJlY3Vyc2l2ZUNvbnZlcnRBcnJheShvRGF0YUNsYXMuUkVTUFVFU1RBLkNMQVNJRklDQUNJT05FUyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQXBsaWNhciBmaWx0cm9zIGEgbGEgY2F0ZWdvcmlhIGVudHJhbnRlLlxyXG4gICAgRmluZEZpbHRlckluQ2xhc2lmaWNhY2lvbihzQ2xhc0ZpbmQ6IHN0cmluZywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhQ2xhc2lmaWNhY2lvbikge1xyXG4gICAgICAgIHZhciBzQ2xhc2lmaWNhY2lvbjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgb0RhdGFGaWx0cmFkYTtcclxuICAgICAgICAvL3ZhciBvc2Vzc2lvbldFOCA9IG5ldyBzZXNzaW9uV0U4KCk7XHJcbiAgICAgICAgdmFyIG9sRmlsdHJvcyA9IG5ldyBBcnJheTxGaWx0cm9zPigpO1xyXG4gICAgICAgIHZhciBvRmlsdHJvczogRmlsdHJvcztcclxuICAgICAgICB2YXIgZmlsdHJvQXRyaWJ1dG86IHN0cmluZztcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzQ2xhc0ZpbmQpO1xyXG4gICAgICAgIC8vb0RhdGFDbGFzaWZpY2FjaW9uID0gb3Nlc3Npb25XRTguR2V0RGF0YUNMQVNJRklDQUNJT04oc0lES2F0aW9zKTtcclxuXHJcbiAgICAgICAgb0RhdGFGaWx0cmFkYSA9IG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTO1xyXG5cclxuICAgICAgICBpZiAoc0NsYXNGaW5kLmxlbmd0aCAlIDMgPT0gMCkge1xyXG4gICAgICAgICAgICB3aGlsZSAoc0NsYXNGaW5kICE9IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBzQ2xhc2lmaWNhY2lvbiA9IHNDbGFzaWZpY2FjaW9uICsgc0NsYXNGaW5kLnN1YnN0cmluZygwLCAzKTtcclxuICAgICAgICAgICAgICAgIHNDbGFzRmluZCA9IHNDbGFzRmluZC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgICAgICBvRGF0YUZpbHRyYWRhID0gb0RhdGFGaWx0cmFkYS5DQVRFR09SSUEuZmluZChmaWx0cm8gPT4gZmlsdHJvLkNMQVNJRklDQUNJT04udG9TdHJpbmcoKSA9PSBzQ2xhc2lmaWNhY2lvbi50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0cm9BdHJpYnV0byA9IG9EYXRhRmlsdHJhZGEuQVRSSUJVVE87XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRyb0F0cmlidXRvLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoXCJST09UXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0ZpbHRyb3MgPSBuZXcgRmlsdHJvcyhvRGF0YUZpbHRyYWRhLkFUUklCVVRPLCBvRGF0YUZpbHRyYWRhLkRlc2NyaXBjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvbEZpbHRyb3MucHVzaChvRmlsdHJvcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIC8vb0RhdGFSZXNwQ2xhID0gdGhpcy5SZWN1cnNpdmVDbGFzaWZpY2FjaW9uKG9EYXRhQ2xhc2lmaWNhY2lvbi5SRVNQVUVTVEEuQ0xBU0lGSUNBQ0lPTkVTLkNBVEVHT1JJQSwgc0NsYXNGaW5kKTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFSZXNwQ2xhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2xGaWx0cm9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjdXJzaXZpZGFkLCBwYXJhIHZhbGlkYXIgcXVlIHRvZG9zIGxvcyBub2Rvcywgc2VhbiB0aXBvIGFycmF5XHJcbiAgICBSZWN1cnNpdmVDb252ZXJ0QXJyYXkob0RhdGFDbGFzKSB7XHJcbiAgICAgICAgaWYgKG9EYXRhQ2xhcy5DQVRFR09SSUEgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAob0RhdGFDbGFzLkNBVEVHT1JJQS5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQSA9IG5ldyBBcnJheShvRGF0YUNsYXMuQ0FURUdPUklBKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KG9EYXRhQ2xhcy5DQVRFR09SSUFbMF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFDbGFzLkNBVEVHT1JJQS5mb3JFYWNoKGNsYXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVjdXJzaXZlQ29udmVydEFycmF5KGNsYXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9BZGljaW9uYSB1biBwcm9kdWN0b1xyXG4gICAgbTNBZGRQcm9kdWN0byhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgdGRvY1VBY3Rpdm86IHN0cmluZywgbmRvY1VBY3Rpdm86IHN0cmluZywgb00zUHJkR3JwOiBUeXBlTTNQcmRHcnAsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24sIGRpc2FibGVkV2ViOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICBkYXRhID0geyAnc1Rkb2NVc3VhcmlvJzogdGRvY1VBY3Rpdm8sICdzTmRvY1VzdWFyaW8nOiBuZG9jVUFjdGl2bywgJ29NM1ByZEdycCc6IG9NM1ByZEdycCwgJ2Rpc2FibGVkV2ViJzogZGlzYWJsZWRXZWIgfTtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vYWRkUHJvZHVjdG8vXCIgKyBzSURLYXRpb3MudHJpbSgpLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gcG9yIFNLUDEuXHJcbiAgICBNM0dldFByb2R1Y3RvQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vTTNHZXRQcm9kdWN0b0J5U0tQMS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgcHJvZHVjdG86IGFueSA9IHJlc3A7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcbiAgICAgICAgICAgIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIHJhbmRvbSBwb3IgU0tQMS5cclxuICAgIE0zR2V0UHJvZHVjdG9SYW5kb21CeVNLUDEoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMyhcIk0zTWFlc3Ryby9NM0dldFByb2R1Y3RvUmFuZG9tQnlTS1AxL1wiICsgc0lES2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBwb3IgU0tQMS5cclxuICAgIE0zR2V0Q2F0QXNvY2lhZGFzQnlTS1AxKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBza3AxOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoXCJNM01hZXN0cm8vTTNHZXRDYXRBc29jaWFkYXNCeVNLUDEvXCIgKyBzSURLYXRpb3MgKyAnLycgKyBza3AxKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vR2V0IEltYWdlbmVzIGVudmlhbmRvIGVuIGxhIG9EYXRhOiB7XCJQYXRoXCI6XCJ4eHhcIiwgXCJTS1VcIjpcIlNLVXh4eFwifVxyXG4gICAgcHVibGljIE0zR2V0SW1hZ2VuZXNCeVBhdGgoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9HZXRfTTNNdWx0aW1lZGlhQnlQYXRoLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9vYnRlbmVyIGluZm9ybWFjaW9uIGRlIHBsYW50aWxsYXMsIGRlc2RlIHNlcnZpZG9yLi4uIFxyXG4gICAgR2V0X00zU0tQbGFudGlsbGFCeVNLVUlEKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBTS1VJRDogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKFwiTTNNYWVzdHJvL0dldF9NM1NLUGxhbnRpbGxhQnlTS1VJRC9cIiArIHNJREthdGlvcyArIFwiL1wiICsgU0tVSUQpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpw4PCs24gZGUgcHJvZHVjdG9zLCBkZXNkZSBjb2RpZ28gZGUgYmFycmFzXHJcbiAgICBHZXRJbmZvQnlGaWx0ZXJDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzRmlsdGVyQ29kZTogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb0RhdGEgPSB7IFwiRklMVEVSQ09ERVwiOiBzRmlsdGVyQ29kZSB9O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFNLUDFQcmRzQnlGaWx0ZXJzQ29kZS8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgR2V0SW5mb0J5RmlsdGVyQ29kZSBcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNJZFViaWNhY2lvbjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9NM1ViaWNhY2lvbmVzLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24pLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zVWJpY2FjaW9uZXNcclxuXHJcbiAgICAvL09idGllbmUgZWwgb2JqZXRvIE0zVWJpY2FjaW9uZXMgcGFyYSBsYSB1YmljYWNpb24geSBpZGthdGlvcyBkYWRvc1xyXG4gICAgZ2V0X00zVWJpY2FjaW9uZXNDb21wbGV0YShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkVWJpY2FjaW9uOiBzdHJpbmcsIHNJZEh1Yjogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zV2l0aFRpbWVPdXQoJ00zTWFlc3Ryby9nZXRfTTNVYmljYWNpb25lc0NvbXBsZXRhLycgKyBzSURLYXRpb3MgKyAnLycgKyBzSWRVYmljYWNpb24gKyAnLycgKyBzSWRIdWIsIDEwMDAwKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9NM1ViaWNhY2lvbmVzQ29tcGxldGFcclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIHB1YmxpYyBNM0dldFByb2R1Y3RvQnlTS1UoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhQb3N0U2VydmljZU0zKTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9NM0dldFByb2R1Y3RvQnlTS1UvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKG9Qcm9kdWN0byk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9yYWUgZWwgcHJvZHVjdG8gZGUgYWN1ZXJkbyBhbCBTS1VcclxuICAgIGFzeW5jIE0zR2V0UHJvZHVjdG9CeVNLVUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzU0tVOiBzdHJpbmcsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIFViaWNhY2lvbjogc3RyaW5nID0gXCItMVwiLCBzQXBsRXhjOiBzdHJpbmcgPSBcIjFcIikge1xyXG4gICAgICAgIHZhciBkYXRhO1xyXG4gICAgICAgIHZhciByZXNwO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGRhdGEgPSB7ICdTS1UnOiBzU0tVLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb24gPT0gXCItMVwiID8gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiA6IFViaWNhY2lvbiwgJ0FwbEV4Yyc6IHNBcGxFeGMgfTtcclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuXHJcbiAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0UHJvZHVjdG9CeVNLVS8nICsgc0lES2F0aW9zLCBkYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICBhd2FpdCBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ocmVzcCwgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9PYnRlbmVyIHByb2R1Y3RvIGVzcGVjZmljbyB0ZW5pZW5kbyBlbiBjdWVudGEgY29kaWdvLlxyXG4gICAgYXN5bmMgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9EYXRhVXNlcjogYW55KSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8oc0lES2F0aW9zKTtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnk7XHJcblxyXG4gICAgICAgIGlmIChvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW8pIGRhdGEuZmVjaGFMUHJlY2lvID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvO1xyXG5cclxuICAgICAgICBvUHJvZHVjdG8gPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL1RyYWUgbG9zIHJlZ2lzdHJvcyBxdWUgc2UgZW5jdWVudHJlbiBlbiBNM1Byb2Nlc29zIHF1ZSBzZSBlbmN1ZW50cmVuIGNvbiBlc3RhZG9nZW5lcmFsIHByb2Nlc29cclxuICAgIE0zZ2V0UmVnaXN0cm9zRW5Qcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBpZFByb2Nlc286IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgZGF0YSA9IHsgJ2lkUHJvY2Vzbyc6IGlkUHJvY2VzbyB9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9nZXRfUmVnaXN0cm9zRW5Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JTb2R5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRpZW5lIGVsIHRvcCAyMCBkZSBwcm9kdWN0b3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIGdldF9NM1ByZEdycEJ5Tm9tYnJlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzTm9tYnJlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X00zUHJkR3JwQnlOb21icmUvJyArIHNJREthdGlvcyArICcvJyArIHNOb21icmUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLk0zR1JQO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyLl9ib2R5KS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X00zUHJkR3JwQnlOb21icmVcclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG9cclxuICAgIHB1YmxpYyBHZXRNM1ByZEFncnVwYWRvQnlOb21icmUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIHNOb21icmU6IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfbTNfcHJkX2J5X25vbWJyZV9hZ3J1cGFkby8nICsgc0lES2F0aW9zICsgJy8nICsgc05vbWJyZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuTTNHUlA7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGllbmUgZWwgdG9wIDIwIGRlIHByb2R1Y3RvcyBhZ3J1cGFkb3MgcXVlIGNvaW5jaWRhZCBjb24gZWwgc05vbWJyZSBpbmdyZXNhZG8geSBxdWUgbm8gZXN0ZW4gZXhsY3VpZG9zIChNM0V4Y1ByZFhVYmljKVxyXG4gICAgcHVibGljIGdldF9tM19wcmRfYnlfbm9tYnJlX2FncnVwYWRvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICAvL2RhdGEgPSB7bm9tYnJlOidhc2Rhc2QnLCBpZFViaWNhY2lvbjonMSd9XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X20zX3ByZF9ieV9ub21icmVfYWdydXBhZG8vJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG5cclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQS5NM0dSUDtcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLl9ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yICYmIGVyci5lcnJvci5NZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIHBhdGggYmFzZSBkb25kZSBzZSBlbmN1ZW50cmEgYWxvamFkYXMgbGFzIGltYWdlbmVzIGVuIGVsIHNlcnZpZG9yXHJcbiAgICBwdWJsaWMgZ2V0X1BhdGhTZXJ2aWRvckltYWdlbmVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF9QYXRoU2Vydmlkb3JJbWFnZW5lcy8nICsgc0lES2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwKVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9QYXRoU2Vydmlkb3JJbWFnZW5lc1xyXG5cclxuXHJcbiAgICAvL09idGVuZXIgcHJvZHVjdG8gZXNwZWNmaWNvIHRlbmllbmRvIGVuIGN1ZW50YSBjb2RpZ28uXHJcbiAgICBHZXRfTTNQcm9kdWN0b0VzcGVjQnlDb2RlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8gPSBuZXcgU2VydmljZUxvYWRMaXN0YVByZWNpbyhzSURLYXRpb3MpO1xyXG5cclxuICAgICAgICBpZiAob0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSBkYXRhLmZlY2hhTFByZWNpbyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbztcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICBvU2VydmljZUxvYWRMaXN0YVByZWNpby5Bc2lnbmFyTGlzdGFQcmVjaW8ob1Byb2R1Y3RvLCBvRGF0YVVzZXIsIFBvc3RTZXJ2aWNlTTMpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZVRpbWVPdXQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgdGltZW91dFRpbWU6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHNJREthdGlvcyk7XHJcblxyXG4gICAgICAgIGlmICh0aW1lb3V0VGltZSAhPSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YVVzZXIgJiYgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hICYmIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5GZWNoYVByZWNpbykgZGF0YS5mZWNoYUxQcmVjaW8gPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuRmVjaGFQcmVjaW87XHJcbiAgICAgICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNM1RpbWVPdXQoXCJNM01hZXN0cm8vR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZS9cIiArIHNJREthdGlvcywgZGF0YSwgdGltZW91dFRpbWUpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb2R1Y3RvOiBhbnkgPSByZXNwO1xyXG4gICAgICAgICAgICAgICAgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnJvci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKFwiNDA0XCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRfRG9jc0Zyb21Db3VjaE1hZXN0cm8ob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3Rybywgc0lkS2F0aW9zOiBzdHJpbmcsIHNEb2M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ2V0X0RvY3NGcm9tQ291Y2hNYWVzdHJvXCIpXHJcbiAgICAgICAgdmFyIHNJZEtleURvYyA9IG9NM0NvdWNoTWFlc3Ryby5HZXRLZXlEb2N1bWVudG9EQihzSWRLYXRpb3MsIHNEb2MpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHNJZEtleURvYylcclxuICAgICAgICBvTTNDb3VjaE1hZXN0cm8uR2V0RGF0YVBvdWNoQkQoc0lkS2V5RG9jKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzdWx0KTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRQcm9kdWN0b0VzcGVjQnlDb2RlRnJvbUNvdWNoKGpQcm9kdWN0c0NvdWNoOiBhbnksIHNDb2RlOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyb3I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdmFyIGpQcm9kdWN0c0ZpbCA9IGpQcm9kdWN0c0NvdWNoLmZpbmQoeCA9PiB4LkxvTTNQcmRHZW5lcmFsICE9IHVuZGVmaW5lZCAmJiB4LkxvTTNQcmRHZW5lcmFsLmZpbmQodyA9PiB3Lk0zQ29kcyAhPSB1bmRlZmluZWQgJiYgdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpICE9IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RfY2xvbmUgPSBfLmNsb25lRGVlcChqUHJvZHVjdHNGaWwpO1xyXG5cclxuICAgICAgICBpZiAoalByb2R1Y3RzRmlsICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB2YXIgalByZEVzcCA9IGpQcm9kdWN0c0ZpbC5Mb00zUHJkR2VuZXJhbC5maW5kKHcgPT4gdy5NM0NvZHMuZmluZCh5ID0+IFN0cmluZyh5LlZhbG9yKSA9PSBTdHJpbmcoc0NvZGUpKSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIHByb2R1Y3RfY2xvbmUuTG9NM1ByZEdlbmVyYWwgPSBbXTtcclxuICAgICAgICAgICAgcHJvZHVjdF9jbG9uZS5Mb00zUHJkR2VuZXJhbC5wdXNoKGpQcmRFc3ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInByb2R1Y3RfY2xvbmVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZHVjdF9jbG9uZSlcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhwcm9kdWN0X2Nsb25lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb0Z1bmNpb25FcnJvcihcIk5vIHNlIGVuY29udHLDg8KzIG51bmfDg8K6biByZWdpc3Ryby5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxvcyBUaXBvcyBkZSBwcm9jZXNvcyBkZXNkZSBlbCBzZXJ2aWRvclxyXG4gICAgcHVibGljIGdldF9UaXBvc1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbiwgYWN0aXZpZGFkOiBzdHJpbmcgPSAnVmVudGFzJykge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X1RpcG9zUHJvY2Vzby8nICsgc0lES2F0aW9zICsgJy8nICsgYWN0aXZpZGFkKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9UaXBvc1Byb2Nlc29cclxuXHJcbiAgICAvLy9PYnRpZW5lIGxhIEluZm8gZGUgdW4gcHJvY2VzbyBhIHBhcnRpciBkZSB1biBpZFByb2Nlc28geSB1biBJZE0zXHJcbiAgICBwdWJsaWMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc28oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXRfSW5mb1BlcnNvbmFfUHJvY2Vzby8nICsgc0lES2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UoU3RyaW5nKHJlc3ApKS5SRVNQVUVTVEEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9JbmZvUHJvY2Vzb1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBJbmZvIGRlIHVuIHByb2Nlc28gYSBwYXJ0aXIgZGUgdW4gaWRQcm9jZXNvIHkgdW4gSWRNMyBkZSBtYW5lcmEgc2luY3LDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGpEYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0X0luZm9QZXJzb25hX1Byb2Nlc29fYXN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIganNvbjtcclxuICAgICAgICB2YXIgcmVzcDtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcCA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9JbmZvUGVyc29uYV9Qcm9jZXNvLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAganNvbiA9IEpTT04ucGFyc2UocmVzcClcclxuICAgICAgICAgICAgcmV0dXJuIGpzb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL09idGVuZXIgdW4gcHJvZHVjdG8gYWdydXBhZG8sIHRlbmllbmRvIHVuYSBsaXN0YSBkZSBwcm9kdWN0byBhZ3J1cGFkb3MgeSB1biBza3VcclxuICAgIHB1YmxpYyBHZXRNM1ByZEdycEZyb21MaXN0KExpc3RQcmQ6IEFycmF5PFR5cGVNM1ByZEdycD4sIHNrdSk6IFR5cGVNM1ByZEdycCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9UeXBlTTNQcmRHcnBSZXN1bHQ6IFR5cGVNM1ByZEdycDtcclxuICAgICAgICAgICAgb1R5cGVNM1ByZEdycFJlc3VsdCA9IExpc3RQcmQuZmluZChwcmQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBwcmQuTG9NM1ByZEdlbmVyYWwuZm9yRWFjaChwcmQgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJkLlNLVSA9PT0gc2t1KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9UeXBlTTNQcmRHcnBSZXN1bHQuTG9NM1ByZEdlbmVyYWwgPSBvVHlwZU0zUHJkR3JwUmVzdWx0LkxvTTNQcmRHZW5lcmFsLmZpbHRlcihnZW4gPT4gZ2VuLlNLVSA9PSBza3UpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1R5cGVNM1ByZEdycFJlc3VsdDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0ZW5lciBkZSB1bmEgbGlzdGEgZGUgdWJpY2FjaW9uZXMsIHVuYSB1YmljYWNpb24gZW4gcGFydGljdWxhciwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIElkVWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgR2V0VWJpY2FjaW9uRnJvbUxpc3QoTGlzdFViaWM6IEFycmF5PE0zVWJpY2FjaW9uPiwgc0lkVWJpYykge1xyXG4gICAgICAgIHZhciBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uO1xyXG4gICAgICAgIG9NM1ViaWNhY2lvbiA9IExpc3RVYmljLmZpbmQodWJpYyA9PiB1YmljLklEVWJpY2FjaW9uID09IHNJZFViaWMpO1xyXG4gICAgICAgIHJldHVybiBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBsb3MgZGF0b3MgZGUgZmFjdHVyYWNpb24gdGFsIGNvbW8gZWwgY29kaWdvIHBvc3RhbCB5IGVsIHJlZ2ltZW4gZmlzY2FsIGFzb2NpYWRvIGEgdW4gUkZDXHJcbiAgICBwdWJsaWMgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zTWFlc3Ryby9nZXREYXRvc0ZhY3R1cmFjaW9uRnJvbVJGQy8nICsgc0lES2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0RGF0b3NGYWN0dXJhY2lvbkZyb21SRkNcclxuXHJcbiAgICBwdWJsaWMgYWN0dWFsaXphclJGQyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBvRGF0YSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKCdNM01hZXN0cm8vYWN0dWFsaXphclJGQy8nICsgSWRLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHBvc3RzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vZ2V0X1htbENvbmZpZ194X0lkVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9EYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBnZXRfWG1sQ29uZmlnX3hfSWRVYmljYWNpb25cclxuXHJcbiAgICAvLy9PYnRpZW5lIGVsIFhtbCBkZSBjb25maWd1cmFjaW9uIGRlIGxhIGVtcHJlc2EgYSBwYXJ0aXIgZGVsIGlkdWJpY2FjaW9uXHJcbiAgICBwdWJsaWMgZ2V0Q0ZESXNYUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb0RhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldENGRElzWFByb2Nlc28vJyArIHNJREthdGlvcywgb0RhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIGdldF9YbWxDb25maWdfeF9JZFViaWNhY2lvblxyXG5cclxuICAgIC8vL09idGllbmUgbG9zIGF0cmlidXRvcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvc1xyXG4gICAgZ2V0X2NsYXNpZmljYXRpb25fYXR0cmlidXRlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9hdHRyaWJ1dGVzLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIHByb2Nlc2FtaWVudG8gT0tcclxuICAgICAgICAgICAgdmFyIGpSZXNwID0gSlNPTi5wYXJzZShyZXNwKS5SRVNQVUVTVEEuQVRUUklCVVRFUztcclxuICAgICAgICAgICAgaWYgKGpSZXNwLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBqUmVzcCA9IG5ldyBBcnJheShqUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soalJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYXMgY2F0ZWdvcmlhcyBlbiBtM2NsYXNpZmljYSBhIHBhcnRpciBkZSB1biBpZGthdGlvcyB5IHVuIGF0cmlidXRvXHJcbiAgICBnZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZywgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0TTMoJ00zTWFlc3Ryby9nZXRfY2xhc2lmaWNhdGlvbl9jYXRlZ29yaWVzLycgKyBpZF9rYXRpb3MgKyBcIi9cIiArIGF0dHJpYnV0ZSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgalJlc3AgPSBKU09OLnBhcnNlKHJlc3ApLlJFU1BVRVNUQS5DQVRFR09SSUVTO1xyXG4gICAgICAgICAgICBpZiAoalJlc3AubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGpSZXNwID0gbmV3IEFycmF5KGpSZXNwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhqUmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wY2lvbmVzQWRpY2lvbmFsZXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0T3BjaW9uZXNBZGljaW9uYWxlcy8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkFUVFJJQlVURVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHJpYnV0b3NBZGljaW9uYWxlcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0QXRyaWJ1dG9zQWRpY2lvbmFsZXMvJyArIGlkX2thdGlvcyArIFwiL1wiICsgYXR0cmlidXRlKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBqUmVzcCA9IEpTT04ucGFyc2UocmVzcCkuUkVTUFVFU1RBLkNBVEVHT1JJRVM7XHJcbiAgICAgICAgICAgIGlmIChqUmVzcC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgalJlc3AgPSBuZXcgQXJyYXkoalJlc3ApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKGpSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aWVuZSBsYSBpbmZvcm1hY2lvbiBkZSB0aXBvcyBkZSBlbnZpby5cclxuICAgIE0zR2V0Rm9ybWFzRW52aW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNHZXRGb3JtYXNFbnZpby8nICsgaWRfa2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciBqc1Jlc3A7XHJcbiAgICAgICAgICAgIGpzUmVzcCA9IEpTT04ucGFyc2UocmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soanNSZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfY29tcGxldGUoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0X3ViaWNhY2lvbmVzX2NvbXBsZXRlLycgKyBpZF9rYXRpb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBnZXRfdWJpY2FjaW9uZXNfc2ltcGxlKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL2dldF91YmljYWNpb25lc19zaW1wbGUvJyArIGlkX2thdGlvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vT2J0aW5pZSB0b2RhcyBsYXMgTTNVYmljYWNpb25lcyBhc29jaWFkYXMgYSB1biBpZF9rYXRpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNM0dFVF9MSVNUQVBSRUNJT1NfQVN5bmMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb1JlY0xpc3RhUHJlYzogYW55O1xyXG5cclxuICAgICAgICBvUmVjTGlzdGFQcmVjID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTNNYWVzdHJvL00zR0VUX0xJU1RBUFJFQ0lPUy8nICsgaWRfa2F0aW9zKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gb1JlY0xpc3RhUHJlY1swXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0RW5jYWJlemFkb0xpc3Rhc1ByZWNpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRNMygnTTMvR2V0Q29uZmlnTFAvJyArIHNJREthdGlvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVnaXN0cmFyQ29sb25pYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nLCBzQ29sb25pYTogc3RyaW5nLCBzQ29kUG9zdGFsLCBzVGVsZWZvbm86IHN0cmluZywgbmRvYzogc3RyaW5nLCBzTGluZWExOiBzdHJpbmcsIHNDb2Rlc3RhZG86IHN0cmluZyxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBvRGF0YVNlbmQ7XHJcbiAgICAgICAgb0RhdGFTZW5kID0geyBcInNDb2xvbmlhXCI6IHNDb2xvbmlhLCBcInNDb2RQb3N0YWxcIjogc0NvZFBvc3RhbCwgXCJzVGVsZWZvbm9cIjogc1RlbGVmb25vLCBcIm5kb2NcIjogbmRvYywgXCJzTGluZWExXCI6IHNMaW5lYTEsIFwic0NvZGVzdGFkb1wiOiBzQ29kZXN0YWRvIH07XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zTWFlc3Ryby9yZWdpc3RyYXJDb2xvbmlhLycgKyBJZEthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocG9zdHMgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoSlNPTi5wYXJzZShlcnIuX2JvZHkpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0ZW5lciBwcm9tb2Npb25lcyBcclxuICAgIHB1YmxpYyBhc3luYyBNM19HZXRQcm9tb2Npb25lc01hZXN0cm9Bc3luYyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvUmVjTGlzdGFQcmVjOiBhbnk7XHJcblxyXG4gICAgICAgIG9SZWNMaXN0YVByZWMgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vTTNfR2V0UHJvbW9jaW9uZXNNYWVzdHJvLycgKyBpZF9rYXRpb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIERpbmFtaWNhcyBwb3IgYWN0aXZpZGFkIFxyXG4gICAgcHVibGljIGFzeW5jIE0zR2V0RGluQnlBY3RpdmlkYWQoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9EYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM01hZXN0cm8vTTNHZXREaW5CeUFjdGl2aWRhZC8nICsgaWRfa2F0aW9zLCBvRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL3ZhciBqc1Jlc3A6YW55ID0gcmVzcDtcclxuICAgICAgICAgICAgLy9qc1Jlc3AgPSBKU09OLnBhcnNlKGpzUmVzcCk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvclxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgLy8gdmFyIG9SZWNMaXN0YVByZWM6IGFueTtcclxuXHJcbiAgICAgICAgLy8gb1JlY0xpc3RhUHJlYyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL00zR2V0RGluQnlBY3RpdmlkYWQvJyArIGlkX2thdGlvcywgb0RhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIC8vIHJldHVybiBvUmVjTGlzdGFQcmVjO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBpbmZvIGJhc2ljYSBkZSBsYXMgdWJpY2FjaW9uZXMgY29uIEh1YiB0aXBvIFdFQiBhY3Rpdm9zIGVuIGVsIG1vbWVudG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIGdldFViaWNhY2lvbmVzV2ViKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNM01hZXN0cm8vZ2V0VWJpY2FjaW9uZXNXZWIvJyArIGlkS2F0aW9zKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFJldG9ybmEgbGEgaW5mbyBiYXNpY2EgZGUgbGFzIHViaWNhY2lvbmVzIGNvbiBIdWIgdGlwbyBXRUIgYWN0aXZvcyBlbiBlbCBtb21lbnRvIHF1ZSBhYmFycXVlbiB1biBjb2Rwb3N0YWwgZW4gY29uY3JldG9cclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlkS2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbkVyciBcclxuICAgICAqL1xyXG4gICAgZ2V0VWJpY2FjaW9uZXNCeUNvZFBvc3RhbChQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL2RhdGEgPSB7IFwiY29kUG9zdGFsXCI6IHN0cmluZyB9O1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldFViaWNhY2lvbmVzQnlDb2RQb3N0YWwvJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShyZXNwLnRvU3RyaW5nKCkpKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHBhdGggZGUgbGEgZmFjdHVyYSBlbGVjdHLDg8KzbmljYSBhIHBhcnRpciBkZSB1biBJZERpYXJpbyBhc29jaWFkbyBhbCBwcm9jZXNvIFxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqIEBwYXJhbSBvRnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uRXJyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UGF0aEZFRnJvbURpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCB0aXBvR2VuZXJhY2lvbjogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0UGF0aEZFRnJvbURpYXJpby8nICsgaWRLYXRpb3MgKyAnLycgKyB0aXBvR2VuZXJhY2lvbiwgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3RhOiBhbnkgPSBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0socmVzcHVlc3RhKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERpYXJpb0FkaWNpb25hbGVzeERpYXJpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZEthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlHZW5lcmFsZXMoJ0RpYXJpby9nZXREaWFyaW9BZGljaW9uYWxlc3hEaWFyaW8vJyArIGlkS2F0aW9zLCBkYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGE6IGFueSA9IEpTT04ucGFyc2UocmVzcC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwdWVzdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5fYm9keSkuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhc3luYyBJVV9IdWIoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9IdWI6IGFueSwgdVRBY3Rpdm86IHN0cmluZywgdU5BY3Rpdm86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRLYXRpb3MnOiBpZF9rYXRpb3MudHJpbSgpLCAnb0h1Yic6IG9IdWIsICd1VEFjdGl2byc6IHVUQWN0aXZvLCAndU5BY3Rpdm8nOiB1TkFjdGl2byB9O1xyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNNYWVzdHJvL0lVX0h1YicsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjdGl2byBkZXNkZSBzZXJ2aWRvclxyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRfa2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGlkcHJvY2VzbyBcclxuICAgICAqIEBwYXJhbSB1YmljYWNpb24gXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICovXHJcbiAgICBhc3luYyBHZXRDdGl2b0JZUHJvY2VzbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgaWRwcm9jZXNvOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG4gICAgICAgIHZhciBkYXRhID0geyAnaWRwcm9jZXNvJzogaWRwcm9jZXNvLCAndWJpY2FjaW9uJzogdWJpY2FjaW9uLCAnaHViJzogaHViIH07XHJcbiAgICAgICAgSW5mbyA9IGF3YWl0IFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTMvR2V0Q3Rpdm9CWVByb2Nlc28vJyArIGlkX2thdGlvcy50cmltKCksIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIFZhbGlkYXJDdGl2b3NWU0xvY2FsKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLFxyXG4gICAgICAgIGluZlByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvVmFsaWRhckN0aXZvc1ZTTG9jYWwvJyArIGlkX2thdGlvcyArICcvJyArIHViaWNhY2lvbiArICcvJyArIGh1YiwgaW5mUHJvY2Vzbykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKHsgXCJlcnJvclwiOiBlcnJvciB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgR2VuZXJhckF1dG9yaXphY2lvbkN1ZW50YXMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgZGF0YSkge1xyXG4gICAgICAgIHZhciBJbmZvO1xyXG5cclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoJ00zL0dlbmVyYXJBdXRvcml6YWNpb25DdWVudGFzJywgZGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNpIGVsIGNvZGlnbyBpbmdyZXNhZG8gY29ycmVzcG9uZGUgYWwgZG9jdW1lbnRvIHkgc2kgZWwgY29kaWdvIGVzdGEgZW4gZXN0YWRvIGFjdGl2b1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBkYXRhKSB7XHJcbiAgICAgICAgdmFyIEluZm87XHJcblxyXG4gICAgICAgIEluZm8gPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTMvdmFsaWRhY2lvbkF1dG9yaXphY2lvbk0zQ3VlbnRhcycsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgcmV0dXJuIEluZm9cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgVmVyaWZpY2FyUGFnb1RhcmpldGFCQlZBKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBzSWRLZXk6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBqRGF0YSA9IHsgXCJJZGthdGlvc1wiOiBzSURLYXRpb3MsIFwiaWRLZXlcIjogc0lkS2V5IH1cclxuICAgICAgICB2YXIgSW5mbztcclxuICAgICAgICBJbmZvID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9WZXJpZmljYXJQYWdvVGFyamV0YUJCVkEnLCBqRGF0YSkudG9Qcm9taXNlKClcclxuICAgICAgICByZXR1cm4gSW5mbztcclxuICAgIH0vL0VuZCBnZXRfSW5mb1Byb2Nlc29cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZTIDIwMTkwODEzOiBSZXRvcm5hIGxvcyBjb2RpZ29zIGRlIGxvcyBTS1Aoc2twVG9GaW5kKSB5IHN1IHJlc3BlY3Rpdm8gc2lnbmlmaWNhZG8gcGFyYSB1biBwcm9kdWN0byBkYWRvXHJcbiAgICAgKiBAcGFyYW0gaWRLYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqIEBwYXJhbSBmdW5jaW9uRXJyb3IgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZXNjcmlwY2lvblNLUHMoaWRLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMyxcclxuICAgICAgICBkYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICAgICAgLy9sZXQgZGF0YSA9IHtcIlNLUDFcIjpcIlNLUDFcIiwgU0tQVG9GaW5kOiAyIH19O1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM0NvbnN1bHRhcy9nZXREZXNjcmlwY2lvblNLUHMvXCIgKyBpZEthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBmdW5jaW9uT0soZGF0YS5TS1AxLCBKU09OLnBhcnNlKHJlc3AudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyLmVycm9yLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgZ2V0VG90YWxlc0NpZXJyZUNhamEocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzdWJpY2FjaW9uOiBzdHJpbmcsIHNodWI6IHN0cmluZywgc3VzdWFyaW86IHN0cmluZywgc0ZlY2hhSTogc3RyaW5nLCBzRmVjaGFGOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgc2Vjb3BjaW9uZXM6IGFueTtcclxuICAgICAgICB2YXIgZGF0YSA9IHsgJ2lkS2F0aW9zJzogc0lkS2F0aW9zLCAndWJpY2FjaW9uJzogc3ViaWNhY2lvbiwgJ2h1Yic6IHNodWIsICd1c3VhcmlvJzogc3VzdWFyaW8sICdGZWNoYUknOiBzRmVjaGFJLCAnRmVjaGFGJzogc0ZlY2hhRiB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRUb3RhbGVzQ2llcnJlQ2FqYScsIGRhdGEpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBKU09OLnBhcnNlKHNlY29wY2lvbmVzKVxyXG4gICAgICAgIHJldHVybiBzZWNvcGNpb25lc1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldENpZXJyZXN4VWJpY2FjaW9uKHBvc3RTZXJ2aWNlOiBQb3N0U2VydmljZU0zLCBzSWRLYXRpb3M6IHN0cmluZywgc3ViaWNhY2lvbjogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ3ViaWNhY2lvbic6IHN1YmljYWNpb24sICdpZFByb2Nlc28nOiBzSWRQcm9jZXNvLCAnRmVjaGEnOiBzRmVjaGEgfVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gYXdhaXQgcG9zdFNlcnZpY2UuZ2V0V2l0aEJvZHlNMygnTTMvZ2V0Q2llcnJlc3hVYmljYWNpb24nLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDaWVycmVzeEVtcHJlc2EocG9zdFNlcnZpY2U6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBzSWRQcm9jZXNvOiBzdHJpbmcsIHNGZWNoYTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlY29wY2lvbmVzOiBhbnk7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB7ICdpZEthdGlvcyc6IHNJZEthdGlvcywgJ2lkUHJvY2Vzbyc6IHNJZFByb2Nlc28sICdGZWNoYSc6IHNGZWNoYSB9XHJcbiAgICAgICAgc2Vjb3BjaW9uZXMgPSBhd2FpdCBwb3N0U2VydmljZS5nZXRXaXRoQm9keU0zKCdNMy9nZXRDaWVycmVzeEVtcHJlc2EnLCBkYXRhKS50b1Byb21pc2UoKVxyXG4gICAgICAgIHNlY29wY2lvbmVzID0gSlNPTi5wYXJzZShzZWNvcGNpb25lcylcclxuICAgICAgICByZXR1cm4gc2Vjb3BjaW9uZXNcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYWUgZWwgbTNwcm9jZXNvcyBzZWdwdW4gZWwgaWRwcmVzdGFtb1xyXG4gICAgcHVibGljIHNpbXVsYXJwYWdvRW5saW5lYShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9WYWxpZGFjaW9uUGFnb0ludGVncmFjaW9uVGVzdC8nICsgc0lES2F0aW9zICsgJy8nICsgc0lkTTMgKyAnLycgKyBzSWRQcm9jZXNvKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvcihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZF9rYXRpb3M6IHN0cmluZywgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRnVuY2lvblJlc3A6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vdmFsaWRhclByZHNNaXNtb1Byb3ZlZWRvci9cIiArIGlkX2thdGlvcyArIFwiL1wiICsgbm9tYnJlQWRpY2lvbmFsUHJvdmVlZG9yLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJQcmRzTWlzbW9Qcm92ZWVkb3JcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25SZXNwKEpTT04ucGFyc2UoSlNPTi5wYXJzZShlcnJbJ19ib2R5J10pLk1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0Z1bmNpb25SZXNwOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTNNYWVzdHJvL3ZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvL1wiICsgaWRfa2F0aW9zLCBvTTNQcm9jZXNvcykuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvblJlc3AoSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHZhbGlkYXJSZXN0cmljY2lvbkludk5lZ2F0aXZvXCIpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uUmVzcChKU09OLnBhcnNlKEpTT04ucGFyc2UoZXJyWydfYm9keSddKS5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvUHJkR2FzdG9zRW52aW8oUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcblxyXG4gICAgICAgIGxldCByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5wb3N0U2VydmljZUh0dHBSZXNGdWxsTTMoXCJNM01hZXN0cm8vZ2V0SW5mb1ByZEdhc3Rvc0VudmlvL1wiICsgaWRfa2F0aW9zLCBvTTNQcm9jZXNvcykudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5wYXJzZShyZXNwWydfYm9keSddKS50b1N0cmluZygpKS5SRVNQVUVTVEFcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSB1bmEgc2FsZG94Y3VlbnRhIGFsZWF0b3JpbyBwb3IgZWwgdmFsb3IgZGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gaWRrYXRpb3MgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSA9IHtcInByb2Nlc29cIixwcm9jZXNvLFwidmFsb3JcIjp2YWxvcixcIm5vbWJyZURvY1wiOiBub21icmVEb2N9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBtM19nZW5lcmFyX00zU1hDX2FsZWF0b3JpbyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL20zX2dlbmVyYXJfTTNTWENfYWxlYXRvcmlvL1wiICsgaWRrYXRpb3MsIGRhdGEpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnBhcnNlKHJlc3BbJ19ib2R5J10pLnRvU3RyaW5nKCkpLlJFU1BVRVNUQTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0dWFsaXphIHVuIGNvbmNlcHRvIGRlbCBNM19zYWxkb3NJdGVtVWJcclxuICAgICAqIEBwYXJhbSBQb3N0U2VydmljZU0zIFxyXG4gICAgICogQHBhcmFtIGlka2F0aW9zIFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcGFyYW0gZnVuY2lvbk9LIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25FcnJvciBcclxuICAgICAqL1xyXG4gICAgcHVibGljIE0zX2FjdHVhbGl6YXJDb25jZXB0b1NJVShQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBpZGthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksXHJcbiAgICAgICAgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbikge1xyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvTTNfYWN0dWFsaXphckNvbmNlcHRvU0lVL1wiICsgaWRrYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc29BbENpZXJyZVViaWMoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgaWRfa2F0aW9zOiBzdHJpbmcsIGpEYXRhOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL3Byb2Nlc29BbENpZXJyZVViaWMvXCIgKyBpZF9rYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSyhyZXNwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3IgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHByb2Nlc29BbENpZXJyZVViaWNcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRfUHJvY2Vzb3NBYmllcnRvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIFBvc3RTZXJ2aWNlTTMuZ2V0V2l0aEJvZHlNMygnTTNNYWVzdHJvL2dldF9Qcm9jZXNvc0FiaWVydG9zLycgKyBzSURLYXRpb3MsIGpEYXRhKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIG9GdW5jaW9uT0soSlNPTi5wYXJzZShTdHJpbmcocmVzcCkpLlJFU1BVRVNUQSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBlcnJvciAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZ2V0X1Byb2Nlc29zQWJpZXJ0b3NcIilcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgb0Z1bmNpb25FcnIoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9Ly9FbmQgZ2V0X0luZm9Qcm9jZXNvXHJcblxyXG59XHJcbiIsImltcG9ydCB7IE0zUHJvY2Vzb3MgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3NcIjtcclxuaW1wb3J0IHsgTTNQRW5jSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVuYy1pdGVtc1wiO1xyXG5pbXBvcnQgeyBNM1ByZEdlbmVyYWwgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdlbmVyYWwudHlwZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCB7IE0zUERldGFsbGVJdGVtcywgTTNQSXRlbXNXRUIsIE0zUERldGFsbGVDdXBvbiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNEYXRhIH0gZnJvbSBcIi4uL0RhdGEvbTMtZGF0YVwiO1xyXG5pbXBvcnQgeyBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3JcIjtcclxuaW1wb3J0IHsgeG1sVG9Kc29uVEYgfSBmcm9tIFwiLi4vLi4vQ29udmVydC94bWxUb0pTb24uY2xhc3NcIjtcclxuaW1wb3J0IHsgTTNQSW1wdWVzdG9zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXAtaW1wdWVzdG9zXCI7XHJcbmltcG9ydCB7IE0zVWJpY2FjaW9uIH0gZnJvbSBcIi4uL01hZXN0cm8vVWJpY2FjaW9uL00zVWJpY2FjaW9uLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNFTkNQUk9NTyB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNFTkNQUk9NTy5jbGFzc1wiO1xyXG5pbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IHByb21vY2lvbmVzU2VydmljZSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9wcm9tb2Npb25lcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFByb21vY2lvblByb2Nlc2FkYSwgUHJvbW9jaW9uZXNBc29jaWFkYXMsIFByb21vY2lvbkNvbWJpbmFkYSB9IGZyb20gXCIuLi9Qcm9tb2Npb25lcy9Nb2RlbHMvTTNQcm9tb1Byb2Nlc2FkYS5jbGFzc1wiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgU2VydmljZU0zTWFlc3RybyB9IGZyb20gXCIuL00zTWFlc3Ryby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMaXN0YVByZWNpbyB9IGZyb20gXCIuL20zLWxpc3RhLXByZWNpby5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgYSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3NyYy9yZW5kZXIzXCI7XHJcbmltcG9ydCB7IE0zUHJlc2VudGFjaW9uZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVzZW50YWNpb25lc1wiO1xyXG5pbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXIvc3JjL3V0aWxcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrRGV0IH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRQYWNrRGV0XCI7XHJcbmltcG9ydCB7IE0zUHJkQWRpY2lvbmFsZXMgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEFkaWNpb25hbGVzLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNPdENsYXNpZmljYWNpb25lcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1vdC1jbGFzaWZpY2FjaW9uZXNcIjtcclxuaW1wb3J0IHsgTTNQcmRMaXN0YSB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkTGlzdGEudHlwZVwiO1xyXG5pbXBvcnQgeyBNYXRoVEYgfSBmcm9tIFwiLi4vTWlzY2VsYW5lYS9NYXRoVEYuY2xhc3NcIjtcclxuaW1wb3J0IHsgRUNBTkNFTEVEIH0gZnJvbSBcImNvbnN0YW50c1wiO1xyXG5pbXBvcnQgKiBhcyB4bWwyanMgZnJvbSAneG1sMmpzJztcclxuXHJcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XHJcbnZhciBiaWdEZWNpbWFsID0gcmVxdWlyZSgnanMtYmlnLWRlY2ltYWwnKTtcclxuXHJcbmV4cG9ydCBjbGFzcyBNM1JlZ1NlcnZpY2Uge1xyXG4gICAgcHVibGljIG9NYXRoVEY6IE1hdGhURiA9IG5ldyBNYXRoVEYoKTtcclxuICAgIHByaXZhdGUgb00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybztcclxuICAgIHB1YmxpYyBvTGlzdGFPYnNlcXVpb3M6IEFycmF5PGFueT4gPSBudWxsO1xyXG4gICAgcHVibGljIG9ic2VxdWlvc0V4YzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG9ic2VxdWlvT1Byb21vOiBudW1iZXIgPSAtMTtcclxuICAgIHB1YmxpYyBvYnNlcXVpb3NDYW50aWRhZDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsSWRBY3RpdmFQcm9tbyA9IFtdO1xyXG4gICAgcHJpdmF0ZSBHb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTM7XHJcbiAgICBwcml2YXRlIGdzSWRrYXRpb3M7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW9NM0NvdWNoTWFlc3RybzogTTNDb3VjaE1hZXN0cm8sIElzUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lka2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9NM0NvdWNoTWFlc3RybyA9IGlvTTNDb3VjaE1hZXN0cm87XHJcbiAgICAgICAgdGhpcy5Hb1Bvc3RTZXJ2aWNlTTMgPSBJc1Bvc3RTZXJ2aWNlTTM7XHJcbiAgICAgICAgdGhpcy5nc0lka2F0aW9zID0gc0lka2F0aW9zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAqIFZhbGlkYXIgbnVtZXJvIGRlIGl0ZW1zIGFncmVnYWRvcy4gc2kgZXMgbWF5b3IgYSAxLjAwMCBwcmVuZGUgcGFyYW1ldHJvIFxyXG4gICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJOdW1lcm9JdGVtcyhvbE0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob2xNM1Byb2Nlc29zLk0zRU5DLmxlbmd0aCA+IDEwMDApIHtcclxuICAgICAgICAgICAgb2xNM1Byb2Nlc29zLkFwbERlc2RlU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgb2xNM1Byb2Nlc29zLk0zRU5DID0gbmV3IEFycmF5PE0zUEVuY0l0ZW1zPigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUHJvY2VzYW1pZW50b1NlcnZpY2Uoc0lES2F0aW9zOiBzdHJpbmcsIFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBhcGxSZXRvbWFySW5mbzogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLlZhbGlkYXJOdW1lcm9JdGVtcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgdGhpcy5SZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm8pO1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTMvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdmFyIG9Kc29uID0gSlNPTi5wYXJzZShyZXNwLmpzb24oKSk7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklkTTMgPSBvSnNvbi5SRVNQVUVTVEEuSURNMztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSUREaWFyaW8gPSBvSnNvbi5SRVNQVUVTVEEuSURESUFSSU87XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLklERGlhcmlvQ2llcnJlID0gb0pzb24uUkVTUFVFU1RBLklERElBUklPQ0lFUlJFXHJcblxyXG4gICAgICAgICAgICAvL0FjdHVhbGl6YWNpb24gZGUgZXN0YWRvcy5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5Fc3RhZG9EZXM7XHJcblxyXG4gICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9Kc29uLlJFU1BVRVNUQSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5lblByb2Nlc28gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLmpzb24oKS5NZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25FcnJvcihlcnIuanNvbigpLk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgcHJvY2VzYW1pZW50b19zZXJ2aWNlX2FzeW5jKHNJREthdGlvczogc3RyaW5nLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyxcclxuICAgICAgICBvRGF0YVVzZXI6IGFueSwgYXBsUmV0b21hckluZm86IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5SZXRvbWFySW5mb3JtYWNpb24ob0RhdGFVc2VyLCBvTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm8pO1xyXG5cclxuICAgICAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zL1JlZ2lzdHJvRXZlbnRvTTMvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgICB2YXIgb0pzb24gPSBKU09OLnBhcnNlKHJlc3AuanNvbigpKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuSWRNMyA9IG9Kc29uLlJFU1BVRVNUQS5JRE0zO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5JRERpYXJpbyA9IG9Kc29uLlJFU1BVRVNUQS5JRERJQVJJTztcclxuXHJcbiAgICAgICAgICAgIC8vQWN0dWFsaXphY2lvbiBkZSBlc3RhZG9zLlxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5TdWJFc3RhZG9BbnQgPSBvTTNQcm9jZXNvcy5TdWJFc3RhZG9EZXM7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IG9NM1Byb2Nlc29zLkVzdGFkb0RlcztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShzSURLYXRpb3M6IHN0cmluZywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb00zUHJvY2Vzb3M6IEFycmF5PE0zUHJvY2Vzb3M+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IFBvc3RTZXJ2aWNlTTMucG9zdFNlcnZpY2VIdHRwUmVzRnVsbE0zKFwiTTMvUmVnaXN0cm9FdmVudG9NM09mZkxpbmUvXCIgKyBzSURLYXRpb3MgKyBcIi9cIiArIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DICsgXCIvXCIgKyBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb00zUHJvY2Vzb3MpLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLy8vUmV0b21hciBpbmZvcm1hY2lvbiBwYXJhIGVsIHByb2Nlc28uXHJcbiAgICBwdWJsaWMgUmV0b21hckluZm9ybWFjaW9uKG9EYXRhVXNlcjogYW55LCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgYXBsUmV0b21hckluZm86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAob0RhdGFVc2VyICE9IG51bGwgJiYgb00zUHJvY2Vzb3MuSWRNMyAhPT0gdW5kZWZpbmVkICYmIG9NM1Byb2Nlc29zLklkTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsUmV0b21hckluZm8pIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWIgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUI7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZFViaWMgPT0gdW5kZWZpbmVkIHx8IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT047XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9IG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljUHJlXHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1Byb2Nlc2FtaWVudG8gZGUgZGF0b3MgZW4gYmFzZSBkZSBkYXRvcyBwb3VjaERCLlxyXG4gICAgcHVibGljIFByb2Nlc2FtaWVudG9TZXJ2aWNlUG91Y2hEQihvTTNEYXRhOiBNM0RhdGEsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZyxcclxuICAgICAgICBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGlvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkOiBhbnkgPSBudWxsKSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgLy9DYXJnYXIgZGV0YWxsZSBkZSBpdGVtc1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgb00zRGF0YS5HZXREYXRhUG91Y2hCRChzS2V5Q2Fycml0bykudGhlbihhc3luYyByZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcyA9IHJlc3VsdDtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMudmFsaWRhckV4aXN0YVByb2R1Y3RvKG9NM1Byb2Nlc29zLk0zRU5DLCBwcm9kdWN0VW5pdFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWRfYWN0dWFsICE9IDApIHtcclxuICAgICAgICAgICAgICAgIC8vbGV0IGNhbnRpZGFkX2FjdHVhbCA9IHRoaXMuZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3MsIHByb2R1Y3RVbml0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9ICgrY2FudGlkYWRfYWN0dWFsKSArICtvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vbGV0IE0zRW5jID0gdGhpcy5nZXRfTTNFTkNfYnlfaWRwcmRfbG90ZShvTTNQcm9jZXNvcywgcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UsIHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSk7XHJcblxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIocHJvZCA9PiAhKHByb2QuSWRQcm9kdWN0byA9PSBwcm9kdWN0VW5pdFNlbGVjdGVkLlNLVSAmJiBwcm9kLkxvdGUgPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5MT1RFICYmICEocHJvZC5JZEVuY1BhZHJlID4gMCkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuUmVjYWxjdWxhclByZWNpb3Mob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cob0RhdGFDYXJyaXRvQ29tcHJhcyk7XHJcbiAgICAgICAgfSwgYXN5bmMgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IFwiNDA0XCIpIHsvL05vIGV4aXN0ZSBlbCBjYXJyaXRvIFxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29FbXB0eVBEQihwcm9kR1JQU2VsZWN0ZWQsIG9NM1BJdGVtc1dFQiwgb0RhdGFVc2VyLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBpb00zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0FncmVnYXIgYSBjYXJyaXRvIHByb2R1Y3RvLlxyXG4gICAgcHVibGljIGFkZHRvY2FydChvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uLCBvRGF0YVVzZXI6IGFueSwgc0lES2F0aW9zOiBzdHJpbmcsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCwgdmFsb3JEZXNjdWVudG8gPSAwKSB7XHJcblxyXG4gICAgICAgIHZhciBvTTNQcm9jZXNvczogTTNQcm9jZXNvcyA9IGlvTTNQcm9jZXNvcztcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICB2YXIgcHJvZHVjdFVuaXRTZWxlY3RlZDogTTNQcmRHZW5lcmFsO1xyXG4gICAgICAgIHByb2R1Y3RVbml0U2VsZWN0ZWQgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF07XHJcbiAgICAgICAgLy9KQUdNIDIwMTkwNzIyIHNlIGFncmVnYSBwYXJhIGN1YW5kbyBlcyBlbCBwcmltZXIgcHJvZHVjdG8gcXVlIHNlIGFncmVnYXLDg8KhXHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zRU5DLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9EYXRhVXNlciwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgaW9NM1Byb2Nlc29zLCBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQpO1xyXG4gICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLnZhbGlkYXJFeGlzdGFQcm9kdWN0byhvTTNQcm9jZXNvcy5NM0VOQywgcHJvZHVjdFVuaXRTZWxlY3RlZCwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkX2FjdHVhbCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL2xldCBjYW50aWRhZF9hY3R1YWwgPSB0aGlzLmdldENhbnRpZGFkKG9NM1Byb2Nlc29zLCBwcm9kdWN0VW5pdFNlbGVjdGVkKTtcclxuICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAoK2NhbnRpZGFkX2FjdHVhbCkgKyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gcHJvZHVjdFVuaXRTZWxlY3RlZC5TS1UgJiYgcHJvZC5Mb3RlID09IHByb2R1Y3RVbml0U2VsZWN0ZWQuTE9URSAmJiAhKHByb2QuSWRFbmNQYWRyZSA+IDApKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5Mb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZCwgdmFsb3JEZXNjdWVudG8pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZ1bmNpb25PSylcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0sob00zUHJvY2Vzb3MsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkLCB2YWxvckRlc2N1ZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnVuY2lvbk9LKVxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL1ZhbGlkYSBxdWUgZXhpc3RhIHByb2R1Y3RvIGVuIGxvcyBlbmNhYmV6YWRvcy4gVHJ1ZTogU2kgZXhpc3RlLCBGYWxzZSBkZSBvdHJvIG1vZG9cclxuICAgIC8vIFNlIGNhbWJpYSBmdW5jaW9uYWxpZGFkIGRlIHJldHVybi5cclxuICAgIHB1YmxpYyB2YWxpZGFyRXhpc3RhUHJvZHVjdG8ob00zTGlzdGFFbmM6IEFycmF5PE0zUEVuY0l0ZW1zPiwgb00zUHJkR3JsOiBNM1ByZEdlbmVyYWwsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBvRW5jOiBNM1BFbmNJdGVtcyA9IG51bGw7XHJcbiAgICAgICAgdmFyIGNhbnRpZGFkOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvID0gLTE7XHJcbiAgICAgICAgaWYgKG9NM0xpc3RhRW5jICE9PSB1bmRlZmluZWQgJiYgb00zUHJkR3JsICE9PSB1bmRlZmluZWQgJiYgb00zTGlzdGFFbmMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgb0VuYyA9IG9NM0xpc3RhRW5jLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9NM1ByZEdybC5TS1UgJiYgIWVuYy5JZEVuY1BhZHJlICYmIHRoaXMuZ2V0Q2FudGlkYWRQb3NpdGl2YShlbmMpKTtcclxuICAgICAgICAgICAgaWYgKG9FbmMgIT09IHVuZGVmaW5lZCAmJiBvRW5jICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDcxNyBWYWxpZGFyIGFob3JhIGVsIHByZWNpby5cclxuICAgICAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHcmwsICtvRW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuVmFsaWRhclByZWNpb3NQcmRzKG9FbmMsIG9NM1ByZEdybC5Mb00zUHJkTGlzdGEpICYmICF0aGlzLlZhbGlkYXJFc3RhUGFxdWV0ZShvRW5jLCBvTTNMaXN0YUVuYykpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbyA9IG9FbmMuSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FudGlkYWQgPSArb0VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FudGlkYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2FudGlkYWRQb3NpdGl2YShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGNhbnRpZGFkID0gMDtcclxuICAgICAgICBsZXQgZGV0Q2FudGlkYWQgPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKVxyXG5cclxuICAgICAgICBpZiAoZGV0Q2FudGlkYWQpIHtcclxuICAgICAgICAgICAgY2FudGlkYWQgPSArZGV0Q2FudGlkYWQuVmFsb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FudGlkYWQgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGEgcXVlIGVsIGVuY2FiZXphZG8gY29uIGVsIHByb2R1Y3RvIGFncmVnYWRvLCBzZWEgdW4gcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBvTTNMaXN0YUVuYyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYXJFc3RhUGFxdWV0ZShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBvTTNMaXN0YUVuYzogQXJyYXk8TTNQRW5jSXRlbXM+KSB7XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKG9NM0xpc3RhRW5jLmZpbmQoeCA9PiB4LklkRW5jUGFkcmUgPT0gb00zUEVuY0l0ZW1zLklEKSkge1xyXG4gICAgICAgICAgICAgICAgYlJlc3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGFyIGxvcyBwcmVjaW9zIGRlIGxvcyBwcm9kdWN0b3NcclxuICAgICAqIEBwYXJhbSBvRW5jIFxyXG4gICAgICogQHBhcmFtIG9NM1ByZExpc3RhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclByZWNpb3NQcmRzKG9FbmM6IE0zUEVuY0l0ZW1zLCBvTTNQcmRMaXN0YTogTTNQcmRMaXN0YSkge1xyXG4gICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkUHJlY2lvRW5jOiBudW1iZXIgPSArb0VuYy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIlBVTklUXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICB2YXIgZFByZWNpb0xpc3Q6IG51bWJlciA9IG9NM1ByZExpc3RhLlBSRUNJTztcclxuXHJcbiAgICAgICAgICAgIGlmIChkUHJlY2lvTGlzdCA9PSBkUHJlY2lvRW5jKSB7XHJcbiAgICAgICAgICAgICAgICBiUmVzcCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgVmFsaWRhclByZWNpb3NQcmRzXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYlJlc3A7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIFVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgdGlwb1ViaWNhY2lvbjogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLCBmdW5jaW9uRXJyb3I6IEZ1bmN0aW9uXHJcbiAgICAgICAgLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCID0gbnVsbCkge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvL0lESFVCXHJcbiAgICAgICAgaWYgKHRpcG9VYmljYWNpb24udG9VcHBlckNhc2UoKSA9PSBcIldFQlwiKSB7XHJcbiAgICAgICAgICAgIHNLZXlDYXJyaXRvID0gb00zRGF0YS5HZXRLZXlDYXJyaXRvQ29tcHJhcyhzSURLYXRpb3MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuTkRPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTiwgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuXHJcbiAgICAgICAgICAgIG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG8sIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIG0zVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNhclByb21vQWZ0ZXJDYXJyaXRvT2sob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgbTNVYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbkVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIG0zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQikge1xyXG4gICAgICAgIGlmIChtM1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICB2YXIgbG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICAgICAgICAgIGxvTTNQSXRlbXNXRUIgPSBvTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCID0gbmV3IE0zUEl0ZW1zV0VCKCk7XHJcbiAgICAgICAgICAgICAgICBsb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXModGhpcy5nc0lka2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIHRoaXMuUHJvY1Byb21vQWZ0ZXJBZGRUb0NhcnQob00zUHJvY2Vzb3MsIG9EYXRhVXNlciwgbG9NM1BJdGVtc1dFQiwgbTNVYmljYWNpb24sIHRydWUpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh4KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG9EYXRhKTtcclxuICAgICAgICAgICAgICAgIG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXNBc3luYyhzS2V5Q2Fycml0bywgb00zUHJvY2Vzb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaCh4ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHgpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG5vIGNvbnRyb2xhZG8gZW4gcHJvY2VzYXJQcm9tb0FmdGVyQ2Fycml0b09rXCIpO1xyXG4gICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgIHRoaXMub0VuY2FiZXphZG9NM0NvbXBvbmVudC5SZWNhcmdhckNhcnJpdG8oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5Mb2FkQ2FydCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZ1bmNpb25PSygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9BY3R1YWxpemFjaW9uIGRlIE0zIHByb2Nlc29zLCBjb24gZGF0YSBsaXN0YSBwYXJhIGFjdHVhbGl6YXIuXHJcbiAgICBwdWJsaWMgdXBkYXRlQVBvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCB0aXBvVWJpY2FjaW9uOiBzdHJpbmcsIGZ1bmNpb25PSzogRnVuY3Rpb24sIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24pIHtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gQkQgUG91Y2hEQlxyXG4gICAgICAgIHZhciBzS2V5Q2Fycml0bzogc3RyaW5nO1xyXG4gICAgICAgIC8vT2J0ZW5lciBrZXkgZGUgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgLy9JREhVQlxyXG4gICAgICAgIGlmICh0aXBvVWJpY2FjaW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJXRUJcIikge1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgICAgICBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uT0soKTtcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSBcIjQwNFwiKSB7Ly9ObyBleGlzdGUgZWwgY2Fycml0byBcclxuICAgICAgICAgICAgICAgICAgICBvTTNEYXRhLkFkZFRvUG91Y2hCRENhcnJpdG9Db21wcmFzKHNLZXlDYXJyaXRvLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igbm8gY29udHJvbGFkb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBmdW5jaW9uRXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGE6IE0zRGF0YSwgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgc0tleUNhcnJpdG8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgIGF3YWl0IG9NM0RhdGEuRGVsZXRlKHNLZXlDYXJyaXRvKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8vRWxpbWluYXIgZG9jdW1lbnRvIGRlIGNvdWNoL3BvdWNoLCBpbmljaW8geSBhY3R1YWxcclxuICAgIHB1YmxpYyBEZWxEb2NzU3RhcnRBbmRDdXJyZW50KG9NM0RhdGE6IE0zRGF0YSwgc0lES2F0aW9zOiBzdHJpbmcsIG9sTTNQcm9jZXNvczogTTNQcm9jZXNvcywgVWJpY2FjaW9uQ3VycmVudCwgSHViQ3VycmVudCkge1xyXG4gICAgICAgIC8vRWxpbWluYXIgSW5pY2lhbFxyXG4gICAgICAgIGlmIChvbE0zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgIT09IHVuZGVmaW5lZCAmJiBvbE0zUHJvY2Vzb3MuSUREaWFyaW9DaWVycmUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFVc2VyID0geyBcIlVzdWFyaW9TaXN0ZW1hXCI6IHsgXCJURE9DXCI6IG9sTTNQcm9jZXNvcy5URG9jLCBcIk5ET0NcIjogb2xNM1Byb2Nlc29zLk5Eb2MsIFwiVUJJQ0FDSU9OXCI6IG9sTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpLCBcIklESFVCXCI6IG9sTTNQcm9jZXNvcy5JREh1YiB9IH1cclxuICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZSBzdGFydFwiKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICAgIC8vRWxpbWluYXIgYWN0dWFsXHJcbiAgICAgICAgICAgIG9EYXRhVXNlciA9IHsgXCJVc3VhcmlvU2lzdGVtYVwiOiB7IFwiVERPQ1wiOiBvbE0zUHJvY2Vzb3MuVERvYywgXCJORE9DXCI6IG9sTTNQcm9jZXNvcy5ORG9jLCBcIlVCSUNBQ0lPTlwiOiBVYmljYWNpb25DdXJyZW50LnRvU3RyaW5nKCksIFwiSURIVUJcIjogSHViQ3VycmVudCB9IH1cclxuICAgICAgICAgICAgdGhpcy5EZWxldGVNM1Byb2Nlc28ob00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MpLnRoZW4oeCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlbGV0ZSBjdXJyZW50XCIpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWN0dWFsaXphY2lvbiBkZSBNMyBwcm9jZXNvcywgY29uIGRhdGEgbGlzdGEgcGFyYSBhY3R1YWxpemFyLlxyXG4gICAgcHVibGljIGFzeW5jIEdldENhcnJpdG9Db21wcmFzUG91Y2hEQihvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZykge1xyXG4gICAgICAgIC8vR3VhcmRhciBlbiBCRCBQb3VjaERCXHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvOiBzdHJpbmc7XHJcbiAgICAgICAgdmFyIG9NM1Byb2Nlc287XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc28gPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuICAgICAgICByZXR1cm4gb00zUHJvY2VzbztcclxuICAgIH1cclxuXHJcbiAgICAvL1RyYXNsYWRhciBpbmZvcm1hY2nDg8KzbiBkZSBjYXJyaXRvLCBkb3MgdXN1YXJpb3NcclxuICAgIHB1YmxpYyBhc3luYyBNb3ZlQ2FydEludG9Vc2VyKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlck9yaWdlbjogYW55LCBvRGF0YVVzZXJEZXN0aW5vOiBhbnksIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgc0tleUNhcnJpdG9PcmlnZW47XHJcbiAgICAgICAgdmFyIHNLZXlDYXJyaXRvRGVzdGlubztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgc0tleUNhcnJpdG9PcmlnZW4gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyT3JpZ2VuLlVzdWFyaW9TaXN0ZW1hLlRET0MsIG9EYXRhVXNlck9yaWdlbi5Vc3VhcmlvU2lzdGVtYS5ORE9DLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXJPcmlnZW4uVXN1YXJpb1Npc3RlbWEuSURIVUIpO1xyXG4gICAgICAgICAgICBzS2V5Q2Fycml0b0Rlc3Rpbm8gPSBvTTNEYXRhLkdldEtleUNhcnJpdG9Db21wcmFzKHNJREthdGlvcywgb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5URE9DLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVUJJQ0FDSU9OLCBvRGF0YVVzZXJEZXN0aW5vLlVzdWFyaW9TaXN0ZW1hLklESFVCKTtcclxuICAgICAgICAgICAgbGV0IG9NM1Byb2Nlc28gPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvT3JpZ2VuKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc28uVERvYyA9IG9EYXRhVXNlckRlc3Rpbm8uVXN1YXJpb1Npc3RlbWEuVERPQztcclxuICAgICAgICAgICAgb00zUHJvY2Vzby5ORG9jID0gb0RhdGFVc2VyRGVzdGluby5Vc3VhcmlvU2lzdGVtYS5ORE9DO1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb1tcIl9yZXZcIl07XHJcbiAgICAgICAgICAgIGF3YWl0IG9NM0RhdGEuQWRkVG9Qb3VjaEJEQ2Fycml0b0NvbXByYXMoc0tleUNhcnJpdG9EZXN0aW5vLCBvTTNQcm9jZXNvKTtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgZnVuY2lvbk9LKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVjYWxjdWxhciBwcmVjaW9zIHRvdGFsZXMgeSBkZSBiYXNlXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvc1Byb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbDtcclxuICAgICAgICAvLyB2YXIgZFByZWNpb1RvdGFsQmFzZTtcclxuICAgICAgICAvLyB2YXIgZFZhbG9yOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vIHZhciBkVmFsb3JOZXRvOiBudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgIC8vICAgICBkUHJlY2lvVG90YWwgPSBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IgLy8oK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvcikgKiAoK2VuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQVU5JVE5FVE9cIikuVmFsb3IpO1xyXG4gICAgICAgIC8vICAgICBkUHJlY2lvVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhclByZWNpb0Jhc2VGcm9tUHJvY2VzbyhlbmMsIGRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9UT1RBTEJBU0VcIikuVmFsb3IgPSBTdHJpbmcoTWF0aC5yb3VuZChkUHJlY2lvVG90YWxCYXNlICogMTAwKSAvIDEwMCk7XHJcbiAgICAgICAgLy8gICAgIGRWYWxvciA9ICgrZFZhbG9yKSArICgrZFByZWNpb1RvdGFsQmFzZSk7XHJcbiAgICAgICAgLy8gICAgIGRWYWxvck5ldG8gPSAoK2RWYWxvck5ldG8pICsgKCtkUHJlY2lvVG90YWwpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLlJlY2FsY3Vsb0ltcHVlc3RvcyhlbmMsIGRQcmVjaW9Ub3RhbEJhc2UpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIC8vIC8vb00zUHJvY2Vzb3MuVmFsb3IgPSBkVmFsb3I7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gZFZhbG9yTmV0bztcclxuICAgICAgICB0aGlzLlJlY2FsY3VsYXJQcmVjaW9zKG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9SZWNhbGN1bGFyIHByZWNpb3MuIHJlY29ycmllbmRvIGxvcyBlbmNhYmV6YWRvcy5cclxuICAgIHB1YmxpYyBSZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIHZhciB2YWxvciA9IDA7XHJcbiAgICAgICAgdmFyIFZhbG9yTmV0byA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAvL0pBR00gMjAxOTEwMTAgc2UgY2FtYmlhIGVsIHZhbG9yIGRlbCBwcmVjaW8gdW5pdGFyaW8gYmFzZSwgeWEgcXVlIGFsIG1vbWVudG8gZGUgbGxhbWFyIGxhIGZ1bmNpw4PCs24gVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvXHJcbiAgICAgICAgICAgIC8vIHNlIHJlY2FsY3VsbyBlbCBwcmVjaW8gdG90YWwsIGRlcGVuZGllbmRvIGRlIGVzdGUgdmFsb3IuXHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVEJMRElNUFBSRFwiKS5WYWxvcixcclxuICAgICAgICAgICAgICAgIHRoaXMub01hdGhURi5yb3VuZChlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IsIDIpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWRFbmMgPSArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgICAgICAgICBpZiAoK2RDYW50aWRhZEVuYyAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVU5JVEJBU0VcIikuVmFsb3IgPSAoK3BUb3RhbEJhc2UgLyArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIlBSRUNJT1VOSVRCQVNFXCIpLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5WYWxvcmVzQ2FsY3VsYWRvc1Byb2Nlc28oZW5jLCArZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIGJhc2UgZGUgdW4gcHJlY2lvLCB0ZW5pZW5kbyBlbCB2YWxvciB0b3RhbCBvIG5ldG8uXHJcbiAgICBwdWJsaWMgQ2FsY3VsYXJQcmVjaW9CYXNlRnJvbVByb2Nlc28ob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZFByZWNpb05ldG86IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkVmFsb3JJbXB1ZXN0bzogbnVtYmVyID0gMTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGRWYWxvckltcHVlc3RvID0gKCtkVmFsb3JJbXB1ZXN0bykgKyAoK2ltcC5Qb3JjZW50YWplKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKCgrZFByZWNpb05ldG8pIC8gKCtkVmFsb3JJbXB1ZXN0bykpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vUmVjYWxjdWxvIGRlIHZhbG9yIGRlIGltcHVlc3RvcywgY3VhbmRvIGNhbWJpYSBlbCB2YWxvci4gU2VhIHBvciBjYW50aWRhZCwgZWxpbWluYWNpw4PCs24uLi5cclxuICAgIC8vIHB1YmxpYyBSZWNhbGN1bG9JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZFByZWNpb0Jhc2U6IG51bWJlcikge1xyXG4gICAgLy8gICAgIHZhciBkVG90YWxJbXB1ZXN0bzogbnVtYmVyID0gMDtcclxuICAgIC8vICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgIC8vICAgICAgICAgaW1wLlZhbG9yID0gKCtkUHJlY2lvQmFzZSkgKiAoK2ltcC5Qb3JjZW50YWplKTtcclxuICAgIC8vICAgICAgICAgLy9KQUdNIDIwMTgwOTEyIG51ZXZvIGNvbmNlcHRvXHJcbiAgICAvLyAgICAgICAgIGltcC5CYXNlID0gZFByZWNpb0Jhc2U7XHJcbiAgICAvLyAgICAgICAgIGRUb3RhbEltcHVlc3RvID0gKCtkVG90YWxJbXB1ZXN0bykgKyAoK2ltcC5WYWxvcik7XHJcbiAgICAvLyAgICAgICAgIC8vU3VtYSBkZSBwcmVjaW8gYmFzZSBcclxuICAgIC8vICAgICAgICAgZFByZWNpb0Jhc2UgPSAoK2RQcmVjaW9CYXNlKSArICgraW1wLlZhbG9yKTtcclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICBkVG90YWxJbXB1ZXN0byA9IE1hdGgucm91bmQoZFRvdGFsSW1wdWVzdG8gKiAxMDApIC8gMTAwO1xyXG4gICAgLy8gICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciA9IGRUb3RhbEltcHVlc3RvLnRvU3RyaW5nKCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYWNpb24gbnVldm8gTTMgcHJvY2Vzb3MsIGVzdGUgdmEgdmFjaW8gc2luIG5pc2lxdWllcmEgTTNQRW5jSXRlbXMuIFxyXG4gICAgICogU2UgdXRpbGl6YSBwcmluY2lwYWxtZW50ZSBwYXJhIGxhcyBjcmVhY2lvbiBkZXNkZSAwIHVuIE0zIFByb2Nlc28uIFF1ZSBwYXNhIGRlIGVzdGFkb3MgJycgYWwgcHJpbWVyIGVzdGFkb1xyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBpZHByb2Nlc29fZGVzdGlubyBcclxuICAgICAqIEBwYXJhbSB0ZG9jIFxyXG4gICAgICogQHBhcmFtIG5kb2MgXHJcbiAgICAgKiBAcGFyYW0gZXN0YWRvc19mdXR1cm9zIFxyXG4gICAgICogQHBhcmFtIGlkSHViIFxyXG4gICAgICogQHBhcmFtIGlkVWJpY2FjaW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ3JlYXRlTTNOZXdQcm9jZXNvRW1wdHkoaW9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZHByb2Nlc29fZGVzdGlubzogc3RyaW5nLCB0ZG9jOiBzdHJpbmcsIG5kb2M6IHN0cmluZyxcclxuICAgICAgICBlc3RhZG9zX2Z1dHVyb3M6IEFycmF5PGFueT4sIGlkSHViOiBzdHJpbmcsIGlkVWJpY2FjaW9uOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gaWRwcm9jZXNvX2Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlN1YkVzdGFkb0FudCA9IFwiXCI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLkVzdGFkb0RlcyA9IGVzdGFkb3NfZnV0dXJvc1swXS5FX0Rlc3Rpbm87XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IGVzdGFkb3NfZnV0dXJvc1swXS5TRV9EZXN0aW5vO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkSHViID0gK2lkSHViO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpYyA9ICtpZFViaWNhY2lvbjtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuSURIdWIgPSAraWRIdWI7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlViaWMxID0gK2lkVWJpY2FjaW9uO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5URG9jID0gdGRvYztcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTkRvYyA9IG5kb2M7XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zLlRpcG9UZXJjZXJvID0gMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuVWJpYzIgPSAtMTtcclxuICAgICAgICBpb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YlByZSA9IC0xO1xyXG4gICAgICAgIGlvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZSA9IC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ3VhbmRvIHNlIGFncmVnYSBwb3IgcHJpbWVyYSB2ZXogYWwgY2Fycml0byBkZSBjb21wcmEuXHJcbiAgICBwdWJsaWMgTG9hZE0zUHJvY2Vzb0VtcHR5UERCKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvRGF0YVVzZXI6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIC8vc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT05cclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgaWYgKGlvTTNQcm9jZXNvcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gaW9NM1Byb2Nlc29zO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLkZlY2hhID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlRpcG9UZXJjZXJvID0gMTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5URG9jID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlRET0M7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTkRvYyA9IG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5ORE9DO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlViaWMxID0gb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTjtcclxuICAgICAgICBvTTNQcm9jZXNvcy5VYmljMiA9IC0xO1xyXG4gICAgICAgIC8vL0FHUkVHQVIgTlVFVkEgRlVOQ0lPTkFMSURBRCBERSBIVUJTLiBGTFVKTyBERSBUUkFCQUpPXHJcbiAgICAgICAgb00zUHJvY2Vzb3MuSURIdWIgPSBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuSURIVUI7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNGVHJhYmFqby5JZEh1YiA9IG9NM1Byb2Nlc29zLklESHViO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRVYmljID0gb00zUHJvY2Vzb3MuVWJpYzE7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRlRyYWJham8uSWRIdWJQcmUgPSAtMTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0ZUcmFiYWpvLklkVWJpY1ByZSA9IC0xO1xyXG5cclxuICAgICAgICAvLy9GSU4gQUdSRUdBUiBOVUVWQSBGVU5DSU9OQUxJREFEIERFIEhVQlMuIEZMVUpPIERFIFRSQUJBSk9cclxuXHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuU3ViRXN0YWRvQW50ID0gXCJcIjtcclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5Fc3RhZG9BbnQgPSBcIlwiO1xyXG5cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID09IFwiXCIgJiYgaW9NM1Byb2Nlc29zID09IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuU3ViRXN0YWRvRGVzID0gXCJSZWdpc3Ryb1wiO1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Fc3RhZG9EZXMgPSBcIkFjdGl2b1wiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5TdWJFc3RhZG9fbyAhPSBcIlwiICYmIG9NM1BJdGVtc1dFQi5Fc3RhZG9fbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlN1YkVzdGFkb0RlcyA9IG9NM1BJdGVtc1dFQi5TdWJFc3RhZG9fbztcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuRXN0YWRvRGVzID0gb00zUEl0ZW1zV0VCLkVzdGFkb19vO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSWRQcm9jZXNvID09IFwiXCIgJiYgaW9NM1Byb2Nlc29zID09IG51bGwpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28gPSBcIk0zRUNDXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAob00zUEl0ZW1zV0VCLklkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5UTUlkUHJvY2VzbyA9IG9NM1BJdGVtc1dFQi5JZFByb2Nlc287XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMucHVzaCh0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKSk7XHJcbiAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgbnVsbCwgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKVxyXG5cclxuICAgICAgICAvLyBvTTNQcm9jZXNvcy5WYWxvciA9IG9NM1BJdGVtc1dFQi5kUHJlY2lvVG90YWw7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIC8vdGhpcy5Qcm9jZXNhbWllbnRvU2VydmljZShQb3N0U2VydmljZU0zLCBvTTNQcm9jZXNvcywgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NhcmdhciBudWV2b3MgYWRpY2lvbmFsZXMgYWRpY2lvbmFsZXNcclxuICAgIHB1YmxpYyBMb2FkQWRpY2lvbmFsZXMob00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgcHJvZHVjdDogVHlwZU0zUHJkR3JwKTogTTNQSXRlbXNXRUIge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5DbGF2ZVByZFNSViA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIkNMQVZFUFJPRFNFUlZcIikuVkFMT1I7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5DbGF2ZVByZFVuaWRhZCA9IHByb2R1Y3QuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoYWRpID0+IGFkaS5BVFJJQlVUTyA9PSBcIkNMQVZFVU5JREFEXCIpLlZBTE9SO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuVW5pZGFkID0gcHJvZHVjdC5Mb00zUHJkQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkFUUklCVVRPID09IFwiVU5JREFEXCIpLlZBTE9SO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1BJdGVtc1dFQjtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBwcm9jZXNvcywgcmV0b21hbmRvIGRlc2RlIGRhdGFcclxuICAgIHB1YmxpYyBMb2FkTTNQcm9jZXNvRnJvbURhdGEob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQcm9jZXNvcyB7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3IgPSAoK29NM1Byb2Nlc29zLlZhbG9yKSArICgrb00zUEl0ZW1zV0VCLmRQcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgLy8gb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gb00zUHJvY2Vzb3MuVmFsb3I7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID09IFwiXCIgJiYgb00zUEl0ZW1zV0VCLklkUHJvY2VzbyAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlRNSWRQcm9jZXNvID0gb00zUEl0ZW1zV0VCLklkUHJvY2VzbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vb00zUHJvY2Vzb3MuTTNFTkMucHVzaCh0aGlzLkxvYWRNM1BFbmNJdGVtc0Zyb21QcmRHcmwob00zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZCwgb00zUHJvY2Vzb3MuTTNFTkMsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb0RhdGFVc2VyKSk7XHJcbiAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQsIG9NM1Byb2Nlc29zLk0zRU5DLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8sIG9EYXRhVXNlciwgbnVsbCwgdmFsb3JEZXNjdWVudG8sIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZClcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCxcclxuICAgICAgICBvZW5jYWJlemFkb0l0ZW1zOiBBcnJheTxNM1BFbmNJdGVtcz4sIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsXHJcbiAgICAgICAgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSwgb1BhZHJlTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvckRlc2N1ZW50byA9IDAsIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZDogYW55ID0gbnVsbCkge1xyXG5cclxuICAgICAgICAvL1ZhbGlkYWNpb24gZGUgSW52ZW50YXJpby5cclxuICAgICAgICBsZXQgYWRpVmVudGFOZWcgPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEFkaWNpb25hbGVzLmZpbmQoeCA9PiB4LkFUUklCVVRPID09IFwiVkVOVEFORUdcIilcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3NbXCJJbnZlbnRhcmlvRXJyb3JcIl0pIHtcclxuICAgICAgICAgICAgZGVsZXRlIG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuVE1JZFByb2Nlc28udG9VcHBlckNhc2UoKSA9PSBcIk0zRUNDXCIgJiYgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEUgPCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkICYmIG9NM1ViaWNhY2lvbi5NM0hVQlNbMF0uVGlwbyA9PSBcIldFQlwiICYmICEoYWRpVmVudGFOZWcgJiYgYWRpVmVudGFOZWcuVkFMT1IpKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zW1wiSW52ZW50YXJpb0Vycm9yXCJdID0gJ05vIGhheSBpbnZlbnRhcmlvIHBhcmEgYWdyZWdhciAnICsgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCArICcgSXRlbXMnO1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkRJU1BPTklCTEU7XHJcbiAgICAgICAgfSAvL2Vsc2Uge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuRmVjaGEgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgb00zUEVuY0l0ZW1zID0gdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNQcm9jZXNvcy5NM0VOQywgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9QYWRyZU0zUEVuY0l0ZW1zLCB2YWxvckRlc2N1ZW50byk7XHJcblxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvc1tcIk1lbnNhamVFcnJvclwiXSkge1xyXG4gICAgICAgICAgICBkZWxldGUgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvUGFkcmVNM1BFbmNJdGVtcykge1xyXG4gICAgICAgICAgICAvL1RpZW5lIHVuIGVuY2FiZXphZG8gcGFkcmUuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZEVuY1BhZHJlID0gb1BhZHJlTTNQRW5jSXRlbXMuSUQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9NM1BFbmNJdGVtc1tcIk1lbnNhamVFcnJvclwiXSkge1xyXG4gICAgICAgICAgICB2YXIgb2xNM1ByZFBhY2tEZXQ6IEFycmF5PE0zUHJkUGFja0RldD47XHJcbiAgICAgICAgICAgIG9sTTNQcmRQYWNrRGV0ID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLk0zUEFDS1xyXG4gICAgICAgICAgICBpZiAob2xNM1ByZFBhY2tEZXQgJiYgb2xNM1ByZFBhY2tEZXQubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vbGV0IHZhbG9yRGVzY3VlbnRvUGFjayA9IHRoaXMuY2FsY3VsYXJQb3JjZW50YWplRGVzY3VlbnRvQ29tYm8ocHJvZEdSUFNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sTTNQcmRQYWNrRGV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCA9IG9sTTNQcmRQYWNrRGV0W2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYWNrTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAob00zUHJkUGFja0RldC5vTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCID0gb00zUHJkUGFja0RldC5vTTNQSXRlbXNXRUI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIgPSBPYmplY3QuYXNzaWduKHt9LCBvTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gb00zUHJkUGFja0RldC5DYW50aWRhZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLlBhdGhJbWFnZW4gPSBvTTNQcmRQYWNrRGV0LmdzUGF0aEltYWdlbjtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuZENhbnRpZGFkID0gcGFja00zUEl0ZW1zV0VCLmRDYW50aWRhZCAqIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLkNhbGN1bGFyUHJlY2lvc1BDS0cob00zUHJkUGFja0RldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja00zUEl0ZW1zV0VCLklERW5jUmVwZXRpZG8gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIGkgKyAyOyAvL0VzdG8gZnVuY2lvbmEgc2kgdGllbmUgc29sbyAyIG5pdmVsZXNcclxuICAgICAgICAgICAgICAgICAgICAvL1NpIGVzdG8gc2UgY3VtcGxlIGVzdGUgcHJvZHVjdG8gZXMgdW4gcGFjayB5IHRpZW5lIHByb2R1Y3RvcyBhc29jaWFkb3MuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUHJkUGFja0RldC5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJkR2VuZXJhbCA9IG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTTNDb2RzLmZpbmQoeCA9PiB4LklkQ29kaWdvID09IFwiVVBDXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJkR2VuZXJhbCAmJiBwcmRHZW5lcmFsLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrTTNQSXRlbXNXRUIuQ29kaWdvQmFycmFzID0gcHJkR2VuZXJhbC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIm5vIGHDg8KxYWRpIGNvZGlnbyBkZSBiYXJyYXMgYSBwcm9kdWN0byBoaWpvOiBcIiArIG9NM1ByZFBhY2tEZXQuU0tVSElKTylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsKG9NM1Byb2Nlc29zLCBvTTNQcmRQYWNrRGV0Lk0zR1JQLCBvTTNQcm9jZXNvcy5NM0VOQywgcGFja00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcywgMCwgb00zUERpbmFtaWNhc0J5QWN0aXZpZGFkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNjIzLCBlc3RvIGVzIGN1YW5kbyBzZSBtb2RpZmljYSBsYSBjYW50aWRhZCBkZSBwcm9kY3V0b3MgZXhpc3RlbnRlcy5cclxuICAgICAgICAgICAgaWYgKG9NM1BJdGVtc1dFQi5JREVuY1JlcGV0aWRvICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSBvTTNQSXRlbXNXRUIuSURFbmNSZXBldGlkbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL0pBR00gMjAxOSBlbnZpbyBkZSBwYWRyZSBkZXNkZSBpbnN0cnVjY2lvbiBtYXMgYXJyaWJhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLklkRW5jUGFkcmUgPSBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5UaXBvQWdydXBhY2lvbiA9IG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAob00zUERpbmFtaWNhc0J5QWN0aXZpZGFkICYmIG9NM1BEaW5hbWljYXNCeUFjdGl2aWRhZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRGluYW1pY2FzQnlBY3RpdmlkYWQuZm9yRWFjaChkaW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BEaW5hbUJ5QWN0aXZpZGFkLnB1c2goey4uLiBkaW59KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5wdXNoKG9NM1BFbmNJdGVtcyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3NbXCJNZW5zYWplRXJyb3JcIl0gPSBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5JREVuY1Byb2Nlc2FkbyA9IG9NM1BFbmNJdGVtcy5JRDtcclxuICAgICAgICAvL31cclxuICAgIH1cclxuXHJcbiAgICBjYWxjdWxhclBvcmNlbnRhamVEZXNjdWVudG9Db21ibyhwcm9kR1JQU2VsZWN0ZWQ6IFR5cGVNM1ByZEdycCkge1xyXG4gICAgICAgIGxldCB2YWxvckRlc2N1ZW50b1BhY2sgPSAwO1xyXG4gICAgICAgIGxldCB2YWxvckl0ZW1zQ29tYm9TdW1hID0gMDtcclxuICAgICAgICBsZXQgdmFsb3JGaW5hbENvbWJvID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcblxyXG4gICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5NM1BBQ0suZm9yRWFjaChwcmRQYWNrID0+IHtcclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkID0gcHJkUGFjay5NM0dSUC5DYW50aWRhZCA/IHByZFBhY2suTTNHUlAuQ2FudGlkYWQgOiAxO1xyXG4gICAgICAgICAgICBsZXQgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJkUGFjay5NM0dSUCwgY2FudGlkYWQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZFBhY2suTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLklETElTVEEpXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcocHJkUGFjay5NM0dSUC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPKVxyXG4gICAgICAgICAgICB2YWxvckl0ZW1zQ29tYm9TdW1hICs9IChwcmRQYWNrLk0zR1JQLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gKiBjYW50aWRhZCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh2YWxvckl0ZW1zQ29tYm9TdW1hID4gdmFsb3JGaW5hbENvbWJvKSB7XHJcbiAgICAgICAgICAgIHZhbG9yRGVzY3VlbnRvUGFjayA9IDEwMCAtICh2YWxvckZpbmFsQ29tYm8gKiAxMDAgLyB2YWxvckl0ZW1zQ29tYm9TdW1hKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh2YWxvckRlc2N1ZW50b1BhY2spXHJcbiAgICAgICAgcmV0dXJuIHZhbG9yRGVzY3VlbnRvUGFjaztcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bG8gZGUgcHJlY2lvcyBkZSBoaWpvcyBkZWwgcGFxdWV0ZVxyXG4gICAgICogQHBhcmFtIG9NM1ByZFBhY2tEZXQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDYWxjdWxhclByZWNpb3NQQ0tHKG9NM1ByZFBhY2tEZXQ6IE0zUHJkUGFja0RldCkge1xyXG4gICAgICAgIG9NM1ByZFBhY2tEZXQuTTNHUlAuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvYWRNM1BFbmNJdGVtc0Zyb21Qcm9tb2Npb25Db21ibyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZHVjdG9zSGlqb3NEZWxDb21ibzogQXJyYXk8TTNQRW5jSXRlbXM+LCBjb2RpZ286IHN0cmluZywgdmFsb3IsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHByb2R1Y3RvQ29tYm8gPSBuZXcgTTNQRW5jSXRlbXMoKTtcclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5JZFByb2R1Y3RvID0gY29kaWdvO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTG90ZSA9IFwiMVwiO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk9yZGVuID0gK3RoaXMuR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEob00zUHJvY2Vzb3MuTTNFTkMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTm9tYnJlID0gYENvbWJvIC0gJHtwcm9kdWN0b3NIaWpvc0RlbENvbWJvLm1hcCh4PT4geC5JZFByb2R1Y3RvKS5qb2luKCctJyl9YDtcclxuXHJcblxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT0NPTUJPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcInRydWVcIiwgXCJFU1BST0RQUk9NT1wiKSk7IC8vIFRSVUUtPiBTSSBFUyBVTiBQUk9EVUNUTyBQT1IgUFJPTU9DSU9OLCBGQUxTRS0+IERFIE9UUk8gTU9ET1xyXG4gICAgICAgIC8vRGV0YWxsZXMgZGUgZmFjdHVyYSBlbGVjdHJvbmljYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiRU5DUFJPTU9cIiwgXCJUSVBPX1BSRFwiKSk7XHJcbiAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgLy8qKiBJTklDSU8gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQUkVDSU9VTklUQkFTRVwiKSk7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3NcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoXCIwXCIsIFwiVE9UQUxJTVBVTklUXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvciwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUodmFsb3IsIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIlBVTklUTkVUT1wiKSk7Ly9Db24gZGVzY3VlbnRvIGluY2x1aWRvLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlZVTklUUFJPTU9cIikpOy8vVW5pdGFyaW8gUHJvbW9jaW9uIC0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJVTklURklERUxcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8qKiBGSU4gVkFMT1JFUyBVTklUQVJJT1MgKi9cclxuXHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMSU1QVUVTVE9TXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShcIjBcIiwgXCJGSURFTElaQUNJT05cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiMFwiLCBcIlRPVEFMUFJPTU9cIikpO1xyXG4gICAgICAgIHByb2R1Y3RvQ29tYm8uTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKHZhbG9yLCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlNVQlRPVEFMXCIpKTtcclxuICAgICAgICBwcm9kdWN0b0NvbWJvLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK3ZhbG9yICogZENhbnRpZGFkKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMQkFTRVwiKSk7XHJcbiAgICAgICAgcHJvZHVjdG9Db21iby5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKCt2YWxvciAqIGRDYW50aWRhZCkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKSk7XHJcblxyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG9Db21ibyk7XHJcbiAgICAgICAgcHJvZHVjdG9zSGlqb3NEZWxDb21iby5mb3JFYWNoKHByb2R1Y3RvID0+IHtcclxuICAgICAgICAgICAgcHJvZHVjdG8uSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM0VOQywgXCJJRFwiKSArIDE7IC8vSkFHTSwgY2FtYmlvIGRlIElELCBjYXNvIGN1YW5kbyBzZSBhZ3JlZ2EgcHJkOjEsIHByZDoyIHkgZGUgbnVldm8gcHJkOjEuIEVuIGVzdGUgY2FzbyBlbiBsw4PCs2dpY2EgYW50ZXJpb3IsIHNlIGhhY2UgcmVtb3ZlIGRlIGl0ZW0uIHkgbG9zIElEIHF1ZWRhYmFuIHJlcGV0aWRvcy5cclxuICAgICAgICAgICAgcHJvZHVjdG8uSWRFbmNQYWRyZSA9IHByb2R1Y3RvQ29tYm8uSUQ7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLnB1c2gocHJvZHVjdG8pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0b0NvbWJvO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXJNM1Byb2Nlc28ob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9zQXBsU3VtYVZhbG9yID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKG9NM0VOQyA9PiB7XHJcbiAgICAgICAgICAgIGxldCBkZXRDYW50aWRhZCA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGV0RXNQcmRDb21ibyA9IG9NM0VOQy5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkVTUFJPRFBST01PQ09NQk9cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBkZXRDYW50aWRhZCAmJiArZGV0Q2FudGlkYWQuVmFsb3IgPiAwICYmICEoZGV0RXNQcmRDb21ibyAmJiBkZXRFc1ByZENvbWJvLlZhbG9yID09IFwidHJ1ZVwiKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gMDtcclxuXHJcbiAgICAgICAgLy9mb3IgKGNvbnN0IG9NM0VOQyBvZiB0aGlzLm9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIWVuYy5JZEVuY1BhZHJlIHx8IGVuYy5JZEVuY1BhZHJlIDw9IDApKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvTTNFTkMgb2YgcHJvZHVjdG9zQXBsU3VtYVZhbG9yKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yTmV0byArPSArb00zRU5DLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3I7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yICs9ICtvTTNFTkMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYXJnYXIgTTNQcm9jZXNvIGVuY2FiZXphZG8gaXRlbXMsIGRlc2RlIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQRW5jSXRlbXNGcm9tUHJkR3JsSXRlbShvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkOiBUeXBlTTNQcmRHcnAsXHJcbiAgICAgICAgb2VuY2FiZXphZG9JdGVtczogQXJyYXk8TTNQRW5jSXRlbXM+LCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9QYWRyZU0zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcyA9IHVuZGVmaW5lZCwgdmFsb3JEZXNjdWVudG8gPSAwKTogTTNQRW5jSXRlbXMge1xyXG5cclxuICAgICAgICB2YXIgb00zUEVuY0l0ZW1zID0gbmV3IE0zUEVuY0l0ZW1zKCk7XHJcbiAgICAgICAgdmFyIG9NM1ByZEdlbmVyYWw6IE0zUHJkR2VuZXJhbDtcclxuICAgICAgICB2YXIgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICB2YXIgaW5mTml2ZWxlc1ByY2lvO1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgdmFyIGRUb3RhbEltcHVlc3Rvc1RvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkVW5pdGFyaW9Nb25lZGVybzogbnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZFVuaXRhcmlvUHJvbW86IG51bWJlciA9IDA7XHJcbiAgICAgICAgLy9WZXJpZmljYXIgZWwgcHJlY2lvIGEgdXNhciwgdXNhbmRvIGxhIGxvZ2ljYSBkZSBuaXZlbGVzIGRlIHByZWNpb3MuXHJcbiAgICAgICAgaW5mTml2ZWxlc1ByY2lvID0gdGhpcy5WZXJpZmljYXJQcmVjaW9CeU5pdmVsZXMocHJvZEdSUFNlbGVjdGVkLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTtcclxuICAgICAgICBpZiAodmFsb3JEZXNjdWVudG8gPiAwKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEgPSBuZXcgUHJvbW9jaW9uUHJvY2VzYWRhKCk7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLlBSRUNJTyAqIHZhbG9yRGVzY3VlbnRvIC8gMTAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gLSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IHRoaXMuQ2FsY3VsYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIsIG9NM1BJdGVtc1dFQik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1ZhbGlkYSBzaSBlbCBwcm9kdWN0byBlc3TDg8KhIHJlc3RpbmdpZG9cclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhclByb2R1Y3RvUmVzdHJpbmdpZG8ob1Byb21vY2lvblByb2Nlc2FkYSkpIHtcclxuICAgICAgICAgICAgdGhpcy5Bc2lnbmFyUHJvbW9jaW9uZXNDb21iaW5hZGFzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXMpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlbCB0b3RhbCBkZSBwdW50b3MgeSBlbCB2YWxvciB0b3RhbCBkZSBsYSBwcm9tb2Npw4PCs24gcG9yIGxhIGNxYW50aWRhZCBkZSBwcm9kdWN0b3MgZGUgbGEgbWlzbWEgcmVmZXJlbmNpYVxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Nb25lZGVybyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvOyAvL1VuaXRhcmlvIE1vbmVkZXJvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuVmFsb3JUb3RhbE1vbmVkZXJvID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5WYWxvclRvdGFsTW9uZWRlcm8sIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvL05vIHNlIHV0aWxpemEsIHNlIGRlamEgcGFyYSB1c29zIGFkZWxhbnRlXHJcblxyXG4gICAgICAgICAgICBkVW5pdGFyaW9Qcm9tbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb247IC8vUHJvbW9jaW9uIHVuaXRhcmlvXHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSArYmlnRGVjaW1hbC5tdWx0aXBseShvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsUHJvbW9jaW9uLCBvTTNQSXRlbXNXRUIuZENhbnRpZGFkKTsgLy9ObyBzZSB1dGlsaXphLCBzZSBkZWphIHBhcmEgdXNvcyBhZGVsYW50ZVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNEZXRDdXBvbmVzID0gdGhpcy5nZXRfbGlzdF9jdXBvbmVzX2Zyb21fcHJvbW8ob1Byb21vY2lvblByb2Nlc2FkYSwgK29NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9DYWxjdWxvIGRlIHByZWNpbyB0b3RhbCwgZGVzcHVlcyBkZSBwcm9tb2Npb25lc1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkob1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgICAgICAvL0NhcmdhciBwcm9kdWN0byBcclxuICAgICAgICAgICAgb00zUHJkR2VuZXJhbCA9IHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXTtcclxuXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5JZFByb2R1Y3RvID0gb00zUHJkR2VuZXJhbC5TS1U7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5Mb3RlID0gb00zUHJkR2VuZXJhbC5MT1RFO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuSUQgPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIklEXCIpICsgMTsgLy9KQUdNLCBjYW1iaW8gZGUgSUQsIGNhc28gY3VhbmRvIHNlIGFncmVnYSBwcmQ6MSwgcHJkOjIgeSBkZSBudWV2byBwcmQ6MS4gRW4gZXN0ZSBjYXNvIGVuIGzDg8KzZ2ljYSBhbnRlcmlvciwgc2UgaGFjZSByZW1vdmUgZGUgaXRlbS4geSBsb3MgSUQgcXVlZGFiYW4gcmVwZXRpZG9zLlxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuT3JkZW4gPSArdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvZW5jYWJlemFkb0l0ZW1zLCBcIk9yZGVuXCIpICsgMTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk5vbWJyZSA9IG9NM1ByZEdlbmVyYWwuTk9NQlJFMTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkRJU1BPTklCTEUgPSBvTTNQcmRHZW5lcmFsLkRJU1BPTklCTEU7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5QYXRoSW1hZ2UgPSBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbjtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLkNvZGlnb0JhcnJhcyA9IG9NM1BJdGVtc1dFQi5Db2RpZ29CYXJyYXM7XHJcbiAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHViaUltcEZpam8gPSBvTTNVYmljYWNpb24uTTNVYmlBZGljaW9uYWxlcy5maW5kKHggPT4geC5BdHJpYnV0byA9PSBcIklNUEZJSk9cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAodWJpSW1wRmlqbyAmJiB1YmlJbXBGaWpvLlZhbG9yICE9IFwiXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQgPSB1YmlJbXBGaWpvLlZhbG9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBwVG90YWxCYXNlID0gdGhpcy5DYWxjdWxhdGVQcmVjaW9CYXNlKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIHRoaXMub01hdGhURi5yb3VuZChiaWdEZWNpbWFsLm11bHRpcGx5KG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpLCAyKSk7XHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuZENhbnRpZGFkICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGRQUkVDSU9Vbml0QmFzZSA9IHBUb3RhbEJhc2UgLyBvTTNQSXRlbXNXRUIuZENhbnRpZGFkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZFBSRUNJT1VuaXRCYXNlID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZFRvdGFsSW1wdWVzdG9zVG90YWwgPSB0aGlzLkxvYWRNM1BJbXB1ZXN0b3NGcm9tUHJkR3JsKG9NM1ByZEdlbmVyYWwuQ1RCTERJTVBQUkQsIG9NM1BFbmNJdGVtcywgcFRvdGFsQmFzZSwgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCwgb1Byb21vY2lvblByb2Nlc2FkYS5QcmVjaW9Ub3RhbCk7XHJcbiAgICAgICAgICAgIC8qKiBJTklDSU8gSU5GT1JNQUNJT04gR0VORVJBTCAqL1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MnKSwgXCJGRUNIQUlOXCIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5CaXNPYnNlcXVpby50b1N0cmluZygpLCBcIkVTT0JTRVFVSU9cIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1ByZEdlbmVyYWwuU0tQMSwgXCJQUkRfRVNUSUxPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxESU1QUFJELCBcIkNUQkxESU1QUFJEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIub2JzZXJ2YWNpb24udG9TdHJpbmcoKSwgXCJPQlNFUlZBQ0lPTlwiKSk7ICAgICAgICAgICAgICAgICAgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIGlmIChvTTNQSXRlbXNXRUIuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiwgXCJQQVRISU1BR0VOXCIpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5CaXNQcm9kdWN0b1Byb21vLnRvU3RyaW5nKCksIFwiRVNQUk9EUFJPTU9cIikpOyAvLyBUUlVFLT4gU0kgRVMgVU4gUFJPRFVDVE8gUE9SIFBST01PQ0lPTiwgRkFMU0UtPiBERSBPVFJPIE1PRE9cclxuICAgICAgICAgICAgLy9EZXRhbGxlcyBkZSBmYWN0dXJhIGVsZWN0cm9uaWNhXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUocHJvZEdSUFNlbGVjdGVkLlRJUE8sIFwiVElQT19QUkRcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9NM1BJdGVtc1dFQi5VbmlkYWQsIFwiVU5JREFEXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2xhdmVQcmRTUlYsIFwiQ0xBVkVQUk9EU0VSVlwiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUEl0ZW1zV0VCLkNsYXZlUHJkVW5pZGFkLCBcIkNMQVZFVU5JREFEXCIpKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtcywgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcyk7XHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtcywgcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRBZGljaW9uYWxlcylcclxuICAgICAgICAgICAgdGhpcy5jYW1wb3NBZGljaW9uYWxlc1RvRGV0YWxsZXMob00zUEVuY0l0ZW1zLCBvTTNQSXRlbXNXRUIpXHJcbiAgICAgICAgICAgIHRoaXMuTG9hZERldGFsbGVOaXZlbGVzUHJlY2lvKGluZk5pdmVsZXNQcmNpbywgb00zUEVuY0l0ZW1zKTtcclxuICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGV0YWxsZShvUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpOyAvLyBMaXN0YSBkZSBQcm9tb2Npb25lcyBcclxuICAgICAgICAgICAgLyoqRklOIElORk9STUFDSU9OIEdFTkVSQUwgKi9cclxuXHJcbiAgICAgICAgICAgIC8vKiogSU5JQ0lPIFZBTE9SRVMgVU5JVEFSSU9TICovXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFBSRUNJT1VuaXRCYXNlLnRvU3RyaW5nKCksIFwiUFJFQ0lPVU5JVEJBU0VcIikpOyAvL1ByZWNpbyBTaW4gaW1wdWVzdG9zXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZFRvdGFsSW1wdWVzdG9zVG90YWwudG9TdHJpbmcoKSwgXCJUT1RBTElNUFVFU1RPU1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoKHRoaXMub01hdGhURi5yb3VuZCh0aGlzLkdldFVuaXRhcmlvQnlUb3RhbChvTTNQSXRlbXNXRUIuZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSgoK29NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLlBSRUNJTyAtICtkVG90YWxJbXB1ZXN0b3NVbml0YXJpbykudG9TdHJpbmcoKSwgXCJQVU5JVFNJTklNUFVFU1RPXCIpKTsvL1NpbiBkZXNjdWVudG8gaW5jbHVpZG8gWSBzaW4gSW1wdWVzdG9zIC8vLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKCgrZFBSRUNJT1VuaXRCYXNlICsgK2RVbml0YXJpb1Byb21vKS50b1N0cmluZygpLCBcIlBVTklUU0lOSU1QVUVTVE9cIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyBZIHNpbiBJbXB1ZXN0b3MgLy8tLS0tLS0gTnVuY2EgQ2FtYmlhIC8vRlMgMjAxOTA3MjUgQ29ycmVjY2lvbiBlbiBsYSBmb21yYSBkZSBjYWxjdWxhcmxvXHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuUFJFQ0lPLnRvU3RyaW5nKCksIFwiUFVOSVRcIikpOy8vU2luIGRlc2N1ZW50byBpbmNsdWlkbyAgLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWwudG9TdHJpbmcoKSwgXCJQVU5JVE5FVE9cIikpOy8vQ29uIGRlc2N1ZW50byBpbmNsdWlkby0tLS0tLSBOdW5jYSBDYW1iaWFcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkVW5pdGFyaW9Nb25lZGVyby50b1N0cmluZygpLCBcIlVOSVRGSURFTFwiKSk7Ly9Vbml0YXJpbyBmaWRlbGl6YWNpb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRVbml0YXJpb1Byb21vLnRvU3RyaW5nKCksIFwiVlVOSVRQUk9NT1wiKSk7Ly9Vbml0YXJpbyBQcm9tb2Npb24gLS0tLS0tIE51bmNhIENhbWJpYVxyXG4gICAgICAgICAgICBpZiAodGhpcy5nc0lka2F0aW9zID09IFwiQ1ROXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBsaXN0YVNSID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNMaXN0YVByZWNpby5maW5kKHggPT4geC5JRExJU1RBID09IFwiMlwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChsaXN0YVNSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM0xpc3RhUHJlY2lvLmZpbmQoeCA9PiB4LklETElTVEEgPT0gXCIyXCIpLlBSRUNJTy50b1N0cmluZygpLCBcIlBSRUNJT1NSXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyoqIEZJTiBWQUxPUkVTIFVOSVRBUklPUyAqL1xyXG5cclxuICAgICAgICAgICAgLy8gKioqIEluZm9ybWFjaW9uIGRlIGFjY2lvbmVzIGVuIGVsIGNsaWVudGUgKioqXHJcbiAgICAgICAgICAgIGlmIChwcm9kR1JQU2VsZWN0ZWQuZW5jb250cmFkb0xvY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiTE9DQUxcIiwgXCJDT05TVUxUT0VOXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKFwiU0VSVklET1JcIiwgXCJDT05TVUxUT0VOXCIpKTsvL1VuaXRhcmlvIFByb21vY2lvbiAtLS0tLS0gTnVuY2EgQ2FtYmlhXHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICB0aGlzLlZhbG9yZXNDYWxjdWxhZG9zUHJvY2VzbyhvTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQpO1xyXG5cclxuICAgICAgICAgICAgLy9pZiAoIW9QYWRyZU0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLlZhbG9yID0gKCtvTTNQcm9jZXNvcy5WYWxvcikgKyAoK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJTVUJUT1RBTFwiKS5WYWxvcikgLy8gKCtvTTNQSXRlbXNXRUIuZFByZWNpb1RvdGFsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuVmFsb3JOZXRvID0gKCtvTTNQcm9jZXNvcy5WYWxvck5ldG8pICsgKCtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJFQ0lPVE9UQUxcIikuVmFsb3IpO1xyXG4gICAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAgIC8vVmVyaWZpY2FyIG9ic2VxdWlvcyBkZWwgcHJvZHVjdG8gcXVlIHNlIGluZ3Jlc28gYWwgY2Fycml0byBkZSBjb21wcmFzXHJcbiAgICAgICAgICAgIHRoaXMuVmVyaWZpY2FyT2JzZXF1aW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMudHVybk9uUHJvbW9zKG9Qcm9tb2Npb25Qcm9jZXNhZGEpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXNbXCJNZW5zYWplRXJyb3JcIl0gPSBcIlByb2R1Y3RvIFJlc3RyaW5naWRvXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb00zUEVuY0l0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0cnVlIHNpIGVzdGUgcHJvZHVjdG8gc2UgZW5jdWVudHJhIHJlc3RyaW5naWRvXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbGlkYXJQcm9kdWN0b1Jlc3RyaW5naWRvKG9Qcm9tb2Npb25Qcm9jZXNhZGE6IFByb21vY2lvblByb2Nlc2FkYSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcykge1xyXG4gICAgICAgICAgICBsZXQgcHJvbW9SZXN0cmluZ2lkbyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbmQoeCA9PiB4LlRpcG8gPT0gXCJSRVNUUklDQ0lPTlwiKTtcclxuICAgICAgICAgICAgaWYgKHByb21vUmVzdHJpbmdpZG8pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBFeGNsdXllIHRvZG9zIGxvcyBpbXB1ZXN0b3MgZGVqYW5kbyBzb2xvIGVsIEZJSk8gc2kgZXMgZGUgbGEgdWJpY2FjaW9uIGRhZGEgXHJcbiAgICAgKi9cclxuICAgICBwdWJsaWMgR2V0TWF4QXRyaWJ1dG9Gcm9tTGlzdGEobGlzdGEsIGF0cmlidXRvKSB7XHJcbiAgICAgICAgaWYgKGxpc3RhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGxpc3RJRCA9IGxpc3RhLm1hcCh4ID0+IHhbYXRyaWJ1dG9dKTtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIGxpc3RJRCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZXMgQ2FsY3VsYWRvcyBwb3IgcHJvY2Vzby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gZENhbnRpZGFkIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsb3Jlc0NhbGN1bGFkb3NQcm9jZXNvKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGRDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgLyoqIElOSUNJTyBWQUxPUkVTIERJTkFNSUNPUyAqL1xyXG4gICAgICAgIC8vIHZhciBkVG90YWxJbXB1ZXN0b3MgPSAoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlRPVEFMSU1QVU5JVFwiKSk7XHJcbiAgICAgICAgLy8gdmFyIGRQcmVjaW9Ub3RhbFNpbkR0byA9IHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpXHJcbiAgICAgICAgLy8gdmFyIGRTdWJUb3RhbCA9IE1hdGgucm91bmQoKCtkUHJlY2lvVG90YWxTaW5EdG8gLSArZFRvdGFsSW1wdWVzdG9zKSAqIDEwMCkgLyAxMDA7XHJcblxyXG4gICAgICAgIGxldCBzdWJUb3RhbCA9IDA7XHJcbiAgICAgICAgbGV0IHByZWNpb1RvdGFsU2luRHRvID0gMDtcclxuICAgICAgICBsZXQgdG90YWxJbXB1ZXN0b3NcclxuICAgICAgICAvL0FncmVnYXIgSW1wdWVzdG9zXHJcbiAgICAgICAgdG90YWxJbXB1ZXN0b3MgPSB0aGlzLmFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXMsIGRDYW50aWRhZCk7XHJcblxyXG4gICAgICAgIC8vRlMgMjAxOTA3MjUgQXJyZWdsbyBlbiBlbCBjYWxjdWxvIGRlIHRvdGFsZXMgZW4gY2FzbyBkZSBoYWJlciBpbXB1ZXN0b3NcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vU3VidG90YWwgU3VtYXMgZGUgbGFzIGJhc2VzXHJcbiAgICAgICAgICAgIHN1YlRvdGFsID0gdGhpcy5vTWF0aFRGLnJvdW5kKCgodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJQUkVDSU9VTklUQkFTRVwiKSwgMikpICsgKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpKSksIDIpO1xyXG4gICAgICAgICAgICB0b3RhbEltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEZyb21JbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBcIlZhbG9yXCIpO1xyXG4gICAgICAgICAgICBwcmVjaW9Ub3RhbFNpbkR0byA9IHN1YlRvdGFsICsgdG90YWxJbXB1ZXN0b3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL1NlIGFzdW1lIHF1ZSBubyBoYXkgaW1wdWVzdG9zIGVudG9uY2VzIGVsIHN1YlRvdGFsIGVzIGlndWFsIGFsIHByZWNpb1RvdGFsU2luRHRvXHJcbiAgICAgICAgICAgIHByZWNpb1RvdGFsU2luRHRvID0gdGhpcy5vTWF0aFRGLnJvdW5kKHRoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBVTklUXCIpLCAyKTtcclxuICAgICAgICAgICAgc3ViVG90YWwgPSBwcmVjaW9Ub3RhbFNpbkR0bztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgZENhbnRpZGFkLnRvU3RyaW5nKCksIFwiQ0FOVElEQURcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCh0b3RhbEltcHVlc3RvcywgMikpLnRvU3RyaW5nKCksIFwiVE9UQUxJTVBVRVNUT1NcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRVbml0YXJpb0J5VG90YWwoZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVE9UQUxJTVBVRVNUT1NcIiksIDIpKS50b1N0cmluZygpLCBcIlRPVEFMSU1QVU5JVFwiKTtcclxuXHJcbiAgICAgICAgLy9MYSBmaWRlbGl6YWNpb24gZXMgdW4gcG9yY2FudGFqZSBwb3IgZW5kZSBubyBkZWJlIG11bHRpcGxpY2Fyc2UgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiVU5JVEZJREVMXCIpLnRvU3RyaW5nKCksIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJVTklURklERUxcIikuVmFsb3IsIFwiRklERUxJWkFDSU9OXCIpO1xyXG4gICAgICAgIC8vdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgKHRoaXMub01hdGhURi5yb3VuZCgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTFwiKTtcclxuICAgICAgICAvL3RoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICgrdGhpcy5HZXRUb3RhbEJ5VW5pdGFyaW8oZENhbnRpZGFkLCBvTTNQRW5jSXRlbXMsIFwiUFVOSVRORVRPXCIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMUkVBTFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCBwcmVjaW9Ub3RhbFNpbkR0by50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMU0lORFRPXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsIHN1YlRvdGFsLnRvU3RyaW5nKCksIFwiU1VCVE9UQUxcIik7XHJcbiAgICAgICAgdGhpcy5JbnNVcGREZXRJdGVtKG9NM1BFbmNJdGVtcywgbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBcIkZVVFwiKTtcclxuICAgICAgICB0aGlzLkluc1VwZERldEl0ZW0ob00zUEVuY0l0ZW1zLCAodGhpcy5vTWF0aFRGLnJvdW5kKCt0aGlzLkdldFRvdGFsQnlVbml0YXJpbyhkQ2FudGlkYWQsIG9NM1BFbmNJdGVtcywgXCJWVU5JVFBST01PXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoK3RoaXMuR2V0VG90YWxCeVVuaXRhcmlvKGRDYW50aWRhZCwgb00zUEVuY0l0ZW1zLCBcIlBSRUNJT1VOSVRCQVNFXCIpLCAyKSkudG9TdHJpbmcoKSwgXCJQUkVDSU9UT1RBTEJBU0VcIik7IC8vUHJlY2lvIFNpbiBpbXB1ZXN0b3MgICAgICAgIFxyXG4gICAgICAgIHRoaXMuSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXMsICh0aGlzLm9NYXRoVEYucm91bmQoKHN1YlRvdGFsICsgK29NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTElNUFVFU1RPU1wiKS5WYWxvciAtICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKS5WYWxvciksIDIpKS50b1N0cmluZygpLCBcIlBSRUNJT1RPVEFMXCIpO1xyXG5cclxuICAgICAgICAvKiogRklOIFZBTE9SRVMgRElOQU1JQ09TICovXHJcblxyXG4gICAgICAgIGlmIChvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zLmxlbmd0aCA+IDAgJiYgZENhbnRpZGFkID09IDApIHsvL1NpIGxhIGNhbnRpZGFkIGVzIDAgc2lnbmlmaWNhIHF1ZSBzZSBlc3TDg8KhIGJvcnJhbmRvIGVsIGl0ZW0gbyBlcyB1biBvYnNlcXVpbywgcG9yIGxvIHF1ZSBubyB0aWVuZSBzZW50aWRvIHF1ZSB0ZW5nYSBNM1BJbXB1ZXN0b1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsYSBzdW1hdG9yaWEgZGUgbG9zIHZhbG9yZXMgZGUgdW4gYXRyaWJ1dG8gZGFkbyBkZWwgYXJyZWdsbyBkZSBpbXB1ZXN0b3NcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgXHJcbiAgICAgKiBAcGFyYW0gYXRyaWJ1dG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYWxvclRvdGFsRnJvbUltcHVlc3RvcyhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBhdHJpYnV0bzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc3VtYXRvcmlhID0gMDtcclxuICAgICAgICBmb3IgKGxldCBfaSA9IDA7IF9pIDwgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW1wdWVzdG8gPSBvTTNQRW5jSXRlbXMuTTNQSW1wdWVzdG9zW19pXTtcclxuICAgICAgICAgICAgc3VtYXRvcmlhID0gc3VtYXRvcmlhICsgKCtpbXB1ZXN0b1thdHJpYnV0b10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vTWF0aFRGLnJvdW5kKHN1bWF0b3JpYSwyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFncmVnYXJJbXB1ZXN0byhvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGRldF9jdGJsZF9pbXBfcHJkID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNUQkxESU1QUFJEXCIpO1xyXG4gICAgICAgIGxldCBkZXRfcHJlY2lvX3VuaXRfYmFzZSA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJQUkVDSU9VTklUQkFTRVwiKTtcclxuICAgICAgICBsZXQgdmFsb3JUb3RhbEltcHVlc3RvczogbnVtYmVyID0gMDtcclxuICAgICAgICBpZiAoZGV0X2N0YmxkX2ltcF9wcmQgJiYgZGV0X3ByZWNpb191bml0X2Jhc2UpIHtcclxuICAgICAgICAgICAgdmFsb3JUb3RhbEltcHVlc3RvcyA9IHRoaXMuTG9hZE0zUEltcHVlc3Rvc0Zyb21QcmRHcmwoZGV0X2N0YmxkX2ltcF9wcmQuVmFsb3IsIG9NM1BFbmNJdGVtcywgK2JpZ0RlY2ltYWwubXVsdGlwbHkoZGV0X3ByZWNpb191bml0X2Jhc2UuVmFsb3IsIGNhbnRpZGFkKSwgY2FudGlkYWQsICtvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiUFVOSVRORVRPXCIpLlZhbG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub01hdGhURi5yb3VuZCh2YWxvclRvdGFsSW1wdWVzdG9zLDIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSW5zVXBkRGV0SXRlbShvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCB2YWxvcjogc3RyaW5nLCBzQ29uY2VwdG86IHN0cmluZykge1xyXG4gICAgICAgIHZhciBvRGV0OiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgb0RldCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gc0NvbmNlcHRvKTtcclxuICAgICAgICBpZiAob0RldCkge1xyXG4gICAgICAgICAgICAvLyBFeGlzdGUgQWN0dWFsaXphXHJcbiAgICAgICAgICAgIG9EZXQuVmFsb3IgPSB2YWxvcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL05vIGV4aXN0ZSBhZ3JlZ2FcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZSh2YWxvci50b1N0cmluZygpLCBzQ29uY2VwdG8pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHRvdGFsXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgTnVldmEgQ2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NVbml0YXJpbyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRUb3RhbEJ5VW5pdGFyaW8oY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1VuaXRhcmlvOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdW5pdGFyaW8gPSBvTTNQRW5jSXRlbXMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IERlc2NVbml0YXJpbykuVmFsb3I7XHJcbiAgICAgICAgICAgIHJldHVybiArYmlnRGVjaW1hbC5tdWx0aXBseSh1bml0YXJpbywgY2FudGlkYWQpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHZhbG9yIHVuaXRhcmlvXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIFxyXG4gICAgICogQHBhcmFtIERlc2NUb3RhbCBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRVbml0YXJpb0J5VG90YWwoY2FudGlkYWQ6IG51bWJlciwgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgRGVzY1RvdGFsOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoK2NhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IG9NM1BFbmNJdGVtcy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gRGVzY1RvdGFsKS5WYWxvcjtcclxuICAgICAgICAgICAgcmV0dXJuICt0b3RhbCAvICtjYW50aWRhZDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRpY2lvbmFyIGRldGFsbGVzIHJlbGFjaW9uYWRvcyBjb24gbGEgaW5mb3JtYWNpb24gZGUgc3cgZXh0ZXJuby5cclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgT2JqZXRvIGRvbmRlIHNlIGd1YXJkYXLDg8KhIGxvcyBudWV2b3MgYXRyaWJ1dG9zLlxyXG4gICAgICogQHBhcmFtIG9BZGljaW9uYWxlcyBEZXNkZSBkb25kZSBzZSBzYWNhcsODwqEgbGEgaW5mb3JtYWNpw4PCs24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRJdGVtc0ludGVyZmF6KG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0FkaWNpb25hbGVzRmlsdGVyOiBBcnJheTxNM1ByZEFkaWNpb25hbGVzPjtcclxuICAgICAgICAgICAgb0FkaWNpb25hbGVzRmlsdGVyID0gb0FkaWNpb25hbGVzLmZpbHRlcihhID0+IGEuQVRSSUJVVE8uc3RhcnRzV2l0aChcIkNTSUFfXCIpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvQWRpY2lvbmFsZXNGaWx0ZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob0FkaWNpb25hbGVzRmlsdGVyW2ldLlZBTE9SLCBvQWRpY2lvbmFsZXNGaWx0ZXJbaV0uQVRSSUJVVE8pKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZXMgXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBndWFyZGFyw4PCoSBsb3MgbnVldm9zIGF0cmlidXRvcy5cclxuICAgICAqIEBwYXJhbSBvQWRpY2lvbmFsZXMgRGVzZGUgZG9uZGUgc2Ugc2FjYXLDg8KhIGxhIGluZm9ybWFjacODwrNuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9BZGljaW9uYWxlczogQXJyYXk8TTNQcmRBZGljaW9uYWxlcz4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9BZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQURDX1wiICsgb0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2FtcG9zQWRpY2lvbmFsZXNUb0RldGFsbGVzKG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9NM1BJdGVtc1dFQi5DYW1wb3NBZGljaW9uYWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQSXRlbXNXRUIuQ2FtcG9zQWRpY2lvbmFsZXNbaV0uVkFMT1IsIFwiQ0FNQURDX1wiICsgb00zUEl0ZW1zV0VCLkNhbXBvc0FkaWNpb25hbGVzW2ldLkFUUklCVVRPKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhciBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcyBOb21icmUsIElELiBhIGRldGFsbGUgZGVsIGVuY2FiZXphZG8gZGUgcHJvZHVjdG8gYWdyZWdhZG9cclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIEluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIHByb2Nlc2FkYXNcclxuICAgICAqIEBwYXJhbSBvTTNQRW5jSXRlbXMgRW5jYWJlemFkbyBkZSBpdGVtc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhckluZm9Qcm9tb2Npb25lc1Byb2Nlc2FkYXMob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQ6IG51bWJlciwgYXBsaWNhZGFzID0gdHJ1ZSkge1xyXG4gICAgICAgIHZhciBzTm9tYnJlczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc0lkczogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgc1ZhbG9yZXM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMgJiYgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXBsaWNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcih4ID0+ICF4LkFwbGljYWRhKS5maWx0ZXIoeCA9PiB4LlByb21vY2lvbkNvbWJpbmFkYSA9PSBudWxsKS5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzTm9tYnJlcyA9IHNOb21icmVzICsgcHJvbW8uTm9tYnJlICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgc0lkcyA9IHNJZHMgKyBwcm9tby5JRFByb21vY2lvbiArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIHNWYWxvcmVzID0gc1ZhbG9yZXMgKyBiaWdEZWNpbWFsLm11bHRpcGx5KHByb21vLlZhbG9yLCBpQ2FudGlkYWQpICsgXCIsXCI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhID0geyBcIk5PTUJSRVNcIjogc05vbWJyZXMsIFwiSURcIjogc0lkcywgXCJWQUxPUkVTXCI6IHNWYWxvcmVzIH1cclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBkZSBwcm9tb2Npb25lc1xyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBzTm9tYnJlcyBcclxuICAgICAqIEBwYXJhbSBzSWRzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURldGFsbGUob1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQpXHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLk5PTUJSRVMsIFwiTk9NQl9QUk9NT0NcIikpO1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGRhdGEuSUQsIFwiSURfUFJPTU9DXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLlZBTE9SRVMsIFwiVkFMX1BST01PQ1wiKSk7XHJcblxyXG4gICAgICAgICAgICAvL0Fob3JhIHNlIGFncmVnYSB1bmEgZGluYW1pY2EgcG9yIGF0cmlidXRvIGRlIGxhIHByb21vIHBhcmEgZmFjaWxpdGFyIGxhIHJldG9tYSBkZSBlc3RhIGluZm9ybWFjacODwrNuXHJcbiAgICAgICAgICAgIGxldCBsaXN0Tm9tYnJlID0gZGF0YS5OT01CUkVTLnJlcGxhY2UoLy4kLywgXCJcIikuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICBsZXQgbGlzdElkID0gZGF0YS5JRC5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgbGV0IGxpc3RWYWxvciA9IGRhdGEuVkFMT1JFUy5yZXBsYWNlKC8uJC8sIFwiXCIpLnNwbGl0KFwiLFwiKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IF9pID0gMDsgX2kgPCBsaXN0SWQubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGxpc3ROb21icmVbX2ldLCBcIk5PTUJfUFJPTU9DX1wiICsgX2kpKTtcclxuICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUobGlzdElkW19pXSwgXCJJRF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShsaXN0VmFsb3JbX2ldLCBcIlZBTF9QUk9NT0NfXCIgKyBfaSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhID0gdGhpcy5HZW5lcmFySW5mb1Byb21vY2lvbmVzUHJvY2VzYWRhcyhvUHJvbW9jaW9uUHJvY2VzYWRhLCBpQ2FudGlkYWQsIGZhbHNlKVxyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5OT01CUkVTLCBcIk5PTUJfUFJPTU9DX05PUFJPXCIpKTtcclxuICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShkYXRhLklELCBcIklEX1BST01PQ19OT1BST1wiKSk7XHJcbiAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoZGF0YS5WQUxPUkVTLCBcIlZBTF9QUk9NT0NfTk9QUk9cIikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXJnYXIgYSBkZXRhbGxlIGluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gaW5mTml2ZWxlc1ByY2lvIEluZm9ybWFjaW9uIGRlIG5pdmVsZXMgZGUgcHJlY2lvXHJcbiAgICAgKiBAcGFyYW0gb00zUEVuY0l0ZW1zIE9iamV0byBkb25kZSBzZSBjYXJnYXLDg8KhIGxhIGluZm9ybWFjaW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBMb2FkRGV0YWxsZU5pdmVsZXNQcmVjaW8oaW5mTml2ZWxlc1ByY2lvLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKGluZk5pdmVsZXNQcmNpbyAmJiBpbmZOaXZlbGVzUHJjaW8uTklWRUwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQRW5jSXRlbXMuTTNERVQucHVzaCh0aGlzLkxvYWRNM1BEZXRhbGxlKGluZk5pdmVsZXNQcmNpby5OSVZFTCwgXCJOSVZFTFBSRUNJT1wiKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpY2FyIGNvbiBxdWUgbml2ZWwgZGUgcHJlY2lvIHZhIGEgdHJhYmFqYXJcclxuICAgICAqIEBwYXJhbSBwcm9kR1JQU2VsZWN0ZWQgRWwgcHJvZHVjdG8gaW5ncmVzYWRvXHJcbiAgICAgKiBAcGFyYW0gaUNhbnRpZGFkIExhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyBxdWUgdmEgYSBpbmdyZXNhclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzKHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLCBpQ2FudGlkYWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQcmVzZW50YWNpb25lczogTTNQcmVzZW50YWNpb25lcztcclxuICAgICAgICAgICAgdmFyIGpSZXNwTml2ZWxlcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAocHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmXHJcbiAgICAgICAgICAgICAgICBwcm9kR1JQU2VsZWN0ZWQuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzLmZpbmQoeCA9PiBpQ2FudGlkYWQgPj0geC5UT1BFKTtcclxuICAgICAgICAgICAgICAgIGlmIChvTTNQcmVzZW50YWNpb25lcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2RHUlBTZWxlY3RlZC5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gb00zUHJlc2VudGFjaW9uZXMuVkFMT1I7XHJcbiAgICAgICAgICAgICAgICAgICAgalJlc3BOaXZlbGVzID0geyBcIlBSRUNJT1wiOiBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiwgXCJOSVZFTFwiOiBvTTNQcmVzZW50YWNpb25lcy5OSVZFTFBSUyB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBqUmVzcE5pdmVsZXM7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmVyaWZpY2FyUHJlY2lvQnlOaXZlbGVzR2VuZXJhbChvTTNQcmRHZW5lcmFsOiBNM1ByZEdlbmVyYWwsIGlDYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG9NM1ByZXNlbnRhY2lvbmVzOiBNM1ByZXNlbnRhY2lvbmVzO1xyXG4gICAgICAgICAgICB2YXIgalJlc3BOaXZlbGVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5NM1ByZXNlbnRhY2lvbmVzICYmIG9NM1ByZEdlbmVyYWwuTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIG9NM1ByZXNlbnRhY2lvbmVzID0gb00zUHJkR2VuZXJhbC5Mb00zUHJkTGlzdGEuTTNQcmVzZW50YWNpb25lcy5maW5kKHggPT4gaUNhbnRpZGFkID49IHguVE9QRSk7XHJcbiAgICAgICAgICAgICAgICBpZiAob00zUHJlc2VudGFjaW9uZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQcmRHZW5lcmFsLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvTTNQcmVzZW50YWNpb25lcy5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBqUmVzcE5pdmVsZXMgPSB7IFwiUFJFQ0lPXCI6IG9NM1ByZXNlbnRhY2lvbmVzLlZBTE9SLCBcIk5JVkVMXCI6IG9NM1ByZXNlbnRhY2lvbmVzLk5JVkVMUFJTIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGpSZXNwTml2ZWxlcztcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBsb3MgY3Vwb25lcyBnZW5lcmFkb3MgZGUgbGEgbGlzdGEgZGUgcHJvbW9wcm9jZXNhZGFzXHJcbiAgICAgKiBAcGFyYW0gb1Byb21vY2lvblByb2Nlc2FkYSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldF9saXN0X2N1cG9uZXNfZnJvbV9wcm9tbyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIpOiBBcnJheTxNM1BEZXRhbGxlQ3Vwb24+IHtcclxuICAgICAgICB2YXIgbGlzdF9jdXBvbmVzID0gQXJyYXk8TTNQRGV0YWxsZUN1cG9uPigpO1xyXG5cclxuICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHByb21vX2Fzb2NpYWRhID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXNbX2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9tb19hc29jaWFkYS5JZEN1cG9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cG9uID0gbmV3IE0zUERldGFsbGVDdXBvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLklkQ3Vwb24gPSBwcm9tb19hc29jaWFkYS5JZEN1cG9uO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cG9uLkNhbnRpZGFkID0gY2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdF9jdXBvbmVzLnB1c2goY3Vwb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbGlzdF9jdXBvbmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQXNpZ25hciBhIHByb21vY2lvbmVzIGNvbWJpYW5hcyBkZXNkZSBsbyBxdWUgc2UgZW5jb250csODwrMgYWwgZW5jYWJlemFkbyBpdGVtLCBkZWwgcHJvZHVjdG8gc2VsZWNjaW9uYWRvXHJcbiAgICBwdWJsaWMgQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEgIT0gbnVsbCAmJiBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZvckVhY2gocHJvbW9Bc28gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9TZSBhZ3JlZ2EgcHJvbW9jaW9uIGNvbWJpbmFkYSBhIGVuY2FiZXphZG8gZGUgaXRlbXMuXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcy5wdXNoKHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8vQWdyZWdhciBwcm9tb2Npb25lcyBjb21iaW5hZGFzXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BEZXRhbGxlSXRlbXM6IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zID0gb00zUEVuY0l0ZW1zLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiUFJPTU9DT01CSVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQRGV0YWxsZUl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShvTTNQRW5jSXRlbXMuUHJvbW9Db21iaW5hZGFzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUoSlNPTi5zdHJpbmdpZnkob00zUEVuY0l0ZW1zLlByb21vQ29tYmluYWRhcyksIFwiUFJPTU9DT01CSVwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQXNpZ25hclByb21vY2lvbmVzQ29tYmluYWRhc0FNM1Byb2Nlc28ob00zUHJvY2Vzb3MsIHByb21vQXNvLlByb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzaWduYXIgcHJvbW9jaW9uZXMgY29tYmlhbmRhcyBhIE0zIFByb2Nlc28sIGVzdGUsIHZhbGlkYSBxdWUgbm8gZXhpc3RhIHVuIHByb21vY2lvbiBhbnRlcmlvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEFzaWduYXJQcm9tb2Npb25lc0NvbWJpbmFkYXNBTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvUHJvbW9jaW9uQ29tYmluYWRhOiBQcm9tb2Npb25Db21iaW5hZGEpIHtcclxuICAgICAgICBpZiAoIW9NM1Byb2Nlc29zLlByb21vc0NvbWJpbmFkYXMpIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuUHJvbW9zQ29tYmluYWRhcyA9IG5ldyBBcnJheTxQcm9tb2Npb25Db21iaW5hZGE+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLmZpbmQoeCA9PiB4LklkUHJvbW9jaW9uQ29tYmluYWRhID09IG9Qcm9tb2Npb25Db21iaW5hZGEuSWRQcm9tb2Npb25Db21iaW5hZGEpKSB7XHJcbiAgICAgICAgICAgIC8vLy8vLy8gZXhpc3RlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8vLy8vIE5vIEV4aXN0ZVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzLnB1c2gob1Byb21vY2lvbkNvbWJpbmFkYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvTTNQcm9jZXNvcy5Qcm9tb3NDb21iaW5hZGFzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkRGluYW1pY2FQcm9jZXNvQ29tYmluYWRhcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkaWNpb25hciBhIGRpbmFtaWNhcyBwcm9jZXNvIGRlIGNvbWJpbmFkYXNcclxuICAgICAqIEBwYXJhbSBpb00zUHJvY2VzbyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERpbmFtaWNhUHJvY2Vzb0NvbWJpbmFkYXMoaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb00zUERpbmFtaWNhc0ZpbmRlZDogTTNQRGluYW1pY2FzO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXNGaW5kZWQgPSBpb00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLmZpbmQoeCA9PiB4Lk5vbWJyZSA9PSBcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBpZiAob00zUERpbmFtaWNhc0ZpbmRlZCkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PFByb21vY2lvbkNvbWJpbmFkYT4gPSBKU09OLnBhcnNlKG9NM1BEaW5hbWljYXNGaW5kZWQuVmFsb3IpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyclByb21vLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb1Byb21vQ29tYmk6IFByb21vY2lvbkNvbWJpbmFkYSA9IGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMuZmluZCh4ID0+IHguSWRQcm9tb2Npb25Db21iaW5hZGEgPT0gYXJyUHJvbW9baV0uSWRQcm9tb2Npb25Db21iaW5hZGEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFvUHJvbW9Db21iaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMucHVzaChhcnJQcm9tb1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhc0ZpbmRlZC5WYWxvciA9IEpTT04uc3RyaW5naWZ5KGlvTTNQcm9jZXNvLlByb21vc0NvbWJpbmFkYXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICBvTTNQRGluYW1pY2FzLk5vbWJyZSA9IFwiQ09NQklOQURBXCI7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSBKU09OLnN0cmluZ2lmeShpb00zUHJvY2Vzby5Qcm9tb3NDb21iaW5hZGFzKTtcclxuXHJcbiAgICAgICAgICAgIGlvTTNQcm9jZXNvLmxNM1BEaW5hbWljYXMucHVzaChvTTNQRGluYW1pY2FzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsbyBkZSBwcm9tb2Npb25lc1xyXG4gICAgcHVibGljIENhbGN1bGFyUHJvbW9jaW9uZXMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIHByb2RHUlBTZWxlY3RlZDogVHlwZU0zUHJkR3JwLFxyXG4gICAgICAgIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPiwgb0RhdGFVc2VyOiBhbnksIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIpOiBQcm9tb2Npb25Qcm9jZXNhZGEge1xyXG4gICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgIHZhciBsVGlwb3MgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiRElSRUNUQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIkNPTUJJTkFEQVwiKTtcclxuICAgICAgICBsVGlwb3MucHVzaChcIk1PTkVERVJPXCIpO1xyXG4gICAgICAgIGxUaXBvcy5wdXNoKFwiTUFOVUFMXCIpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChvTTNFTkNQUk9NTyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBvTTNQSXRlbXNXRUIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgcHJvZEdSUFNlbGVjdGVkLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBsVGlwb3MpO1xyXG4gICAgICAgICAgICAgICAgb1Byb21vY2lvblByb2Nlc2FkYSA9IG9wcm9tb2Npb25lc1NlcnZpY2UuUHJvY2VzYXJQcm9tb2Npb24oYXJyUHJvbW8sIHByb2RHUlBTZWxlY3RlZCwgb00zRU5DUFJPTU8sIHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9Qcm9tb2Npb25Qcm9jZXNhZGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGhheSBpbmZvcm1hY2lvbiBkZSBwcm9tb2Npb25lcycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsID0gcHJvZEdSUFNlbGVjdGVkLkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU87XHJcbiAgICAgICAgICAgIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24gPSAwO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJvbW9jaW9uUHJvY2VzYWRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1ZlcmlmaWNhciBvYnNlcXVpb3MgeSBhZ3JlZ2FybG9zLlxyXG4gICAgcHVibGljIFZlcmlmaWNhck9ic2VxdWlvcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEsIGNhbnRpZGFkOiBudW1iZXIsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIGlmIChvUHJvbW9jaW9uUHJvY2VzYWRhLkxpc3RQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyA9IG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzLmZpbHRlcihwcm9tbyA9PiBwcm9tby5MaXN0T2JzU0tVICE9IG51bGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAhPSBudWxsICYmIGFyclByb21vY2lvbmVzQXNvY2lhZGFzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5mb3JFYWNoKHByb21vID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9PSAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb21vLkxpc3RPYnNTS1UubGVuZ3RoKSBwcm9tby5MaXN0T2JzU0tVID0gW3Byb21vLkxpc3RPYnNTS1VdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhU2lUaWVuZU90cmFQcm9tbyhwcm9tbywgb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VxdWlvT1Byb21vID0gcHJvbW8uSURQcm9tb2Npb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcm1hckxpc3RhT2JzZXF1aW9zU0tVKHByb21vLCBvTTNQRW5jSXRlbXMsIGNhbnRpZGFkKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHR1cm5PblByb21vcyhvUHJvbW9jaW9uUHJvY2VzYWRhOiBQcm9tb2Npb25Qcm9jZXNhZGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXM6IEFycmF5PFByb21vY2lvbmVzQXNvY2lhZGFzPjtcclxuICAgICAgICAgICAgaWYgKG9Qcm9tb2Npb25Qcm9jZXNhZGEuTGlzdFByb21vY2lvbmVzQXNvY2lhZGFzICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGFyclByb21vY2lvbmVzQXNvY2lhZGFzID0gb1Byb21vY2lvblByb2Nlc2FkYS5MaXN0UHJvbW9jaW9uZXNBc29jaWFkYXMuZmlsdGVyKHByb21vID0+IHByb21vLmxJZEFjdGl2YVByb21vICYmIHByb21vLmxJZEFjdGl2YVByb21vLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcyAmJiBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyUHJvbW9jaW9uZXNBc29jaWFkYXMuZm9yRWFjaChwcm9tbyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubElkQWN0aXZhUHJvbW8gPSB0aGlzLmxJZEFjdGl2YVByb21vLmNvbmNhdChwcm9tby5sSWRBY3RpdmFQcm9tbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEdXBsaWNhdGVzKHRoaXMubElkQWN0aXZhUHJvbW8pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEdXBsaWNhdGVzKGFycjogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIHZhciB1bmlxdWUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodW5pcXVlLmluZGV4T2YoYXJyW2ldKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHVuaXF1ZS5wdXNoKGFycltpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc1NLVShwcm9tbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIG9NM1BFbmNJdGVtczogTTNQRW5jSXRlbXMsIGNhbnRpZGFkOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgY2FudGlkYWRSZWFsID0gTWF0aC5mbG9vcihjYW50aWRhZCAvIHByb21vLkNhbnRpZGFkT2JzZXEpO1xyXG4gICAgICAgIGlmIChwcm9tby5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vLCBvTTNQRW5jSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VxdWlvc0V4YyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zQ2FudGlkYWQgPSBjYW50aWRhZFJlYWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW8ocHJvbW8sIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHByb21vLkxpc3RPYnNTS1UuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZFJlYWwgKiArZWxlbWVudC5DYW50aWRhZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gcHJvbW8uTGlzdE9ic1NLVTtcclxuICAgIH1cclxuXHJcbiAgICBhc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvKHByb21vOiBQcm9tb2Npb25lc0Fzb2NpYWRhcywgb00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcykge1xyXG4gICAgICAgIGlmIChwcm9tby5MaXN0T2JzU0tVLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcHJvbW8uTGlzdE9ic1NLVS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXJtYXJMaXN0YU9ic2VxdWlvc0NvbWJpU0tVKGNvbWJpLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLCBjYW50aWRhZDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGNvbWJpLkFjY2lvbi5SZWdsYU9ic2VxID09IFwiRVhDXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXF1aW9zRXhjID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NDYW50aWRhZCA9IGNhbnRpZGFkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lnbmFySWRFbmNQYWRyZU9ic2VxdWlvQ29tYmluYWRvKGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MsIG9NM1BFbmNJdGVtcyk7XHJcbiAgICAgICAgICAgIGNvbWJpLkFjY2lvbi5PQlNFUVVJT1MuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ2FudGlkYWQgPSBjYW50aWRhZCAqICtlbGVtZW50LkNhbnRpZGFkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vTGlzdGFPYnNlcXVpb3MgPSBjb21iaS5BY2Npb24uT0JTRVFVSU9TO1xyXG4gICAgfVxyXG5cclxuICAgIGFzaWduYXJJZEVuY1BhZHJlT2JzZXF1aW9Db21iaW5hZG8ob2JzZXF1aW9zLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgaWYgKG9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ic2VxdWlvcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZEVuY1BhZHJlID0gb00zUEVuY0l0ZW1zLklEO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXRvcm5hIHRydWUgc2kgaGF5IG90cmEgcHJvbW8gYXBsaWNhZGEgZG9uZGUgbmkgbGEgcHJvbW8gZGUgb2JzZXF1aW8gbyBsYSBhcGxpY2FkYSBzb24gZmlqYXMgeSB1bmEgZGUgbGFzIGRvcyBlcyBFWENcclxuICAgIHZhbGlkYVNpVGllbmVPdHJhUHJvbW8ocHJvbW9PYnNlcXVpbzogUHJvbW9jaW9uZXNBc29jaWFkYXMsIGFyclByb21vY2lvbmVzQXNvY2lhZGFzOiBBcnJheTxQcm9tb2Npb25lc0Fzb2NpYWRhcz4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAocHJvbW9PYnNlcXVpby5SZWdsYSAhPSBcIkFDTVwiKSB7XHJcbiAgICAgICAgICAgIGxldCBvUHJvbW9zTm9PYnNlcXVpb3MgPSBhcnJQcm9tb2Npb25lc0Fzb2NpYWRhcy5maWx0ZXIoeCA9PiB4LklEUHJvbW9jaW9uICE9IHByb21vT2JzZXF1aW8uSURQcm9tb2Npb24pO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb21vIG9mIG9Qcm9tb3NOb09ic2VxdWlvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb21vLlJlZ2xhICE9IFwiQUNNXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvbW8uQXBsaWNhZGEgJiYgKHByb21vLlJlZ2xhID09IFwiRVhDXCIgfHwgcHJvbW9PYnNlcXVpby5SZWdsYSA9PSBcIkVYQ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9wcm9jZXNhbWllbnRvIGRlIG9ic2VxdWlvc1xyXG4gICAgcHVibGljIGFzeW5jIFByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlcjogYW55LFxyXG4gICAgICAgIG9NM1BJdGVtc1dFQjogTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb3NFeGMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5vYnNlcXVpb09Qcm9tbyA9IC0xO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vTGlzdGFPYnNlcXVpb3MgIT0gbnVsbCAmJiB0aGlzLm9MaXN0YU9ic2VxdWlvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub0xpc3RhT2JzZXF1aW9zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLlNLVSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0pBR00gMjAxOTA4MTAgdmFsaWRhLCBjdWFudG9zIHByb2R1Y3RvcyBzZSBhZ3JlZ2EgZW4gZWwgb2JzZXF1aW8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9MaXN0YU9ic2VxdWlvc1tpXS5DYW50aWRhZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLkNhbnRpZGFkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MTExMiBzZSBhZ3JlZyBmdW5jaW9uYWxpZGFkIGRlIG9ic2VxdWlvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuQmlzT2JzZXF1aW8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQSXRlbXNXRUIuSURFbmNQYWRyZSA9IHRoaXMub0xpc3RhT2JzZXF1aW9zW2ldLmlkRW5jUGFkcmU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5UaXBvQWdydXBhY2lvbiA9IFwiT0JTUVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkd1YXJkYXJQcm9tb2Npb24odGhpcy5vTGlzdGFPYnNlcXVpb3NbaV0sIG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub0xpc3RhT2JzZXF1aW9zID0gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9HdWFyZGFyIHByb21vY2lvbiBzZWd1biB1biBza3VcclxuICAgIC8vMS4gQnVzY2FyIGVsIHByb2R1Y3RvIHNlZ3VuIGVsIHNrdVxyXG4gICAgLy8yLiBBZ3JlZ2FyIGVsIHByb2R1Y3RvIGEgbTNwcm9jZXNvc1xyXG4gICAgLy8zLiBBZ3JlZ2FyIGFsIGNhcnJpdG8gZGUgY29tcHJhcy5cclxuICAgIHB1YmxpYyBhc3luYyBHdWFyZGFyUHJvbW9jaW9uKHByb21vLCBvRGF0YVVzZXI6IGFueSxcclxuICAgICAgICBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBFbkxpbmVhOiBib29sZWFuLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vIDIwMTgxMTIxICB2YXIgc0tleUNhcnJpdG87XHJcbiAgICAgICAgLy8gMjAxODExMjEgdmFyIG9NM1Byb2Nlc29zO1xyXG4gICAgICAgIHZhciBwcm9jZXNvUHJvbW87XHJcbiAgICAgICAgLy9PYnRlbmVyIGtleSBkZSBjYXJyaXRvIGRlIGNvbXByYXNcclxuICAgICAgICAvLyAyMDE4MTEyMSBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcblxyXG5cclxuICAgICAgICAvLyAyMDE4MTEyMSBvTTNQcm9jZXNvcyA9IGF3YWl0IG9NM0RhdGEuR2V0RGF0YVBvdWNoQkQoc0tleUNhcnJpdG8pO1xyXG4gICAgICAgIHByb2Nlc29Qcm9tbyA9IGF3YWl0IHRoaXMuQWRpY2lvbmFyUHJvbW9jaW9uQVByb2Nlc28ocHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNQSXRlbXNXRUIsIG9NM1ViaWNhY2lvbiwgRW5MaW5lYSwgb0RhdGFVc2VyKTtcclxuICAgICAgICAvL0d1YXJkYXIgZW4gcG91Y2ggREJcclxuICAgICAgICAvLyAyMDE4MTEyMSAgYXdhaXQgb00zRGF0YS5BZGRUb1BvdWNoQkRDYXJyaXRvQ29tcHJhcyhzS2V5Q2Fycml0bywgcHJvY2Vzb1Byb21vKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgbG9zIHByb2R1Y3RvIHNlZ3VuIHN1IFNLVSwgc2FjYW5kbyBsYSBpbmZvcm1hY2lvbiBkZXNkZSBwb3VjaERCLlxyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hclByb21vY2lvbkFQcm9jZXNvKHByb21vLCBvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbiwgb0RhdGFVc2VyOiBhbnkpIHtcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIG9Qcm9kdWN0byA9IGF3YWl0IHRoaXMuR2V0UHJvZHVjdG9CeVNLVShwcm9tby5TS1UsIEVuTGluZWEsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIpO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcob1Byb2R1Y3RvKTtcclxuICAgICAgICBpZiAob1Byb2R1Y3RvICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy9ZYSBubyBzZSBkZWphIHByZWNpbyBjZXJvIHNpbm8gcXVlIGNvbW8gZXMgb2JzZXF1aW8gc2ltdWxhIHVuIGRlc2N1ZW50byBkZWwgMTAwJSBcclxuICAgICAgICAgICAgLy9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5Mb00zUHJkTGlzdGEuUFJFQ0lPID0gMDtcclxuICAgICAgICAgICAgLy9BZ3JlZ2FyIGEgbTNwcm9jZXNvcyBlbCBvYnNlcXVpby5cclxuICAgICAgICAgICAgLy9vTTNQcm9jZXNvcyA9IHRoaXMuTG9hZE0zUHJvY2Vzb0Zyb21EYXRhKG9NM1Byb2Nlc29zLCBvUHJvZHVjdG8sIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBudWxsKTtcclxuXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gdGhpcy5hZGR0b2NhcnQob00zUEl0ZW1zV0VCLCBvUHJvZHVjdG8sIG51bGwsIG51bGwsIG9EYXRhVXNlciwgdGhpcy5nc0lka2F0aW9zLCBvTTNVYmljYWNpb24sIG51bGwsIG9NM1Byb2Nlc29zLCBudWxsLCAxMDApOy8vKlNlIG1hbmRhIHZhbG9yIGRlIGRlc2N1ZW5udG8gMTAwICVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBwcm9kdWN0byBzZWd1biBlbCBTS1VcclxuICAgIHB1YmxpYyBhc3luYyBHZXRQcm9kdWN0b0J5U0tVKHNTS1UsIEVuTGluZWE6IGJvb2xlYW4sIG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSwgZGlzcG9uaWJsZU0zRW5jID0gbnVsbCkge1xyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIHByb2R1Y3RvcztcclxuICAgICAgICB2YXIgb1Byb2R1Y3RvOiBUeXBlTTNQcmRHcnAgPSBudWxsO1xyXG4gICAgICAgIHZhciBvU2VydmljZUxvYWRMaXN0YVByZWNpbyA9IG5ldyBTZXJ2aWNlTG9hZExpc3RhUHJlY2lvKHRoaXMuZ3NJZGthdGlvcyk7XHJcblxyXG4gICAgICAgIC8vb1NlcnZpY2VMaXN0YVByZWNpby5HZW5lcmF0ZURhdGFWYWxpZGFjaW9uKG9EYXRhVXNlciwgb00zUHJvY2Vzb3MuVE1JZFByb2Nlc28pO1xyXG4gICAgICAgIGlmICghRW5MaW5lYSAmJiAhb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLkZlY2hhUHJlY2lvKSB7XHJcbiAgICAgICAgICAgIHZhciBzSURQcm9kdWN0b3MgPSB0aGlzLmdzSWRrYXRpb3MgKyBcIj9QUkRcIjtcclxuICAgICAgICAgICAgcHJvZHVjdG9zID0gYXdhaXQgdGhpcy5vTTNDb3VjaE1hZXN0cm8uZ2V0KHNJRFByb2R1Y3Rvcyk7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0byA9IG9TZXJ2aWNlTTNNYWVzdHJvLkdldE0zUHJkR3JwRnJvbUxpc3QocHJvZHVjdG9zLk0zTGlzdFByb2R1Y3Rvcy5NM0dSUCwgc1NLVSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHZXRQcm9kdWN0b0J5U0tVQXN5bmModGhpcy5Hb1Bvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZGthdGlvcywgc1NLVSwgb0RhdGFVc2VyLCBvTTNQcm9jZXNvcy5VYmljMS50b1N0cmluZygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFIDw9IDAgJiYgZGlzcG9uaWJsZU0zRW5jKSB7XHJcbiAgICAgICAgICAgIG9Qcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXS5ESVNQT05JQkxFID0gZGlzcG9uaWJsZU0zRW5jO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgb1NlcnZpY2VMb2FkTGlzdGFQcmVjaW8uQXNpZ25hckxpc3RhUHJlY2lvKG9Qcm9kdWN0bywgb0RhdGFVc2VyLCB0aGlzLkdvUG9zdFNlcnZpY2VNMyk7XHJcbiAgICAgICAgLy9vU2VydmljZUxpc3RhUHJlY2lvLlZhbGlkYXJMaXN0YVByZWNpb3Mob1Byb2R1Y3RvLCB0aGlzLkdvUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lka2F0aW9zKTtcclxuICAgICAgICByZXR1cm4gb1Byb2R1Y3RvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FsY3VsYXIgcHJlY2lvIHNpbiBpbXB1ZXN0b3MuIExhIGZvcm1hIGVzIGNhbGN1bGFyIHRvZG8gZWwgdmFsb3IgZGVsIGltcHVlc3RvLiBFSjogMTIwLjA5IC8gMS4xNi4gU2kgZWwgdmFsb3IgZGVsIGltcHVlc3RvIGVzOiAxNiVcclxuICAgIHB1YmxpYyBDYWxjdWxhdGVQcmVjaW9CYXNlKENUQkxESU1QUFJEOiBzdHJpbmcsIGRWYWxvck5ldG86IG51bWJlcikge1xyXG4gICAgICAgIC8vdmFyIGRWYWxvckltcHVlc3RvOiBudW1iZXIgPSAxO1xyXG4gICAgICAgIHZhciBkVmFsb3JCYXNlOiBudW1iZXIgPSBkVmFsb3JOZXRvO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBveG1sVG9Kc29uVEYgPSBuZXcgeG1sVG9Kc29uVEYoKTtcclxuICAgICAgICAgICAgdmFyIGpJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG4gICAgICAgICAgICAgICAgakltcHVlc3Rvcy5JTVBVRVNUT1MuSU1QVUVTVE8uZm9yRWFjaChpbXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAgMjAxOTA2MjYgQ2FtYmlvIGRlIGNhbGN1bG8gZGUgYmFzZSBkZSBsb3MgaW1wdWVzdG9zLlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXAuJC5NZXRvZG9sb2dpYSA9PSBcIlBPUkNFTlRBSkVcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkVmFsb3JCYXNlID0gKCtkVmFsb3JCYXNlKSAvICgxICsgK2ltcC4kLlZhbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRWYWxvckJhc2UgPSAoK2RWYWxvckJhc2UpIC0gKCtpbXAuJC5WYWxvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhvTTNQRW5jSXRlbXMuTTNJbXB1ZXN0b3MpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhdGNoXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3JldHVybiAoKCtkVmFsb3JOZXRvKSAvICgrZFZhbG9ySW1wdWVzdG8pKTtcclxuICAgICAgICByZXR1cm4gZFZhbG9yQmFzZTtcclxuICAgIH1cclxuXHJcbiAgICAvL0NhcmdhciBpbmZvcm1hY2nDg8KzbiBkZSBpbXB1ZXN0b3MsIGRlc2RlIGVsIHByb2R1Y3RvIGdlbmVyYWxcclxuICAgIHB1YmxpYyBMb2FkTTNQSW1wdWVzdG9zRnJvbVByZEdybChDVEJMRElNUFBSRDogc3RyaW5nLCBvTTNQRW5jSXRlbXM6IE0zUEVuY0l0ZW1zLFxyXG4gICAgICAgIGRWYWxvck5ldG86IG51bWJlciwgY2FudGlkYWQ6IG51bWJlciwgdmFsb3JUb3RhbFByb2R1Y3RvVW5pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIG94bWxUb0pzb25URiA9IG5ldyB4bWxUb0pzb25URigpO1xyXG4gICAgICAgICAgICB2YXIgb00zUEltcHVlc3RvczogTTNQSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JCYXNlVG90YWwgPSB0aGlzLm9NYXRoVEYucm91bmQoZFZhbG9yTmV0bywgNCk7XHJcbiAgICAgICAgICAgIGxldCB2YWxvck5ldG9Ub3RhbCA9IHZhbG9yQmFzZVRvdGFsO1xyXG4gICAgICAgICAgICBsZXQgdmFsb3JUb3RhbFByb2R1Y3RvVG90YWwgPSArYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclRvdGFsUHJvZHVjdG9Vbml0LCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIHZhciBqSW1wdWVzdG9zO1xyXG4gICAgICAgICAgICB2YXIgZFRvdGFsSW1wdWVzdG86IG51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGlmIChDVEJMRElNUFBSRCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBqSW1wdWVzdG9zID0gb3htbFRvSnNvblRGLmNvbnZlcnRYbWxUb0pzb24oQ1RCTERJTVBQUkQpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE5MDYyNiBDYW1iaW8gZW4gb3JkZW4gZGUgbG9zIGltcHVlc3Rvcy5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUTy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWxvclJlYWxJbXAgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbXAgPSBqSW1wdWVzdG9zLklNUFVFU1RPUy5JTVBVRVNUT1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBvTTNQSW1wdWVzdG9zID0gbmV3IE0zUEltcHVlc3RvcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuQ29kSW1wdWVzdG8gPSBpbXAuJC5Db2RJbXA7XHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5Qb3JjZW50YWplID0gaW1wLiQuVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcC4kLk1ldG9kb2xvZ2lhID09IFwiUE9SQ0VOVEFKRVwiKSB7Ly9QT1JDRU5UQUpFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtiaWdEZWNpbWFsLm11bHRpcGx5KGltcC4kLlZhbG9yLCB2YWxvck5ldG9Ub3RhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuVmFsb3IgPSB0aGlzLm9NYXRoVEYucm91bmQodmFsb3JSZWFsSW1wLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9NM1BJbXB1ZXN0b3MuVmFsb3IgPCB2YWxvclJlYWxJbXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmNlaWwoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9NM1BJbXB1ZXN0b3MuTGltaXRlT3B1ZXN0byA9ICtNYXRoLmZsb29yKCtiaWdEZWNpbWFsLm11bHRpcGx5KHZhbG9yUmVhbEltcCwgMTAwKSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ly9GSUpPXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbG9yUmVhbEltcCA9ICtpbXAuJC5WYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5WYWxvciA9IHRoaXMub01hdGhURi5yb3VuZCh2YWxvclJlYWxJbXAsIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAob00zUEltcHVlc3Rvcy5WYWxvciA8IHZhbG9yUmVhbEltcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguY2VpbCgrYmlnRGVjaW1hbC5tdWx0aXBseSh2YWxvclJlYWxJbXAsIDEwMCkpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb00zUEltcHVlc3Rvcy5MaW1pdGVPcHVlc3RvID0gK01hdGguZmxvb3IoK2JpZ0RlY2ltYWwubXVsdGlwbHkodmFsb3JSZWFsSW1wLCAxMDApKSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBOdWV2byBjb25jZXB0byBkZSBiYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgb00zUEltcHVlc3Rvcy5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yTmV0b1RvdGFsLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZCgoK2RUb3RhbEltcHVlc3RvKSwyKSArIHRoaXMub01hdGhURi5yb3VuZCgoK29NM1BJbXB1ZXN0b3MuVmFsb3IpLDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vSkFHTSAyMDE4MDkxMiBTdW1hIGRlIFZhbG9yIE5ldG9cclxuICAgICAgICAgICAgICAgICAgICB2YWxvck5ldG9Ub3RhbCA9IHRoaXMub01hdGhURi5yb3VuZCgoK3RoaXMub01hdGhURi5yb3VuZCh2YWxvck5ldG9Ub3RhbCwgMikpICsgdGhpcy5vTWF0aFRGLnJvdW5kKCgrb00zUEltcHVlc3Rvcy5WYWxvciksMiksIDIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vL1NvbG8gYWRpY2lvbmUgYSBpbXB1ZXN0b3MsIGN1YW5kbyBlcyB0b3RhbCBpbXB1ZXN0b3NcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW1wRXhpc3RlOiBNM1BJbXB1ZXN0b3M7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wRXhpc3RlID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvcy5maW5kKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gPT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcEV4aXN0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0JvcnJhIGVuIGl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUEVuY0l0ZW1zLk0zUEltcHVlc3RvcyA9IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MuZmlsdGVyKGltcCA9PiBpbXAuQ29kSW1wdWVzdG8gIT0gb00zUEltcHVlc3Rvcy5Db2RJbXB1ZXN0byk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MucHVzaChvTTNQSW1wdWVzdG9zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGpJbXB1ZXN0b3MuSU1QVUVTVE9TLklNUFVFU1RPLmZvckVhY2goaW1wID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9KQUdNIDIwMTkwNzI2IHNlIGFncmVnYSB2YWxpZGFjaW9uLCB5YSBxdWUgZXN0YWJhIHF1ZWRhbmRvIGxhIHJlc3RhLCBjb24gdmFsb3JlcyBjb21vOiAwLjAwMDAwMDAwMDAxID0gMS4xNTY0NTY0NTY0ZTg0NSBFSlxyXG4gICAgICAgICAgICBpZiAoZFRvdGFsSW1wdWVzdG8gIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy9EaWZlcmVuY2lhIHJlZG9uZGVhZGEgYSBkb3MgZGVjaW1hbGVzXHJcbiAgICAgICAgICAgICAgICBkVG90YWxJbXB1ZXN0byA9IHRoaXMub01hdGhURi5yb3VuZChkVG90YWxJbXB1ZXN0bywgMik7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgoK3ZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gK3RoaXMub01hdGhURi5yb3VuZCh2YWxvckJhc2VUb3RhbCwyKSAtICtkVG90YWxJbXB1ZXN0byksIDIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRpZmVyZW5jaWEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IHRoaXMub01hdGhURi5yb3VuZCgrKCt2YWxvclRvdGFsUHJvZHVjdG9Ub3RhbCAtICt0aGlzLm9NYXRoVEYucm91bmQodmFsb3JCYXNlVG90YWwsIDIpIC0gK2RUb3RhbEltcHVlc3RvKS50b0ZpeGVkKDQpLDIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zLCBkaWZlcmVuY2lhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBcIlRPVEFMSU1QVUVTVE9TXCJcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9NYXRoVEYucm91bmQoKHZhbG9yVG90YWxQcm9kdWN0b1RvdGFsIC0gdGhpcy5vTWF0aFRGLnJvdW5kKHZhbG9yQmFzZVRvdGFsLDIpKSwgMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJDYXRjaFwiKVxyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGUyAyMDE5MDcyNVxyXG4gICAgICogQ29ycmlnZSBlbCB2YWxvciBxdWUgdG9tbyBlbCBpbXB1ZXN0byBkZXNwdWVzIGRlIGhhYmVyc2UgcmVkb25kZWFkb1xyXG4gICAgICogU2kgYWwgcmVjb3JyZXIgdG9kb3MgbG9zIGltcHVlc3RvcyBsYSBkaWZlcmVuY2lhIG5vIHNlIHphbmphLCBOSSBNT0RPUyBlbCBlcnJvciBlc3TDg8KhIGVuIG90cmEgcGFydGVcclxuICAgICAqIFNlIGNyZWEgZXN0YSBmdW5jacODwrNuIHBhcmEgcmVzb2x2ZXIgbG9zIGVycm9yZXMgZGUgdGltYnJhZG8gZGUgZmFjdHVyYSBlbGVjdHLDg8KzbmljYVxyXG4gICAgICogQHBhcmFtIG9NM1BFbmNJdGVtcyBcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIERpZmVyZW5jaWEgcXVlIHNlIGRlYmUgc2FsZGFyIHBhcmEgY29uc2VndWlyIGVsIHZhbG9yIHRvdGFsIGRlIGltcHVlc3RvcyByZXF1ZXJpZG9cclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yRGVJbXB1ZXN0b3Mob00zUEVuY0l0ZW1zOiBNM1BFbmNJdGVtcywgZGlmZXJlbmNpYTogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgX2kgPSAwOyBfaSA8IG9NM1BFbmNJdGVtcy5NM1BJbXB1ZXN0b3MubGVuZ3RoOyBfaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltcHVlc3RvID0gb00zUEVuY0l0ZW1zLk0zUEltcHVlc3Rvc1tfaV07XHJcbiAgICAgICAgICAgIC8vU2kgbGEgZGlmZXJlbmNpYSBlcyBwb3NpdGl2YSBxdWllcmUgZGVjaXIgcXVlIGxhIHN1bWEgZGUgbG9zIGltcHVlc3RvcyBlcyBtZW5vciBhIGxhIHJlYWxcclxuICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NpIGVsIGltcHVlc3RvIHNlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHF1aWVyZSBkZWNpciBxdWUgc2UgcHVkbyByZWRvbmRlYXIgaGFjaWEgYXJyaWJhXHJcbiAgICAgICAgICAgICAgICAvL0VudG9uY2VzIGxvIFwicmVkb25kZWEgaGFjaWEgYXJyaWJhXCIgeSByZXN0YSB1bmEgY2VudGVzaW1hIGEgbGEgZGlmZXJlbmNpYVxyXG4gICAgICAgICAgICAgICAgaWYgKGltcHVlc3RvLlZhbG9yIDwgaW1wdWVzdG8uTGltaXRlT3B1ZXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLlZhbG9yID0gaW1wdWVzdG8uTGltaXRlT3B1ZXN0bztcclxuICAgICAgICAgICAgICAgICAgICBpbXB1ZXN0by5CYXNlID0gdGhpcy5vTWF0aFRGLnJvdW5kKGltcHVlc3RvLlZhbG9yIC8gaW1wdWVzdG8uUG9yY2VudGFqZSwgMik7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlmZXJlbmNpYSA9IGRpZmVyZW5jaWEgLSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9TaSBWYWxvcj5WYWxvclJlYWwgcXVpZXJlIGRlY2lyIHF1ZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgeSBubyBkZWJlIG1vZGlmaWNhciBlc2UgdmFsb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL1NpIGxhIGRpZmVyZW5jaWEgZXMgbmVnYXRpdmEgcXVpZXJlIGRlY2lyIHF1ZSBsYSBzdW1hIGRlIGxvcyBpbXB1ZXN0b3MgZXMgbWF5b3IgYSBsYSByZWFsXHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9TaSBlbCBpbXB1ZXN0byBzZSByZWRvbmRlbyBoYWNpYSBhcnJpYmEgcXVpZXJlIGRlY2lyIHF1ZSBzZSBwdWRvIHJlZG9uZGVhciBoYWNpYSBhYmFqb1xyXG4gICAgICAgICAgICAgICAgLy9FbnRvbmNlcyBsbyBcInJlZG9uZGVhIGhhY2lhIGFiYWpvXCIgeSBzdW1hIHVuYSBjZW50ZXNpbWEgYSBsYSBkaWZlcmVuY2lhXHJcbiAgICAgICAgICAgICAgICBpZiAoaW1wdWVzdG8uVmFsb3IgPiBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wdWVzdG8uVmFsb3IgPSBpbXB1ZXN0by5MaW1pdGVPcHVlc3RvO1xyXG4gICAgICAgICAgICAgICAgICAgIGltcHVlc3RvLkJhc2UgPSB0aGlzLm9NYXRoVEYucm91bmQoaW1wdWVzdG8uVmFsb3IgLyBpbXB1ZXN0by5Qb3JjZW50YWplLCAyKTtcclxuICAgICAgICAgICAgICAgICAgICBkaWZlcmVuY2lhID0gZGlmZXJlbmNpYSArIDAuMDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL1NpIFZhbG9yPFZhbG9yUmVhbCBxdWllcmUgZGVjaXIgcXVlIHJlZG9uZGVvIGhhY2lhIGFiYWpvIHkgbm8gZGViZSBtb2RpZmljYXIgZXNlIHZhbG9yXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vU2kgeWEgc2Ugc2FsZG8gbGEgZGlmZXJlbmNpYSByb21wZSBlbCBjaWNsbyBkYW5kbyBwb3IgY29uY2x1aWRvIGVsIGFqdXN0ZVxyXG4gICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0xvYWQgcG9yIHVuaWRhZCBkZXRhbGxlIGRlbCBtM3Byb2Nlc28gaXRlbXMuXHJcbiAgICBwdWJsaWMgTG9hZE0zUERldGFsbGUoc1ZhbG9yOiBzdHJpbmcsIHNDb25jZXB0bzogc3RyaW5nKTogTTNQRGV0YWxsZUl0ZW1zIHtcclxuICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gc0NvbmNlcHRvO1xyXG4gICAgICAgIG9NM1BEZXRhbGxlSXRlbXMuVmFsb3IgPSBzVmFsb3I7XHJcbiAgICAgICAgcmV0dXJuIG9NM1BEZXRhbGxlSXRlbXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vR2VuZXJhciBwcm9tb2Npb24gY29tYmluYWRhXHJcbiAgICBwdWJsaWMgYXN5bmMgR2VuZXJhclByb21vQ29tYmluYWRhKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIGlmICghb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyB8fCAob00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcyAmJiAhb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5maW5kKHggPT4geC5Ob21icmUgPT0gXCJQVUVOVEVfRElBUklPXCIpKSkge1xyXG4gICAgICAgICAgICB2YXIgb3Byb21vY2lvbmVzU2VydmljZSA9IG5ldyBwcm9tb2Npb25lc1NlcnZpY2Uob0RhdGFVc2VyLCBudWxsKTtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MgPSBvcHJvbW9jaW9uZXNTZXJ2aWNlLlByb2Nlc2FyQ29tYmluYWRhKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNhbGN1bGFyUHJlY2lvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL0NvbXBhcmUgTTNQcm9jZXNvcy4gKEZpcnN0OiBAUGFyYW06IGlsTTNQcm9jZXNvc1NRTCBWUyBTZWNvbmQ6IEdldCBGcm9tIENvdWNoREIvUG91Y2hEQilcclxuICAgIHB1YmxpYyBhc3luYyBDb21wYXJlTTNQcm9jZXNvKHNJREthdGlvczogc3RyaW5nLCBvTTNEYXRhOiBNM0RhdGEsIG9EYXRhVXNlcjogYW55LCBpbE0zUHJvY2Vzb3NTUUw6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICB2YXIgb1Jlc3A7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy9HZXQgZGF0YSwgZnJvbSBQb3VjaERCL0NvdWNoREJcclxuICAgICAgICAgICAgdmFyIFByb3BlcnR5Q29tcGFyZSA9IFtcIlZhbG9yTmV0b1wiLCBcIlZhbG9yXCJdO1xyXG4gICAgICAgICAgICB2YXIgc0tleUNhcnJpdG86IHN0cmluZztcclxuICAgICAgICAgICAgdmFyIG9NM1Byb2Nlc29zQ09VQ0g6IE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgICAgIHZhciBiUmVzcDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBzS2V5Q2Fycml0byA9IG9NM0RhdGEuR2V0S2V5Q2Fycml0b0NvbXByYXMoc0lES2F0aW9zLCBvRGF0YVVzZXIuVXN1YXJpb1Npc3RlbWEuVERPQywgb0RhdGFVc2VyLlVzdWFyaW9TaXN0ZW1hLk5ET0MsIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIG9EYXRhVXNlci5Vc3VhcmlvU2lzdGVtYS5JREhVQik7XHJcbiAgICAgICAgICAgIC8vR2V0IGRhdGEsIGZyb20gUG91Y2hEQi9Db3VjaERCXHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zQ09VQ0ggPSBhd2FpdCBvTTNEYXRhLkdldERhdGFQb3VjaEJEKHNLZXlDYXJyaXRvKTtcclxuXHJcbiAgICAgICAgICAgIC8vU3RhcnQgQ29tcGFyZVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFByb3BlcnR5Q29tcGFyZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlsTTNQcm9jZXNvc1NRTFtQcm9wZXJ0eUNvbXBhcmVbaV1dICE9IG9NM1Byb2Nlc29zQ09VQ0hbUHJvcGVydHlDb21wYXJlW2ldXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChiUmVzcCkge1xyXG4gICAgICAgICAgICAgICAgLy9Db21wYXJlOiBJRCwgSWRQcm9kdWN0byB5IENBTlRJREFEXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGlsTTNQcm9jZXNvc1NRTC5NM0VOQy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklEICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5JRCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvTTNQcm9jZXNvc0NPVUNILk0zRU5DW2pdLklkUHJvZHVjdG8gIT0gaWxNM1Byb2Nlc29zU1FMLk0zRU5DW2pdLklkUHJvZHVjdG8gfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb00zUHJvY2Vzb3NDT1VDSC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yICE9IGlsTTNQcm9jZXNvc1NRTC5NM0VOQ1tqXS5NM0RFVC5maW5kKHggPT4geC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogYlJlc3AsIFwiTTNQcm9jZXNvc1wiOiBvTTNQcm9jZXNvc0NPVUNIIH07XHJcbiAgICAgICAgICAgIHJldHVybiBvUmVzcDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIENvbXBhcmVNM1Byb2Nlc29cIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgb1Jlc3AgPSB7IFwiYlJlc3BcIjogdHJ1ZSwgXCJNM1Byb2Nlc29zXCI6IG51bGwgfTtcclxuICAgICAgICAgICAgcmV0dXJuIG9SZXNwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGNvbWVyY2lhbCBhbCBwcm9jZXNvLCBsbyBhZGljaW9uYSBhbCBhcnJlZ2xvIGRlIGRpbmFtaWNvcyBhc29jaWFkbyBhbCBwcm9jZXNvLlxyXG4gICAgcHVibGljIEFkZENvbWVyY2lhbFRvTTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBUZG9jQ29tZXJjaWFsOiBzdHJpbmcsIE5kb2NDb21lcmNpYWw6IHN0cmluZykge1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLmxNM1BEaW5hbWljYXMucHVzaCh0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJUQ09NRVJDSUFMXCIsIFRkb2NDb21lcmNpYWwpKTtcclxuICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2godGhpcy5DcmVhdGVUdXBsYURpbmFtaWNhKFwiTkNPTUVSQ0lBTFwiLCBOZG9jQ29tZXJjaWFsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DcmVhY2lvbiB5IHJldG9ybm8gZGUgdHVwbGEgZGUgZGluYW1pY29zLCBhdGFkb3MgYSBwcm9jZXNvIG0zLlxyXG4gICAgcHVibGljIENyZWF0ZVR1cGxhRGluYW1pY2Eobm9tYnJlLCB2YWxvcikge1xyXG4gICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gbm9tYnJlO1xyXG4gICAgICAgIG9NM1BEaW5hbWljYXMuVmFsb3IgPSB2YWxvcjtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1BEaW5hbWljYXM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vL0FjdHVhbGl6YSBsYSBjYW50aWRhZCBkZSBcclxuICAgIHB1YmxpYyBzZXRDYW50aWRhZEFMTFlVUERDb3VjaChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zRGF0YTogTTNEYXRhLFxyXG4gICAgICAgIG9EYXRhVXNlcjogYW55LCBzSURLYXRpb3M6IHN0cmluZywgZnVuY2lvbk9LOiBGdW5jdGlvbiwgZnVuY2lvbkVycm9yOiBGdW5jdGlvbiwgaUNhbnRpZGFkKSB7XHJcblxyXG4gICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCAmJiBvTTNQcm9jZXNvcy5JRERpYXJpbyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vL0F1biBubyBlc3RhIHJlZ2lzdHJhZG8gZWwgcHJvY2VzbyBjb21vIHRhbCwgc2UgcHVlZGUgYm9ycmFyIGRlIHJhaXpcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMgPSBuZXcgQXJyYXk8TTNQRW5jSXRlbXM+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuVXBkYXRlTTNQcm9jZXNvc1dpdGhEYXRhKG9NM1Byb2Nlc29zLCBvTTNEYXRhLCBvRGF0YVVzZXIsIHNJREthdGlvcywgXCJXRUJcIiwgZnVuY2lvbk9LLCBmdW5jaW9uRXJyb3IpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpQ2FudGlkYWQgPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuRGVsZXRlTTNQcm9jZXNvKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR2V0Q2Fycml0b0NvbXByYXNQb3VjaERCKG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY2lvbk9LKG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciA9IGlDYW50aWRhZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBcIldFQlwiLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8vU2UgY2FudGlkYWQgZGUgdW4gcHJvZHVjdG8gZXNwZWNpZmljb1xyXG4gICAgcHVibGljIHNldENhbnRpZGFkWVVQRENvdWNoKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBvTTNEYXRhOiBNM0RhdGEsXHJcbiAgICAgICAgb0RhdGFVc2VyOiBhbnksIHNJREthdGlvczogc3RyaW5nLCBmdW5jaW9uT0s6IEZ1bmN0aW9uLFxyXG4gICAgICAgIGZ1bmNpb25FcnJvcjogRnVuY3Rpb24sIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgdGlwb1ViaWNhY2lvbiwgSURFbmMsXHJcbiAgICAgICAgbTNVYmljYWNpb246IE0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTzogQXJyYXk8TTNFTkNQUk9NTz4sIGZvcnphckJvcnJhZDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcblxyXG4gICAgICAgIGlmICgoaUNhbnRpZGFkID09IDAgJiYgb00zUHJvY2Vzb3MuSUREaWFyaW8gPT09IHVuZGVmaW5lZCAmJiB0aXBvVWJpY2FjaW9uID09IFwiV0VCXCIpIHx8IGZvcnphckJvcnJhZCkge1xyXG4gICAgICAgICAgICAvLy9BdW4gbm8gZXN0YSByZWdpc3RyYWRvIGVsIHByb2Nlc28gY29tbyB0YWwsIHNlIHB1ZWRlIGJvcnJhciBkZSByYWl6XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKHByb2QgPT4gIShwcm9kLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBwcm9kLklEID09IElERW5jKSAmJiAhKHByb2QuSWRFbmNQYWRyZSA9PSBJREVuYykpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGxvTTNQSXRlbXNXRUIgPSBuZXcgTTNQSXRlbXNXRUIoKTtcclxuICAgICAgICAgICAgbG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSkFHTSAyMDE5MTAyMSwgbm8gaGFjZXIgbMODwrNnaWNhIGRlIHByb21vY2lvbmVzIHkgdmFyaW9zLCBjdcODwqFuZG8gc2UgYm9ycmEgZWwgaXRlbS5cclxuICAgICAgICAgICAgaWYgKGlDYW50aWRhZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvL1NlIHRvbWEgZW4gY3VlbnRhIGVsIHByZCB5IHN1cyBoaWpvcyBjb24gZWwgSWRFbmNQYWRyZVxyXG4gICAgICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiAoZW5jLklkUHJvZHVjdG8gPT0gaWRQcm9kdWN0byAmJiBlbmMuTG90ZSA9PSBMb3RlICYmIGVuYy5JRCA9PSBJREVuYykgfHwgZW5jLklkRW5jUGFkcmUgPT0gSURFbmMpLmZvckVhY2gocHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwcmQuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL29NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IGlkUHJvZHVjdG8gJiYgZW5jLkxvdGUgPT0gTG90ZSAmJiBlbmMuSUQgPT0gSURFbmMpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yID0gaUNhbnRpZGFkOy8vQW50aWd1YSBsb2dpY2FcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlVwZGF0ZU0zUHJvY2Vzb3NXaXRoRGF0YShvTTNQcm9jZXNvcywgb00zRGF0YSwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIHRpcG9VYmljYWNpb24sIGZ1bmNpb25PSywgZnVuY2lvbkVycm9yLCBtM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhbnRpZGFkVjIob00zUHJvY2Vzb3MsIGlkUHJvZHVjdG8sIExvdGUsIGlDYW50aWRhZCwgSURFbmMsIG9EYXRhVXNlciwgc0lES2F0aW9zLCBtM1ViaWNhY2lvbiwgb00zRU5DUFJPTU8pLnRoZW4ocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvciwgbTNVYmljYWNpb24sIHJlc3AuTTNQSXRlbXNXRUIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5VcGRhdGVNM1Byb2Nlc29zV2l0aERhdGEob00zUHJvY2Vzb3MsIG9NM0RhdGEsIG9EYXRhVXNlciwgc0lES2F0aW9zLCB0aXBvVWJpY2FjaW9uLCBmdW5jaW9uT0ssIGZ1bmNpb25FcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9DYW1iaWFyIGNhbnRpZGFkIGRlIG0zcHJvY2Vzb1xyXG4gICAgLy9KQUdNIDIwMTkxMDE4IFNlIGFncmVnYSBudWV2YSBmdW5jaW9uYWxpZGFkIGEgbGEgY2FudGlkYWQ6IFxyXG4gICAgLy8xLlNlIGJvcnJhIGVsIHByb2R1Y3RvIGRlIGxhIGxpc3RhIGRlbCBwcm9jZXNvXHJcbiAgICAvLzIuIFNlIGFncmVnYSBkZSBudWV2byBlbCBwcm9kdWN0byBjb24gbGEgbnVldmEgY2FudGlkYWQuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2V0Q2FudGlkYWRWMihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgaWRQcm9kdWN0bywgTG90ZSwgaUNhbnRpZGFkLCBJREVuYywgb0RhdGFVc2VyOiBhbnlcclxuICAgICAgICAsIHNJREthdGlvczogc3RyaW5nLCBtM1ViaWNhY2lvbjogTTNVYmljYWNpb24sIG9NM0VOQ1BST01POiBBcnJheTxNM0VOQ1BST01PPikge1xyXG4gICAgICAgIHZhciBvUHJvZHVjdG86IFR5cGVNM1ByZEdycCA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBpQ2FudGlkYWQ7XHJcbiAgICAgICAgLy9KQUdNIDIwMTkxMTE0LCBBZ3JlZ2FyIGltYWdlblxyXG4gICAgICAgIHZhciBvTTNQRW5jSXRlbXMgPSBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgZW5jLklEID09IElERW5jKTtcclxuICAgICAgICBpZiAob00zUEVuY0l0ZW1zKSB7XHJcbiAgICAgICAgICAgIG9NM1BJdGVtc1dFQi5QYXRoSW1hZ2VuID0gb00zUEVuY0l0ZW1zLlBhdGhJbWFnZTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQyA9IG9NM1Byb2Nlc29zLk0zRU5DLmZpbHRlcihlbmMgPT4gIShlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUgJiYgKGVuYy5JRCA9PSBJREVuYyB8fCBlbmMuSWRFbmNQYWRyZSA9PSBJREVuYykpKTtcclxuXHJcbiAgICAgICAgb1Byb2R1Y3RvID0gYXdhaXQgdGhpcy5HZXRQcm9kdWN0b0J5U0tVKGlkUHJvZHVjdG8sIHRydWUsIG9NM1Byb2Nlc29zLCBvRGF0YVVzZXIsIG9NM1BFbmNJdGVtcy5ESVNQT05JQkxFKTtcclxuICAgICAgICBvTTNQSXRlbXNXRUIgPSB0aGlzLkxvYWRBZGljaW9uYWxlcyhvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0byk7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MgPSB0aGlzLmFkZHRvY2FydChvTTNQSXRlbXNXRUIsIG9Qcm9kdWN0bywgbnVsbCwgbnVsbCwgb0RhdGFVc2VyLCBzSURLYXRpb3MsIG0zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiB7IFwiTTNQcm9jZXNvXCI6IG9NM1Byb2Nlc29zLCBcIk0zUEl0ZW1zV0VCXCI6IG9NM1BJdGVtc1dFQiB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldF9NM0VOQ19ieV9pZHByZF9sb3RlKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zLCBpZFByb2R1Y3RvLCBMb3RlKTogTTNQRW5jSXRlbXMge1xyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcy5NM0VOQy5maW5kKGVuYyA9PiBlbmMuSWRQcm9kdWN0byA9PSBpZFByb2R1Y3RvICYmIGVuYy5Mb3RlID09IExvdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLy9PYnRlbmVyIGNhbnRpZGFkIGRlIHVuIGVuY2FiZXphZG8sIHByb2R1Y3RvIGVzcGVjaWZpY28uXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIG9Qcm9kdWN0bzogTTNQcmRHZW5lcmFsKSB7XHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JZFByb2R1Y3RvID09IG9Qcm9kdWN0by5TS1UgJiYgZW5jLkxvdGUgPT0gb1Byb2R1Y3RvLkxPVEUpLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDYW50aWRhZFRvdGFsKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL1JFR0lPTiBERSBSRUNFUENJT05cclxuICAgIC8vU2UgYWdyZWdhIGF0cmlidXRvIGRlIEN1cnJlbnQgY2FudGlkYWQgZGUgcmVjZXBjaW9uXHJcbiAgICBwdWJsaWMgTWVyZ2VSZWNlcFlFbmMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGlkUmVjZXBjaW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvL29NM1BFbmNJdGVtcy5NM0RFVC5wdXNoKHRoaXMuTG9hZE0zUERldGFsbGUob00zUHJkR2VuZXJhbC5DVEJMRFBSRCwgXCJDVEJMRFBSRFwiKSk7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zUFJlY2VwY2lvbi5maWx0ZXIocmVjZXAgPT4gcmVjZXAuSWRSZWNlcGNpb24gPT0gaWRSZWNlcGNpb24pLmZvckVhY2gocmVjID0+IHtcclxuICAgICAgICAgICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZpbmQoZW5jID0+IGVuYy5JRCA9PSByZWMuSWRFbmMpLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShyZWMuQ2FudGlkYWQudG9TdHJpbmcoKSwgXCJDVVJDUkVDXCIpKTsvL0NVUlJFTlQgQ0FOVElEQUQgUkVDRVBDSU9OXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow4PCrSBtaXNtbyBhZ3JlZ2EgbcODwqFzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNSZWMob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDUkVDXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8vLy8vL0ZJTiBSRUdJT04gREUgUkVDRVBDSU9OXHJcblxyXG4gICAgLy8vLy8vL1JFR0lPTiBFTlRSRUdBXHJcbiAgICAvL1NlIGFncmVnYSBhdHJpYnV0byBkZSBDdXJyZW50IGNhbnRpZGFkIGRlIGVudmlvXHJcbiAgICBwdWJsaWMgTWVyZ2VFbnRwWUVuYyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIC8vb00zUEVuY0l0ZW1zLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShvTTNQcmRHZW5lcmFsLkNUQkxEUFJELCBcIkNUQkxEUFJEXCIpKTtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MuTTNQRW52aW9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNQRW52aW9zLmZvckVhY2goZW52ID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBsRW5jOiBBcnJheTxNM1BFbmNJdGVtcz47XHJcbiAgICAgICAgICAgICAgICBsRW5jID0gb00zUHJvY2Vzb3MuTTNFTkMuZmlsdGVyKGVuYyA9PiBlbmMuSWRFbnZpbyA9PSBlbnYuSWRFbnZpbyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGxFbmMgIT09IHVuZGVmaW5lZCAmJiBsRW5jICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsRW5jLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jLk0zREVULnB1c2godGhpcy5Mb2FkTTNQRGV0YWxsZShlbmMuTTNERVQuZmluZChkZXQgPT4gZGV0Lk5vbWJyZUNvbmNlcHRvID09IFwiQ0FOVElEQURcIikuVmFsb3IsIFwiQ1VSQ0VOVFwiKSk7Ly9DVVJSRU5UIENBTlRJREFEIFJFQ0VQQ0lPTlxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0RlamFyIGxvcyBkZSB0YWxsZXMgZGUgbGEgdmFyaWFibGU6IENVUkNSRUMgZW49MCwgRXN0byBwYXJhIGZsdWpvcywgZG9uZGUgYWdyZWdhIGluZm8gcHJvY2VzYSB5IGFow4PCrSBtaXNtbyBhZ3JlZ2EgbcODwqFzLlxyXG4gICAgcHVibGljIFJlbW92ZUN1ckNFbnQob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBpZiAob00zUHJvY2Vzb3MgIT09IHVuZGVmaW5lZCAmJiBvTTNQcm9jZXNvcyAhPSBudWxsICYmIG9NM1Byb2Nlc29zLk0zRU5DICE9PSB1bmRlZmluZWQgJiYgb00zUHJvY2Vzb3MuTTNFTkMgIT0gbnVsbClcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9EZXRhbGxlOiBNM1BEZXRhbGxlSXRlbXM7XHJcbiAgICAgICAgICAgICAgICBvRGV0YWxsZSA9IGVuYy5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDVVJDRU5UXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9EZXRhbGxlICE9PSB1bmRlZmluZWQgJiYgb0RldGFsbGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EZXRhbGxlLlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgLy8vLy8vL0ZJTiBSRUdJT04gRU5UUkVHQVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb21vY2lvbmVzIHF1ZSBzZSBwcm9jZXNhbiBkZXNwdWVzIGRlIGFncmVnYXIgYWwgY2Fycml0b1xyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIG9EYXRhVXNlciBcclxuICAgICAqIEBwYXJhbSBvTTNQSXRlbXNXRUIgXHJcbiAgICAgKiBAcGFyYW0gb00zVWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIEVuTGluZWEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBQcm9jUHJvbW9BZnRlckFkZFRvQ2FydChvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb0RhdGFVc2VyOiBhbnksXHJcbiAgICAgICAgb00zUEl0ZW1zV0VCOiBNM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgRW5MaW5lYTogYm9vbGVhbikge1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLlByb2Nlc2FyT2JzZXF1aW9zKG9EYXRhVXNlciwgb00zUEl0ZW1zV0VCLCBvTTNVYmljYWNpb24sIEVuTGluZWEsIG9NM1Byb2Nlc29zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2Nlc2FyIHByb21vY2lvbmVzIGRlc3B1ZXMgZGUgZmluYWxpemFyIGVsIHJlZ2lzdHJvXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBQcm9jUHJvbW9BZnRlckZpbmFsaXphcihvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG5cclxuICAgICAgICB0aGlzLkdlbmVyYXJQcm9tb0NvbWJpbmFkYShvTTNQcm9jZXNvcywgb0RhdGFVc2VyKTtcclxuICAgICAgICB0aGlzLlByb21vQWZ0ZXJQcm9jZXNvKG9NM1Byb2Nlc29zLCBvTTNVYmljYWNpb24sIG9NM0VOQ1BST01PLCBvRGF0YVVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQcm9tb0FmdGVyUHJvY2VzbyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiwgb00zRU5DUFJPTU86IEFycmF5PE0zRU5DUFJPTU8+LCBvRGF0YVVzZXI6IGFueSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvcHJvbW9jaW9uZXNTZXJ2aWNlID0gbmV3IHByb21vY2lvbmVzU2VydmljZShvRGF0YVVzZXIsIG51bGwpO1xyXG4gICAgICAgICAgICB2YXIgbFRpcG9zUHJvbW8gPSBuZXcgQXJyYXk8U3RyaW5nPigpO1xyXG4gICAgICAgICAgICB2YXIgYXJyUHJvbW86IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIHZhciBvUHJvbW9jaW9uUHJvY2VzYWRhID0gbmV3IFByb21vY2lvblByb2Nlc2FkYSgpO1xyXG4gICAgICAgICAgICBsVGlwb3NQcm9tby5wdXNoKFwiQUZURVJcIik7XHJcbiAgICAgICAgICAgIGFyclByb21vID0gb3Byb21vY2lvbmVzU2VydmljZS5WZXJpZmljYXJQcm9tb2Npb25lcyhvTTNQcm9jZXNvcywgbnVsbCwgb00zVWJpY2FjaW9uLCBvTTNFTkNQUk9NTywgbFRpcG9zUHJvbW8pO1xyXG4gICAgICAgICAgICBvUHJvbW9jaW9uUHJvY2VzYWRhID0gb3Byb21vY2lvbmVzU2VydmljZS5Qcm9jZXNhclByb21vQWZ0ZXIoYXJyUHJvbW8sIG9NM1Byb2Nlc29zLCBvTTNFTkNQUk9NTyk7XHJcblxyXG4gICAgICAgICAgICBpZiAob1Byb21vY2lvblByb2Nlc2FkYSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcm9jZXNvcy5WYWxvck5ldG8gPSBvUHJvbW9jaW9uUHJvY2VzYWRhLlByZWNpb1RvdGFsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5BZGRJbmZvUHJvbW9jaW9uZXNBRGluYW1pY2FzKG9NM1Byb2Nlc29zLCBvUHJvbW9jaW9uUHJvY2VzYWRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2gge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2FyIGluZm9ybWFjaW9uIGRlIHByb21vY2lvbmVzIGEgaW5mb3JtYWNpb24gZGluYW1pY2EgZGVsIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqIEBwYXJhbSBvUHJvbW9jaW9uUHJvY2VzYWRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkSW5mb1Byb21vY2lvbmVzQURpbmFtaWNhcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcywgb1Byb21vY2lvblByb2Nlc2FkYTogUHJvbW9jaW9uUHJvY2VzYWRhKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdlbmVyYXJJbmZvUHJvbW9jaW9uZXNQcm9jZXNhZGFzKG9Qcm9tb2Npb25Qcm9jZXNhZGEsIDApO1xyXG4gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIG9NM1BEaW5hbWljYXMgPSBuZXcgTTNQRGluYW1pY2FzKCk7XHJcbiAgICAgICAgICAgIG9NM1BEaW5hbWljYXMgPSB0aGlzLkNyZWF0ZVR1cGxhRGluYW1pY2EoXCJWQUxfUFJPTU9DXCIsIG9Qcm9tb2Npb25Qcm9jZXNhZGEuUHJlY2lvVG90YWxQcm9tb2Npb24udG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIk5PTUJfUFJPTU9DXCIsIGRhdGEuTk9NQlJFUylcclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MubE0zUERpbmFtaWNhcy5wdXNoKG9NM1BEaW5hbWljYXMpO1xyXG5cclxuICAgICAgICAgICAgb00zUERpbmFtaWNhcyA9IHRoaXMuQ3JlYXRlVHVwbGFEaW5hbWljYShcIklEX1BST01PQ1wiLCBkYXRhLklEKVxyXG4gICAgICAgICAgICBvTTNQcm9jZXNvcy5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy8vT2J0aWVuZSBlbCBwcm9jZXNvIGFzb3NpYWRvIGEgdW4gaWRwcmVzdGFtb3NcclxuICAgIGFzeW5jIGdldF9tM19wcm9jZXNvX2J5X2lkX3ByZXN0YW1vX2FzeW5jKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkX2thdGlvczogc3RyaW5nLCBpZF9wcmVzdGFtbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBQb3N0U2VydmljZU0zLmdldE0zKCdNMy9nZXRNM1Byb2Nlc29CeUlkUHJlc3RhbW8vJyArIGlkX2thdGlvcyArICcvJyArIGlkX3ByZXN0YW1vKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gcmVzcDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q29uY2VwdG9NM1NhbGRvc0l0ZW1VYihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgakRhdGE6IGFueSkge1xyXG4gICAgICAgIHZhciByZXNwO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwID0gYXdhaXQgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNMy9HZXRDb25jZXB0b00zU2FsZG9zSXRlbVViLycgKyBzSURLYXRpb3MsIGpEYXRhKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWdyZWdhIG8gbW9kaWZpY2EgbGEgY2FudGlkYWQgZGUgdW4gb2JqZXRvIE0zT3RDbGFzaWZpY2FjaW9uZXMgZGVudHJvIGRlbGEgbGlzdGEgZGUgdW4gUHJvY2Vzb1xyXG4gICAgICogQHBhcmFtIHByb2R1Y3QgXHJcbiAgICAgKiBAcGFyYW0gY2FudGlkYWQgXHJcbiAgICAgKiBAcGFyYW0gaW9NM1Byb2Nlc29zIFxyXG4gICAgICogQHBhcmFtIGZ1bmNpb25PSyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZFByb2R1Y3RvVG9PdHJhc0NsYXMocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBjYW50aWRhZDogbnVtYmVyLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MsIGZ1bmNpb25PSzogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MgPSBpb00zUHJvY2Vzb3M7XHJcbiAgICAgICAgdmFyIG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzO1xyXG4gICAgICAgIHZhciBwcm9kdWN0VW5pdFNlbGVjdGVkOiBNM1ByZEdlbmVyYWw7XHJcbiAgICAgICAgcHJvZHVjdFVuaXRTZWxlY3RlZCA9IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF07XHJcblxyXG4gICAgICAgIGxldCBwcm9kdWN0b0V4aXN0ZSA9IHRoaXMudmFsaWRhckV4aXN0YU90cmFDbGFzaWYob00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcywgcHJvZHVjdCk7XHJcbiAgICAgICAgaWYgKHByb2R1Y3RvRXhpc3RlKSB7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkID0gcHJvZHVjdG9FeGlzdGUuQ2FudGlkYWQgKyBjYW50aWRhZDtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuVmFsb3IgPSArYmlnRGVjaW1hbC5tdWx0aXBseShwcm9kdWN0VW5pdFNlbGVjdGVkLkxvTTNQcmRMaXN0YS5QUkVDSU8sIHByb2R1Y3RvRXhpc3RlLkNhbnRpZGFkKTtcclxuICAgICAgICAgICAgcHJvZHVjdG9FeGlzdGUuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzID0gbmV3IE0zT3RDbGFzaWZpY2FjaW9uZXMoKTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuQ2FudGlkYWQgPSBjYW50aWRhZDtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuSWRQcm9kdWN0byA9IHByb2R1Y3RVbml0U2VsZWN0ZWQuU0tVO1xyXG4gICAgICAgICAgICBvTTNPdENsYXNpZmljYWNpb25lcy5Ob21icmUgPSBwcm9kdWN0VW5pdFNlbGVjdGVkLk5PTUJSRTE7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLlZhbG9yID0gK2JpZ0RlY2ltYWwubXVsdGlwbHkocHJvZHVjdFVuaXRTZWxlY3RlZC5Mb00zUHJkTGlzdGEuUFJFQ0lPLCBjYW50aWRhZCk7XHJcbiAgICAgICAgICAgIG9NM090Q2xhc2lmaWNhY2lvbmVzLklEID0gdGhpcy5HZXRNYXhBdHJpYnV0b0Zyb21MaXN0YShvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLCBcIklEXCIpICsgMTtcclxuICAgICAgICAgICAgb00zT3RDbGFzaWZpY2FjaW9uZXMuT3JkZW4gPSB0aGlzLkdldE1heEF0cmlidXRvRnJvbUxpc3RhKG9NM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXMsIFwiT3JkZW5cIikgKyAxO1xyXG5cclxuICAgICAgICAgICAgb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5wdXNoKG9NM090Q2xhc2lmaWNhY2lvbmVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIGZ1bmNpb25PSyhvTTNQcm9jZXNvcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbGltaW5hIHVuIG9iamV0byBNM090Q2xhc2lmaWNhY2lvbmVzIHBvbmllbmRvIHN1IHZhbG9yIHkgY2FudGlkYWQgZW4gY2Vyb1xyXG4gICAgICogQHBhcmFtIG9NM090Q2xhc2lmaWNhY2lvbmVzIFxyXG4gICAgICogQHBhcmFtIGlvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZGVsZXRlUHJvZHVjdG9Gcm9tT3RyYXNDbGFzKG9NM090Q2xhc2lmaWNhY2lvbmVzOiBNM090Q2xhc2lmaWNhY2lvbmVzLCBpb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBNM1Byb2Nlc29zIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9BY3R1YWwgPSBpb00zUHJvY2Vzb3MuTTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9NM090Q2xhc2lmaWNhY2lvbmVzLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0b0FjdHVhbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0b0FjdHVhbC5DYW50aWRhZCA9IDA7XHJcbiAgICAgICAgICAgIHByb2R1Y3RvQWN0dWFsLlZhbG9yID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW9NM1Byb2Nlc29zID0gdGhpcy5yZWNhbGN1bGFyVmFsT3RyYUNsYXNpTTNQcm9jZXNvcyhpb00zUHJvY2Vzb3MpO1xyXG4gICAgICAgIHJldHVybiBpb00zUHJvY2Vzb3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNhbGN1bGEgZWwgdmFsb3IgZGUgTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgYSBwYXJ0aXIgZGUgbGEgc3VtYXRvcmlhIGRlIGxvcyBvYmpldG9zIGRlbnRybyBkZWwgYXJyZWdsbyBNM1Byb2Nlc29zLk0zT3RDbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgcmVjYWxjdWxhclZhbE90cmFDbGFzaU0zUHJvY2Vzb3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBvTTNQcm9jZXNvcy5WYWxPdHJhQ2xhc2kgPSBvTTNQcm9jZXNvcy5NM090Q2xhc2lmaWNhY2lvbmVzLnJlZHVjZShmdW5jdGlvbiAoc3VtYSwgb00zT3RDbGFzaWZpY2FjaW9uZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN1bWEgKyBvTTNPdENsYXNpZmljYWNpb25lcy5WYWxvcjtcclxuICAgICAgICB9LCAwKVxyXG4gICAgICAgIHJldHVybiBvTTNQcm9jZXNvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBsYSBleGlzdGVuY2lhIGRlIHVuIHByb2R1Y3RvIGRlbnRybyBkZSB1biBsYSBsaXN0YSBkZSBNM090Q2xhc2lmaWNhY2lvbmVzXHJcbiAgICAgKiBAcGFyYW0gbGlzdE0zT3RDbGFzaWZpY2FjaW9uZXMgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBcclxuICAgICAqL1xyXG4gICAgdmFsaWRhckV4aXN0YU90cmFDbGFzaWYobGlzdE0zT3RDbGFzaWZpY2FjaW9uZXM6IEFycmF5PE0zT3RDbGFzaWZpY2FjaW9uZXM+LCBwcm9kdWN0OiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICBsZXQgcHJvZHVjdG9FeGlzdGUgPSBsaXN0TTNPdENsYXNpZmljYWNpb25lcy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uU0tVKTtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdG9FeGlzdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICogTGltcGlhIGxvcyBkZXRhbGxlcyB5IGxvcyBpbXB1ZXN0b3MgZGUgdW4gcHJvZHVjdG8gZGFkbyBlbiB1biBwcm9jZXNvIGRlIGRldm9sdWNpb25cclxuICAgKiBAcGFyYW0gcHJvZHVjdG9Cb3JyYWRvIFxyXG4gICAqIEBwYXJhbSBwcm9jZXNvRGV2b2x1Y2lvbiBcclxuICAgKi9cclxuICAgIGRlbGV0ZVByZERldm9sdWNpb24ocHJvZHVjdG9Cb3JyYWRvLCBwcm9jZXNvRGV2b2x1Y2lvbjogTTNQcm9jZXNvcykge1xyXG4gICAgICAgIGxldCBwcm9kdWN0byA9IHByb2Nlc29EZXZvbHVjaW9uLk0zRU5DLmZpbmQoeCA9PiB4LklkUHJvZHVjdG8gPT0gcHJvZHVjdG9Cb3JyYWRvLklkUHJvZHVjdG8pO1xyXG4gICAgICAgIGlmIChwcm9kdWN0bykge1xyXG4gICAgICAgICAgICBwcm9kdWN0by5NM0RFVC5mb3JFYWNoKGRldCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKCtkZXQuVmFsb3IpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0LlZhbG9yID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcHJvZHVjdG8uTTNQSW1wdWVzdG9zLmZvckVhY2goaW1wID0+IHtcclxuICAgICAgICAgICAgICAgIGltcC5WYWxvciA9IDA7XHJcbiAgICAgICAgICAgICAgICBpbXAuQmFzZSA9IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFqdXN0YSBsb3MgVmFsb3JlcyBlbiBjYXNvIGRlIGVuY29udHJhciBkaWZlcmVuY2lhcyBwYXJhIHBvZGVyIGdlbmVyYXIgRkVcclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgYWp1c3RhZG9yVmFsb3Jlc0NGRElGcm9udChvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IE0zUHJvY2Vzb3Mge1xyXG4gICAgICAgIGxldCBkaWZlcmVuY2lhID0gMDtcclxuICAgICAgICBsZXQgdG90YWxEZXNjdWVudG9zID0gdGhpcy5nZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA9IHRoaXMuZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3MpO1xyXG5cclxuICAgICAgICBkaWZlcmVuY2lhID0gdGhpcy5vTWF0aFRGLnJvdW5kKG9NM1Byb2Nlc29zLlZhbG9yTmV0byAtIChvTTNQcm9jZXNvcy5WYWxvciArIHRvdGFsSW1wb3J0ZUltcHVlc3RvcyAtIHRvdGFsRGVzY3VlbnRvcyksIDMpO1xyXG4gICAgICAgIGlmIChkaWZlcmVuY2lhICE9IDApIHtcclxuICAgICAgICAgICAgaWYgKHRvdGFsSW1wb3J0ZUltcHVlc3RvcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWp1c3RhZG9ySW1wdWVzdG9zQ0ZESShkaWZlcmVuY2lhLCBvTTNQcm9jZXNvcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWEsIG9NM1Byb2Nlc29zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9NM1Byb2Nlc29zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBlbCB2YWxvciB0b3RhbCBkZSBwcm9tb2Npb25lcyBhcGxpY2FkYXMgZW4gZWwgcHJvY2VzbyBlbiBjdWVzdGnDg8KzblxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBnZXRWYWxvclRvdGFsRGVzY3VlbnRvcyhvTTNQcm9jZXNvczogTTNQcm9jZXNvcyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHRvdGFsRGVzY3VlbnRvcyA9IDA7XHJcbiAgICAgICAgb00zUHJvY2Vzb3MuTTNFTkMuZm9yRWFjaChlbmMgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZGV0YWxsZVByb21vID0gZW5jLk0zREVULmZpbmQoeCA9PiB4Lk5vbWJyZUNvbmNlcHRvID09IFwiVE9UQUxQUk9NT1wiKTtcclxuICAgICAgICAgICAgaWYgKGRldGFsbGVQcm9tbykge1xyXG4gICAgICAgICAgICAgICAgdG90YWxEZXNjdWVudG9zICs9ICtkZXRhbGxlUHJvbW8uVmFsb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvdGFsRGVzY3VlbnRvcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgZWwgdmFsb3IgdG90YWwgZGUgaW1wdWVzdG9zIGNvYnJhZG9zIGVuIGVsIHByb2Nlc28gZW4gY3Vlc3Rpw4PCs25cclxuICAgICAqIEBwYXJhbSBvTTNQcm9jZXNvcyBcclxuICAgICAqL1xyXG4gICAgZ2V0VmFsb3JUb3RhbEltcG9ydGVJbXB1ZXN0b3Mob00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgPSAwO1xyXG4gICAgICAgIG9NM1Byb2Nlc29zLk0zRU5DLmZvckVhY2goZW5jID0+IHtcclxuICAgICAgICAgICAgZW5jLk0zUEltcHVlc3Rvcy5mb3JFYWNoKGltcCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbEltcG9ydGVJbXB1ZXN0b3MgKz0gK2ltcC5WYWxvcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b3RhbEltcG9ydGVJbXB1ZXN0b3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBpbXB1ZXN0byBlbiAwLjAxIHkgc3UgY29ycmVzcG9uZGllbnRlIGJhc2UgcGFyYSBxdWUgY3VhZHJlIGxvcyB2YWxvcmVzIGFsIHRpbWJyYXIgbGEgRkVcclxuICAgICAqIEBwYXJhbSBkaWZlcmVuY2lhIFxyXG4gICAgICogQHBhcmFtIG9NM1Byb2Nlc29zIFxyXG4gICAgICovXHJcbiAgICBhanVzdGFkb3JJbXB1ZXN0b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgYWp1c3RvID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgZW5jIG9mIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGltcCBvZiBlbmMuTTNQSW1wdWVzdG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlmZXJlbmNpYSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpbXAuVmFsb3IgPSBpbXAuVmFsb3IgKyAwLjAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wLlZhbG9yID0gaW1wLlZhbG9yIC0gMC4wMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGltcC5CYXNlID0gaW1wLlZhbG9yIC8gaW1wLlBvcmNlbnRhamU7XHJcbiAgICAgICAgICAgICAgICBhanVzdG8gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFqdXN0bykge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWV2ZSBlbCB2YWxvciBkZSB1biBkZXNjdWVudG8gZW4gMC4wMSBwYXJhIHF1ZSBjdWFkcmUgbG9zIHZhbG9yZXMgYWwgdGltYnJhciBsYSBGRVxyXG4gICAgICogQHBhcmFtIGRpZmVyZW5jaWEgXHJcbiAgICAgKiBAcGFyYW0gb00zUHJvY2Vzb3MgXHJcbiAgICAgKi9cclxuICAgIGFqdXN0YWRvckRlc2N1ZW50b3NDRkRJKGRpZmVyZW5jaWE6IG51bWJlciwgb00zUHJvY2Vzb3M6IE0zUHJvY2Vzb3MpIHtcclxuICAgICAgICBsZXQgZGV0YWxsZVRvdGFsUHJvbW86IE0zUERldGFsbGVJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBlbmMgb2Ygb00zUHJvY2Vzb3MuTTNFTkMpIHtcclxuICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8gPSBlbmMuTTNERVQuZmluZCh4ID0+IHguTm9tYnJlQ29uY2VwdG8gPT0gXCJUT1RBTFBST01PXCIpO1xyXG4gICAgICAgICAgICBpZiAoZGV0YWxsZVRvdGFsUHJvbW8gJiYgK2RldGFsbGVUb3RhbFByb21vLlZhbG9yID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmVyZW5jaWEgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWxsZVRvdGFsUHJvbW8uVmFsb3IgPSAoK2RldGFsbGVUb3RhbFByb21vLlZhbG9yIC0gMC4wMSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFsbGVUb3RhbFByb21vLlZhbG9yID0gKCtkZXRhbGxlVG90YWxQcm9tby5WYWxvciArIDAuMDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJkc0dlbmVyYWxGcm9tTTNQcm9jZXNvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJZEthdGlvczogc3RyaW5nLCBqRGF0YTogYW55LFxyXG4gICAgICAgIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zL2dldFByZHNHZW5lcmFsRnJvbU0zUHJvY2Vzby8nICsgc0lkS2F0aW9zLCBqRGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVyci5lcnJvci5NZXNzYWdlKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVHJ4IHtcclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGVsIGRpYXJpbyBkZSB0cmFuc2FjY2lvbmVzIGRlc2RlIHNlcnZpY2lvIHJlc3QgTTNUcnguIE1pY3Jvc2VydmljaW8gTTMuXHJcbiAgICBwdWJsaWMgTTNfR2V0RGlhcmlvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9NM19HZXREaWFyaW8vJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YURpYXJpbztcclxuICAgICAgICAgICAgb0RhdGFEaWFyaW8gPSByZXNwO1xyXG4gICAgICAgICAgICBpZiAob0RhdGFEaWFyaW8uUkVTUFVFU1RBLmRhdGEubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhID0gbmV3IEFycmF5KG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgZXJyb3JcclxuICAgICAgICAgICAgICAgIG9GdW5jaW9uRXJyKGVyci5lcnJvci5NZXNzYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIGRpYXJpbyBkZSB0cmFuc2FjY2lvbmVzIGRldGFsbGFkb1xyXG4gICAgICogQHBhcmFtIFBvc3RTZXJ2aWNlTTMgXHJcbiAgICAgKiBAcGFyYW0gc0lES2F0aW9zIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtM19nZXREaWFyaW9UcngoUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKCdNM1RyeC9tM19nZXREaWFyaW9UcngvJyArIHNJREthdGlvcywgZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFEaWFyaW87XHJcbiAgICAgICAgICAgIG9EYXRhRGlhcmlvID0gcmVzcDtcclxuICAgICAgICAgICAgaWYgKG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIG9EYXRhRGlhcmlvLlJFU1BVRVNUQS5EaWFyaW8gPSBuZXcgQXJyYXkob0RhdGFEaWFyaW8uUkVTUFVFU1RBLkRpYXJpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb0Z1bmNpb25PSyhyZXNwKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSB0cmFuc2FjY2lvbi5cclxuICAgIHB1YmxpYyBNM19HZXRJbmZvVFJYKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBvRGF0YVNlbmQ6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgIC8vbGV0IGRhdGEgPSB7ICdUb3AnOiB0b3AgfTtcclxuICAgICAgICBQb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoJ00zVHJ4L00zX0dldEluZm9UUlgvJyArIHNJREthdGlvcywgb0RhdGFTZW5kKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vRWplY3V0YXIgZnVuY2lvbiBkZSBwcm9jZXNhbWllbnRvIE9LXHJcbiAgICAgICAgICAgIHZhciBvRGF0YVRSWDtcclxuICAgICAgICAgICAgb0RhdGFUUlggPSByZXNwO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgb0RhdGFUUlguUkVTUFVFU1RBLlRJUE9TID0gbmV3IEFycmF5KG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG9EYXRhVFJYLlJFU1BVRVNUQS5USVBPUy5mb3JFYWNoKHRpcG8gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpcG8uVFJYLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGlwby5UUlggPSBuZXcgQXJyYXkodGlwby5UUlgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKG9EYXRhVFJYKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuZXJyb3IuTWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfS8vRW5kIFxyXG5cclxuXHJcblxyXG4gICAgLy9DYW1iaW8gZGUgZXN0YWRvIGRlIHViaWNhY2lvblxyXG4gICAgcHVibGljIENhbWJpb0VzdGFkb1ViaWNhY2lvbihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb00zVWJpY2FjaW9uOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNUcngvQ2FtYmlvRXN0YWRvVWJpY2FjaW9uLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcblxyXG4gICAgLy9DYW1iaW8gZGUgZXN0YWRvIGRlIEhVQlxyXG4gICAgcHVibGljIENhbWJpb0VzdGFkb0h1YihQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBzSURLYXRpb3M6IHN0cmluZywgb00zVWJpY2FjaW9uOiBhbnksXHJcbiAgICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbikge1xyXG5cclxuICAgICAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMygnTTNUcngvQ2FtYmlvRXN0YWRvSHViLycgKyBzSURLYXRpb3MsIG9NM1ViaWNhY2lvbikuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL0VqZWN1dGFyIGZ1bmNpb24gZGUgcHJvY2VzYW1pZW50byBPS1xyXG4gICAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICAgICAgLy9FamVjdXRhciBmdW5jaW9uIGRlIGVycm9yXHJcbiAgICAgICAgICAgICAgICBvRnVuY2lvbkVycihlcnIuX2JvZHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0vL0VuZCBcclxuXHJcbn0iLCJpbXBvcnQgeyBUeXBlTTNQcmRHcnAgfSBmcm9tIFwiLi4vTWFlc3Ryby9NM1ByZEdycC50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb3N0U2VydmljZU0zIH0gZnJvbSBcIi4uLy4uL0NvbmV4aW9uU1FML3Bvc3RzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTTNQcmVjTGlzdFByZWNpb3MgfSBmcm9tIFwiLi4vTWFlc3Ryby9tMy1wcmVjLWxpc3QtcHJlY2lvcy50eXBlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZUxpc3RhUHJlY2lvIHtcclxuXHJcbiAgICBwcml2YXRlIGdvRGF0YTogYW55O1xyXG4gICAgcHJpdmF0ZSBnc0lkS2F0aW9zOiBhbnk7XHJcbiAgICBwcml2YXRlIGxQcmVjaW9zU2VsZWN0ZWQ6IHN0cmluZyA9IFwiLTFcIjtcclxuXHJcbiAgICAvL0dlbmVyYXIgSlNPTiBnZW7Dg8KpcmljbywgcGFyYSB2YWxpZGFyIGxhIGxpc3RhIGRlIHByZWNpb1xyXG4gICAgY29uc3RydWN0b3IobG9nZWRfdXNlcjogYW55LCBzSWRQcm9jZXNvOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBvRGF0YSA9IHsgXCJVU0VSXCI6IGxvZ2VkX3VzZXIsIFwiUHJvY2Vzb1wiOiBzSWRQcm9jZXNvIH1cclxuICAgICAgICB0aGlzLmdvRGF0YSA9IG9EYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0TGlzdGFQcmVjaW9zKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmdzSWRLYXRpb3MgPSBJZEthdGlvcztcclxuICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgdmFyIG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcztcclxuICAgICAgICAgICAgb0xpc3RQcmVjTFAgPSB0aGlzLkdldExQcmVjaW9zSW5TdG9yYWdlKElkS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYoIW9MaXN0UHJlY0xQKXtcclxuICAgICAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uTTNHRVRfTElTVEFQUkVDSU9TX0FTeW5jKFBvc3RTZXJ2aWNlTTMsIElkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2F2ZUxQcmVjaW9zSW5TdG9yYWdlKG9MaXN0UHJlY0xQLElkS2F0aW9zKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLlZhbGlkYXJBUExSZWdsYShvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxQcmVjaW9zU2VsZWN0ZWQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MsIEpTT04uc3RyaW5naWZ5KGxQcmVjaW8pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYXIgbGEgbGlzdGEgZGUgcHJlY2lvcyB0ZW5pZW5kbyBlbiBjdWVudGEgbGEgbGxhdmU6IFJlZ1ByZWNpbyArIGlka2F0aW9zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBTYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2UobFByZWNpbzphbnksIGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhsUHJlY2lvKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiQ29uZmlnTFBcIiArIGdzSWRrYXRpb3MsIGxQcmVjaW8pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKipcclxuICAgICAqIE9idGVuZXIgbGlzdGEgZGUgcHJlY2lvcyBkZXNkZSBzdG9yYWdlIHRlbmllbmRvIGVuIGN1ZW50YSBsYSBsbGF2ZTogUmVnUHJlY2lvICsgaWRrYXRpb3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdldExQcmVjaW9zSW5TdG9yYWdlKGdzSWRrYXRpb3M6IHN0cmluZyl7XHJcbiAgICAgICAgdmFyIHNQcmVjaW9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSZWdQcmVjaW9cIiArIGdzSWRrYXRpb3MpO1xyXG4gICAgICAgIHZhciBvUHJlY2lvczphbnk7XHJcbiAgICAgICAgaWYoc1ByZWNpb3Mpe1xyXG4gICAgICAgICAgICBvUHJlY2lvcyA9IEpTT04ucGFyc2Uoc1ByZWNpb3MpO1xyXG4gICAgICAgICAgICByZXR1cm4gb1ByZWNpb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShnc0lka2F0aW9zOiBzdHJpbmcpe1xyXG4gICAgICAgIHZhciBzUHJlY2lvcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdMUFwiICsgZ3NJZGthdGlvcyk7XHJcbiAgICAgICAgdmFyIG9QcmVjaW9zOmFueTtcclxuICAgICAgICBpZihzUHJlY2lvcyl7XHJcbiAgICAgICAgICAgIG9QcmVjaW9zID0gSlNPTi5wYXJzZShzUHJlY2lvcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvUHJlY2lvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy9CdXN1Y2FyIGxhIGxpc3RhIGRlIHByZWNpbywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgRmluZExQcmVjaW8ob0xpc3RQcmVjTFA6IE0zUHJlY0xpc3RQcmVjaW9zKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQgJiYgb0xpc3RQcmVjTFAgIT0gbnVsbCAmJiBvTGlzdFByZWNMUC5JRCAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLklEICE9IG51bGwpIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChvTGlzdFByZWNMUC5QUkVDRURFTkNJQSAhPT0gdW5kZWZpbmVkICYmIG9MaXN0UHJlY0xQLlBSRUNFREVOQ0lBICE9IG51bGwgJiYgb0xpc3RQcmVjTFAuUFJFQ0VERU5DSUEubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJlYyBvZiBvTGlzdFByZWNMUC5QUkVDRURFTkNJQSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVmFsaWRhckFQTFJlZ2xhKHByZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5GaW5kTFByZWNpbyhwcmVjKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9WYWxpZGFyIHJlZ2xhcywgaW5ncmVzYSBlbCBvYmpldG8gZGUgcHJlY2VuZGVuY2lhIGRlIHJlZ2xhcyBkZSBsaXN0YSBkZSBwcmVjaW9zXHJcbiAgICBwdWJsaWMgVmFsaWRhckFQTFJlZ2xhKG9MaXN0UHJlY0xQOiBNM1ByZWNMaXN0UHJlY2lvcyk6IGJvb2xlYW57XHJcbiAgICAgICAgdmFyIGJSZXNwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9MaXN0UHJlY0xQICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhvTGlzdFByZWNMUC5Qcm9waWVkYWQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvTGlzdFByZWNMUC5Qcm9waWVkYWQudG9VcHBlckNhc2UoKS50cmltKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRU1QUkVTQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdzSWRLYXRpb3MudG9TdHJpbmcoKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVCSUNBQ0lPTlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLlVCSUNBQ0lPTi50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlBST0NFU09cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSB0aGlzLkNvbXBhcmUob0xpc3RQcmVjTFAuVmFsb3IudG9TdHJpbmcoKSwgdGhpcy5nb0RhdGEuUHJvY2Vzby50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkhVQlwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hLklESFVCLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiUmVzcCA9IHRoaXMuQ29tcGFyZShvTGlzdFByZWNMUC5WYWxvci50b1N0cmluZygpLCB0aGlzLmdvRGF0YS5VU0VSLlVzdWFyaW9TaXN0ZW1hW29MaXN0UHJlY0xQLlByb3BpZWRhZC50b1VwcGVyQ2FzZSgpLnRyaW0oKV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2ggKGV4KXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogXCIgKyBleClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihiUmVzcCl7XHJcbiAgICAgICAgICAgIHRoaXMubFByZWNpb3NTZWxlY3RlZCA9IG9MaXN0UHJlY0xQLkxpc3RhUHJlY2lvcztcclxuICAgICAgICAgICAgdGhpcy5GaW5kTFByZWNpbyhvTGlzdFByZWNMUCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBiUmVzcDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIENvbXBhcmUodmFsdWUxLCB2YWx1ZTIpIHtcclxuICAgICAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT2J0ZW5lciBjb25maWd1cmFjaW9uL2VuY2FiZXphZG8gbGlzdGEgZGUgcHJlY2lvc1xyXG4gICAgcHVibGljIGFzeW5jIEdldENvbmZpZ0xpc3RhUHJlY2lvcyhQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBJZEthdGlvczogc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gSWRLYXRpb3M7XHJcbiAgICAgICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgICAgIHZhciBvTGlzdFByZWNMUDogTTNQcmVjTGlzdFByZWNpb3M7XHJcbiAgICAgICAgICAgIG9MaXN0UHJlY0xQID0gdGhpcy5HZXRDb25maWdMUHJlY2lvc0luU3RvcmFnZShJZEthdGlvcyk7XHJcbiAgICAgICAgICAgIGlmKCFvTGlzdFByZWNMUCl7XHJcbiAgICAgICAgICAgICAgICBvTGlzdFByZWNMUCA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldEVuY2FiZXphZG9MaXN0YXNQcmVjaW8oUG9zdFNlcnZpY2VNMywgSWRLYXRpb3MpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ29uZmlnTFByZWNpb3NJblN0b3JhZ2Uob0xpc3RQcmVjTFAsSWRLYXRpb3MpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBvTGlzdFByZWNMUDtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RpblByb2Nlc29ze1xyXG4gICAgcHVibGljIGlkX3Byb2Nlc286c3RyaW5nO1xyXG4gICAgcHVibGljIGlkX3N1Yl9wcm9jZXNvOnN0cmluZztcclxuICAgIHB1YmxpYyBpZF9kaW5hbWljYTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGlwb19kaW5hbTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgdGl0dWxvOnN0cmluZztcclxuICAgIHB1YmxpYyBlc3RydWN0dXJhX2Rlc3Rpbm86IHN0cmluZztcclxuICAgIHB1YmxpYyBWRGVmYXVsdDogc3RyaW5nO1xyXG4gICAgcHVibGljIFJlcXVlcmlkbzpib29sZWFuO1xyXG59IiwiaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1BJdGVtc1dFQiB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGV0YWxsZS1pdGVtc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUHJkUGFja0RldCB7XHJcbiAgICBwdWJsaWMgTE9URTogc3RyaW5nO1xyXG4gICAgcHVibGljIExPVEVISUpPOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgU0tVSElKTzogc3RyaW5nO1xyXG4gICAgcHVibGljIENhbnRpZGFkOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVGlwb1BhY2s6IHN0cmluZztcclxuICAgIHB1YmxpYyBnc1BhdGhJbWFnZW46IHN0cmluZztcclxuICAgIHB1YmxpYyBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCO1xyXG4gICAgcHVibGljIE0zR1JQID0gbmV3IFR5cGVNM1ByZEdycCgpO1xyXG4gICAgcHVibGljIE9yZGVuOiBudW1iZXI7XHJcbiAgICBwdWJsaWMgVmFsb3JBZGljaW9uYWw6IG51bWJlcjtcclxuICAgIHB1YmxpYyBJZEdycDogc3RyaW5nO1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM1ViaUFkaWNpb25hbGVze1xyXG4gICAgcHVibGljIEF0cmlidXRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcIi4vTTNVYmlBZGljaW9uYWxlcy50eXBlXCI7XHJcbmltcG9ydCB7IE0zSHVicyB9IGZyb20gXCIuL20zLWh1YnMudHlwZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9ue1xyXG4gICAgcHVibGljIElEVWJpY2FjaW9uOnN0cmluZztcclxuICAgIHB1YmxpYyBOb21icmU6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG9VYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIFREb2NBZG1pbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgTkRvY0FkbWluOnN0cmluZztcclxuICAgIHB1YmxpYyBKQ29uZmlndXJhY2lvbjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgU2VyaWU6c3RyaW5nO1xyXG4gICAgcHVibGljIEVzdGFkbzpudW1iZXI7XHJcbiAgICBwdWJsaWMgRG9jdW1lbnRvSUQ6c3RyaW5nO1xyXG4gICAgcHVibGljIE0zVWJpQWRpY2lvbmFsZXM6QXJyYXk8TTNVYmlBZGljaW9uYWxlcz47XHJcbiAgICBwdWJsaWMgTTNIVUJTID0gbmV3IEFycmF5PE0zSHVicz4oKTtcclxuICAgIHB1YmxpYyBGZWNoYVRyYWJham86RGF0ZTtcclxuICAgIHB1YmxpYyBBUExVYmljRXh0ZXJuYXM6Qm9vbGVhbjtcclxuICAgIFxyXG59IiwiaW1wb3J0IHsgTTNDT05ESVBST01PIH0gZnJvbSBcIi4vTTNDT05ESVBST01PLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNDT05ESUFHUlVQQUNJT057XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQWdydXBhY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb25lczpzdHJpbmc7XHJcbiAgICBwdWJsaWMgT3BlcmFkb3I6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBNM0NPTkRJUFJPTU86QXJyYXk8TTNDT05ESVBST01PPjtcclxufSIsImltcG9ydCB7IE0zREVUQ09ORElQUk9NTyB9IGZyb20gXCIuL00zREVUQ09ORElQUk9NTy5jbGFzc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zQ09ORElQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgSWRDb25kaWNpb246bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmNlcHRvOnN0cmluZztcclxuICAgIHB1YmxpYyBWYWxvcjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSkFkaWNpb25hbGVzOnN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgTTNERVRDT05ESVBST01POiBBcnJheTxNM0RFVENPTkRJUFJPTU8+O1xyXG5cclxufSIsImV4cG9ydCBjbGFzcyBNM0RFVENPTkRJUFJPTU97XHJcbiAgICBwdWJsaWMgSWRQcm9tb2Npb246bnVtYmVyO1xyXG4gICAgcHVibGljIElkQ29uZGljaW9uOm51bWJlcjtcclxuICAgIHB1YmxpYyBDb25jZXB0bzpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmFsb3I6c3RyaW5nO1xyXG4gICAgcHVibGljIEpBZGljaW9uYWxlczpzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBNM0NPTkRJQUdSVVBBQ0lPTiB9IGZyb20gXCIuL00zQ09ORElBR1JVUEFDSU9OLmNsYXNzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTTNFTkNQUk9NT3tcclxuICAgIHB1YmxpYyBJZFByb21vY2lvbjpudW1iZXI7XHJcbiAgICBwdWJsaWMgTm9tYnJlOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvOnN0cmluZztcclxuICAgIHB1YmxpYyBUaXBvMjpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVmlnZW5jaWE6RGF0ZTtcclxuICAgIHB1YmxpYyBJbmljaW86RGF0ZTtcclxuICAgIHB1YmxpYyBFc3RhZG86Ym9vbGVhbjtcclxuICAgIHB1YmxpYyBKQWRpY2lvbmFsZXM6c3RyaW5nO1xyXG5cclxuICAgIHB1YmxpYyBFc3RhZG9NYW51YWxlczpib29sZWFuID1mYWxzZTtcclxuICAgIHB1YmxpYyBFc01hbnVhbDpib29sZWFuPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgRXN0YWRvQXBsQ3Vwb246Ym9vbGVhbiA9ZmFsc2U7XHJcbiAgICBwdWJsaWMgRXNBcGxDdXBvbjpib29sZWFuPSBmYWxzZTtcclxuICAgIHB1YmxpYyBUb3BlOm51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgTTNDT05ESUFHUlVQQUNJT046QXJyYXk8TTNDT05ESUFHUlVQQUNJT04+O1xyXG59IiwiaW1wb3J0IHsgTTNVYmljYWNpb24gfSBmcm9tIFwiLi4vTWFlc3Ryby9VYmljYWNpb24vTTNVYmljYWNpb24udHlwZVwiO1xyXG5pbXBvcnQgeyBNM1ViaUFkaWNpb25hbGVzIH0gZnJvbSBcInByb2plY3RzL3JlZ2xhbmVnb2Npb20zMS9zcmMvcHVibGljX2FwaVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zVWJpY2FjaW9uU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBnb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbjtcclxuICAgIGNvbnN0cnVjdG9yKG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24pIHtcclxuICAgICAgICB0aGlzLmdvTTNVYmljYWNpb24gPSBvTTNVYmljYWNpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldERpcmVjY2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiRElSRUNDSU9OXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRUZWxlZm9ubygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiVEVMRUZPTk9cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0QWRpY2lvbmFyQnlBdHJpYnV0ZShcIkxPTkdcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExhdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRBZGljaW9uYXJCeUF0cmlidXRlKFwiTEFUXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEFkaWNpb25hckJ5QXRyaWJ1dGUoQXRyaWJ1dG86IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvQWRpY2lvbmFsOiBNM1ViaUFkaWNpb25hbGVzID0gdGhpcy5nb00zVWJpY2FjaW9uLk0zVWJpQWRpY2lvbmFsZXMuZmluZChhZGkgPT4gYWRpLkF0cmlidXRvID09IEF0cmlidXRvKTtcclxuICAgICAgICAgICAgaWYgKG9BZGljaW9uYWwgIT09IHVuZGVmaW5lZCAmJiBvQWRpY2lvbmFsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvQWRpY2lvbmFsLlZhbG9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH1jYXRjaHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IE0zUEl0ZW1zV0VCLCBNM1BEZXRhbGxlSXRlbXMgfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGRldGFsbGUtaXRlbXNcIjtcclxuaW1wb3J0IHsgVHlwZU0zUHJkR3JwIH0gZnJvbSBcIi4uL01hZXN0cm8vTTNQcmRHcnAudHlwZVwiO1xyXG5pbXBvcnQgeyBNM1JlZ1NlcnZpY2UgfSBmcm9tIFwiLi9tMy1yZWctc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM0NvdWNoTWFlc3RybyB9IGZyb20gXCIuLi9EYXRhL20zLWNvdWNoLW1hZXN0cm9cIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VNM01hZXN0cm8gfSBmcm9tIFwiLi9NM01hZXN0cm8uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXByb2Nlc29zXCI7XHJcbmltcG9ydCB7IE0zUERpbmFtaWNhcyB9IGZyb20gXCIuLi9SZWdpc3Ryby9tMy1wZGluYW1pY2FzXCI7XHJcbmltcG9ydCB7IE0zUGVyWFByb2Nlc28gfSBmcm9tIFwiLi4vUmVnaXN0cm8vbTMtcGVyLXgtcHJvY2Vzb1wiO1xyXG5pbXBvcnQgeyBNM1ViaWNhY2lvbiB9IGZyb20gXCIuLi9NYWVzdHJvL1ViaWNhY2lvbi9NM1ViaWNhY2lvbi50eXBlXCI7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8gfSBmcm9tIFwiLi9tMy1sb2FkLWwtcHJlY2lvLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ291Y2hQUkRTU2VydmljZSB9IGZyb20gXCIuLi9PZmZsaW5lL2NvdWNoLXByZHMuc2VydmljZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE0zUmVnTWFzaXZvIHtcclxuXHJcbiAgICBwcml2YXRlIGdzSWRLYXRpb3M6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZGVyOiBGaWxlUmVhZGVyO1xyXG4gICAgcHJpdmF0ZSBzZXBhcmFkb3I6IHN0cmluZyA9IFwiLFwiO1xyXG4gICAgcHJpdmF0ZSBvTTNQcm9jZXNvID0gbmV3IE0zUHJvY2Vzb3MoKTtcclxuICAgIHByaXZhdGUgcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHByaXZhdGUgQ29uZk1hc2l2YTogYW55O1xyXG4gICAgcHVibGljIHJvdW5kZWRfcHJvZ3Jlc3M6IG51bWJlcjtcclxuICAgIHB1YmxpYyBnYkJhckNvZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKGlzSWRLYXRpb3M6IHN0cmluZywgaW9NM1Byb2Nlc286IE0zUHJvY2Vzb3MsIGlDb25mTWFzaXZhOiBhbnksIGliQmFyY29kZTogYm9vbGVhbixcclxuICAgICAgICBwcml2YXRlIG9Db3VjaFBSRFNTZXJ2aWNlOiBDb3VjaFBSRFNTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gaW9NM1Byb2Nlc287XHJcbiAgICAgICAgdGhpcy5nc0lkS2F0aW9zID0gaXNJZEthdGlvcztcclxuICAgICAgICB0aGlzLkNvbmZNYXNpdmEgPSBpQ29uZk1hc2l2YTtcclxuICAgICAgICB0aGlzLmdiQmFyQ29kZSA9IGliQmFyY29kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0X3JvdW5kZWRfcHJvZ3Jlc3MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm91bmRlZF9wcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvLy9BZGljaW9uYXIgcHJvZHVjdG9zIGVuIG1hc2l2b1xyXG4gICAgcHVibGljIGFzeW5jIEFkaWNpb25hck1hc2l2byhvTTNDb3VjaE1hZXN0cm86IE0zQ291Y2hNYWVzdHJvLCBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zLCBvRGF0VXNlcjogYW55LCBvRGF0YVByb2M6IGFueSwgb00zVWJpY2FjaW9uOiBNM1ViaWNhY2lvbiA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLkdldFJlYWRlcihvRGF0YVByb2MpO1xyXG4gICAgICAgIGxldCBjc3Y6IHN0cmluZztcclxuICAgICAgICBpZiAoIXRoaXMucmVhZGVyKSB7XHJcbiAgICAgICAgICAgIGNzdiA9IG9EYXRhUHJvYy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3N2ID0gdGhpcy5yZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBjc3Yuc3BsaXQoXCJcXG5cIik7XHJcblxyXG4gICAgICAgIHZhciBwcm9jZXNvOiBbTTNQcm9jZXNvcywgc3RyaW5nXSA9IGF3YWl0IHRoaXMuYWRpY2lvbmFyX21hc2l2b19mcm9tX2FycmF5KG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgb0RhdFVzZXIsIGFyckNTViwgb00zVWJpY2FjaW9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc287XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNvcnJlIHkgYWRpY2lvbmEgbG9zIHByb2R1Y3RvcyBlbiB1biBhcnJheSBhIHVuIHByb2Nlc29cclxuICAgICAqIEBwYXJhbSBvTTNDb3VjaE1hZXN0cm8gXHJcbiAgICAgKiBAcGFyYW0gUG9zdFNlcnZpY2VNMyBcclxuICAgICAqIEBwYXJhbSBvRGF0VXNlciBcclxuICAgICAqIEBwYXJhbSBhcnJDU1YgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBhZGljaW9uYXJfbWFzaXZvX2Zyb21fYXJyYXkob00zQ291Y2hNYWVzdHJvOiBNM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMzogUG9zdFNlcnZpY2VNMywgb0RhdFVzZXI6IGFueSwgYXJyQ1NWOiBBcnJheTxzdHJpbmc+LCBvTTNVYmljYWNpb246IE0zVWJpY2FjaW9uID0gbnVsbCwgYXBsRXhjOiBzdHJpbmcgPSBcIjBcIikge1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSBhcnJDU1YubGVuZ3RoO1xyXG4gICAgICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICAgICAgdmFyIHByb2R1Y3Q6IFR5cGVNM1ByZEdycFxyXG4gICAgICAgIHZhciBvU2VydmljZU0zTWFlc3RybyA9IG5ldyBTZXJ2aWNlTTNNYWVzdHJvKCk7XHJcbiAgICAgICAgdmFyIG9NM1JlZ1NlcnZpY2UgPSBuZXcgTTNSZWdTZXJ2aWNlKG9NM0NvdWNoTWFlc3RybywgUG9zdFNlcnZpY2VNMywgdGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICB2YXIgcHJkc0ZhaWxzOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCBwcmRmYWlsYWN0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogYW55O1xyXG4gICAgICAgIGxldCBhcnJheVJlc3A6IFtNM1Byb2Nlc29zLCBzdHJpbmddID0gW3RoaXMub00zUHJvY2VzbywgXCJcIl07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGxpbmU6IHN0cmluZyA9IGFyckNTVltpXTtcclxuICAgICAgICAgICAgaWYgKGxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTVjtcclxuICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWID0gdGhpcy5TZXRFc3RydWN0Q1NWKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2JCYXJDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcImZ1ZSBsb2NhbDogXCIgKyBvZXN0cnVjdENTVi5za3UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9Db3VjaFBSRFNTZXJ2aWNlLmdldChvZXN0cnVjdENTVi5za3UpLnRoZW4oYXN5bmMgcHJkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJvYnR1dm8gbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKHByZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvID0gbmV3IFNlcnZpY2VMb2FkTGlzdGFQcmVjaW8odGhpcy5nc0lkS2F0aW9zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9TZXJ2aWNlTG9hZExpc3RhUHJlY2lvLkFzaWduYXJMaXN0YVByZWNpbyhwcmQuTGlzdENvZHMsIG9EYXRVc2VyLCBQb3N0U2VydmljZU0zKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJhc2lnbm8gbHAgbG9jYWxcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhwcmQuTGlzdENvZHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBwcmQuTGlzdENvZHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFzeW5jIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBscCAtIGludGVudG8gc2VydmVyOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0geyBcImlkX3ViaWNhY2lvblwiOiBvRGF0VXNlci5Vc3VhcmlvU2lzdGVtYS5VQklDQUNJT04sIFwiQ29kaWdvXCI6IG9lc3RydWN0Q1NWLnNrdSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gYXdhaXQgb1NlcnZpY2VNM01hZXN0cm8uR2V0X00zUHJvZHVjdG9Fc3BlY0J5Q29kZUFzeW5jKFBvc3RTZXJ2aWNlTTMsIHRoaXMuZ3NJZEthdGlvcywgZGF0YSwgb0RhdFVzZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGNhdGNoIGxwOiBcIiArIG9lc3RydWN0Q1NWLnNrdSArIFwiOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyck1zZzogc3RyaW5nID0gZXJyLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJkRmFpbCA9IGVyck1zZy5zdWJzdHJpbmcoZXJyTXNnLmluZGV4T2YoXCJDb2RpZ29cIikgKyA3KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmRzRmFpbHMgKz0gcHJkRmFpbCArIFwiLFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZGZhaWxhY3R1YWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcob00zVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKG9NM1ViaWNhY2lvbiAmJiBvTTNVYmljYWNpb24uSURVYmljYWNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvTTNVYmljYWNpb24gJiYgb00zVWJpY2FjaW9uLklEVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbi5JRFViaWNhY2lvbiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBhd2FpdCBvU2VydmljZU0zTWFlc3Ryby5NM0dldFByb2R1Y3RvQnlTS1VBc3luYyhQb3N0U2VydmljZU0zLCB0aGlzLmdzSWRLYXRpb3MsIG9lc3RydWN0Q1NWLnNrdSwgb0RhdFVzZXIsIFwiLTFcIiwgYXBsRXhjKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhwcm9kdWN0KTtcclxuICAgICAgICAgICAgICAgIGlmICghcHJkZmFpbGFjdHVhbCAmJiBwcm9kdWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQcmVjaW9TaUFQbGljYShwcm9kdWN0LCBvZXN0cnVjdENTVik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5BZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0LCBvZXN0cnVjdENTViwgb00zUmVnU2VydmljZSwgb0RhdFVzZXIsIG9NM1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvciBwcm9kdWN0IG5vIHNlIGxsZW5vOiBcIiArIG9lc3RydWN0Q1NWLnNrdSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IGNvdW50ICogMTAwIC8gdG90YWw7XHJcbiAgICAgICAgICAgIHRoaXMucm91bmRlZF9wcm9ncmVzcyA9IE1hdGgucm91bmQodGhpcy5wcm9ncmVzcyAqIDEwMCkgLyAxMDBcclxuICAgICAgICB9XHJcbiAgICAgICAgYXJyYXlSZXNwWzBdID0gdGhpcy5vTTNQcm9jZXNvO1xyXG4gICAgICAgIGFycmF5UmVzcFsxXSA9IHByZHNGYWlscztcclxuICAgICAgICByZXR1cm4gYXJyYXlSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vQ2FtYmlhciBwcmVjaW8gZGUgcHJvZHVjdG8uXHJcbiAgICBwdWJsaWMgc2V0UHJlY2lvU2lBUGxpY2EocHJvZHVjdDogVHlwZU0zUHJkR3JwLCBvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIGlmIChvZXN0cnVjdENTVi5wcmVjaW8gIT09IE5hTiAmJiBvZXN0cnVjdENTVi5wcmVjaW8gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBwcm9kdWN0LkxvTTNQcmRHZW5lcmFsWzBdLkxvTTNQcmRMaXN0YS5QUkVDSU8gPSBvZXN0cnVjdENTVi5wcmVjaW87XHJcbiAgICAgICAgICAgIHByb2R1Y3QuTG9NM1ByZEdlbmVyYWxbMF0uTG9NM1ByZExpc3RhLk0zUHJlc2VudGFjaW9uZXMuZm9yRWFjaChvTTNQcmVzZW50YWNpb25lcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBvTTNQcmVzZW50YWNpb25lcy5WQUxPUiA9IG9lc3RydWN0Q1NWLnByZWNpbztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vQWRpY2lvbmFyIGEgbTNwcm9jZXNvLCBwcm9kdWN0byBlc3BlY2lmaWNvLCBzZSBlbnZpYSBjYW50aWRhZC5cclxuICAgIHB1YmxpYyBBZGRQcmRUb00zUHJvY2Vzbyhwcm9kdWN0OiBUeXBlTTNQcmRHcnAsIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWLCBvTTNSZWdTZXJ2aWNlOiBNM1JlZ1NlcnZpY2UsIG9EYXRVc2VyOiBhbnksIG9NM1ViaWNhY2lvbjogTTNVYmljYWNpb24gPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIG9NM1BJdGVtc1dFQiA9IG5ldyBNM1BJdGVtc1dFQigpO1xyXG4gICAgICAgIG9NM1BJdGVtc1dFQi5kQ2FudGlkYWQgPSBvZXN0cnVjdENTVi5jYW50aWRhZDtcclxuICAgICAgICBpZiAob2VzdHJ1Y3RDU1YuUGF0aEltYWdlbikge1xyXG4gICAgICAgICAgICBvTTNQSXRlbXNXRUIuUGF0aEltYWdlbiA9IG9lc3RydWN0Q1NWLlBhdGhJbWFnZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9NM1BJdGVtc1dFQiA9IG9NM1JlZ1NlcnZpY2UuTG9hZEFkaWNpb25hbGVzKG9NM1BJdGVtc1dFQiwgcHJvZHVjdCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9NM1Byb2Nlc28uTTNFTkMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgLy8vUHJpbWVyYSB2ZXogXHJcbiAgICAgICAgICAgIC8vL05PIFNFIEVTVEEgRU5WSUFORE8gSU5GT1JNQUNJT04gREUgUFJPTU9DSU9ORVNcclxuICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvID0gb00zUmVnU2VydmljZS5Mb2FkTTNQcm9jZXNvRW1wdHlQREIocHJvZHVjdCwgb00zUEl0ZW1zV0VCLCBvRGF0VXNlciwgb00zVWJpY2FjaW9uLCBudWxsLCB0aGlzLm9NM1Byb2Nlc28pO1xyXG4gICAgICAgICAgICAvL0FncmVnYXIgZGluYW1pY2FzXHJcbiAgICAgICAgICAgIHRoaXMuQWRpY2lvbmFyRGluYW1pY2Eob2VzdHJ1Y3RDU1YpO1xyXG4gICAgICAgICAgICB0aGlzLkFkaWNpb25hclBlcnNvbmFzQVByb2Nlc28ob2VzdHJ1Y3RDU1YpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBvTTNSZWdTZXJ2aWNlLkxvYWRNM1Byb2Nlc29Gcm9tRGF0YSh0aGlzLm9NM1Byb2Nlc28sIHByb2R1Y3QsIG9NM1BJdGVtc1dFQiwgb00zVWJpY2FjaW9uLCBudWxsLCBvRGF0VXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRpY2lvbmFyRGV0YWxsZShvZXN0cnVjdENTVik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgY2FwdHVyYXMgZGluYW1pY2FzXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gZGUgbGluZWEgYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJEaW5hbWljYShvZXN0cnVjdENTVjogZXN0cnVjdENTVikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBkaW5hbWljYXMgPSBvZXN0cnVjdENTVi5EaW5hbWljYXNcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW5hbWljYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQRGluYW1pY2FzID0gbmV3IE0zUERpbmFtaWNhcygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9NM1Byb2Nlc28ubE0zUERpbmFtaWNhcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzID0gbmV3IEFycmF5PE0zUERpbmFtaWNhcz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BEaW5hbWljYXMuTm9tYnJlID0gZGluYW1pY2FzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgb00zUERpbmFtaWNhcy5WYWxvciA9IGRpbmFtaWNhc1tpXS5WYWxvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMub00zUHJvY2Vzby5sTTNQRGluYW1pY2FzLnB1c2gob00zUERpbmFtaWNhcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBkaW5hbWljYVwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgcGVyc29uYXMgYSBwcm9jZXNvXHJcbiAgICAgKiBAcGFyYW0gb2VzdHJ1Y3RDU1YgRXN0cnVjdHVyYSBjb24gaW5mb3JtYWNpb24gYSBhZ3JlZ2FyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGljaW9uYXJQZXJzb25hc0FQcm9jZXNvKG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHBlcnNvbmFzID0gb2VzdHJ1Y3RDU1YuUGVyc29uYXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVyc29uYXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBvTTNQZXJYUHJvY2VzbyA9IG5ldyBNM1BlclhQcm9jZXNvKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub00zUHJvY2Vzby5NM1BlclhQcm9jZXNvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28gPSBuZXcgQXJyYXk8TTNQZXJYUHJvY2Vzbz4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG9NM1BlclhQcm9jZXNvLlRkb2MgPSBwZXJzb25hc1tpXS5UZG9jO1xyXG4gICAgICAgICAgICAgICAgb00zUGVyWFByb2Nlc28uTmRvYyA9IHBlcnNvbmFzW2ldLk5kb2M7XHJcbiAgICAgICAgICAgICAgICBvTTNQZXJYUHJvY2Vzby5UaXBvUGVyc29uYSA9IHBlcnNvbmFzW2ldLkF0cmlidXRvO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vTTNQcm9jZXNvLk0zUGVyWFByb2Nlc28ucHVzaChvTTNQZXJYUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGFkaWNpb25hciBwZXJzb25hc1wiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGljaW9uYXIgZGV0YWxsZSBhbCB1bHRpbW8gZW5jYWJlemFkbyBhZ3JlZ2Fkby5cclxuICAgICAqIEBwYXJhbSBvZXN0cnVjdENTViBFc3RydWN0dXJhIGNvbiBpbmZvcm1hY2lvbiBkZSBsaW5lYSBhIGFncmVnYXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkaWNpb25hckRldGFsbGUob2VzdHJ1Y3RDU1Y6IGVzdHJ1Y3RDU1YpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgZGV0YWxsZXMgPSBvZXN0cnVjdENTVi5NM0RldFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRldGFsbGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb00zUERldGFsbGVJdGVtcyA9IG5ldyBNM1BEZXRhbGxlSXRlbXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLk5vbWJyZUNvbmNlcHRvID0gZGV0YWxsZXNbaV0uQXRyaWJ1dG87XHJcbiAgICAgICAgICAgICAgICBvTTNQRGV0YWxsZUl0ZW1zLlZhbG9yID0gZGV0YWxsZXNbaV0uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9NM1Byb2Nlc28uTTNFTkNbdGhpcy5vTTNQcm9jZXNvLk0zRU5DLmxlbmd0aCAtIDFdLk0zREVULnB1c2gob00zUERldGFsbGVJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAvL3RoaXMub00zUHJvY2Vzby5NM0VOQy5maW5kKHggPT4geC5JZFByb2R1Y3RvID09IG9lc3RydWN0Q1NWLilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IgYWRpY2lvbmFyIGRldGFsbGVcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9PYnRlbmVyIHkgc2V0ZWFyIGxhIGluZm9ybWFjaW9uIGRlIGFyY2hpdm8gQ1NWIHkgc2VwYXJhZG9yLlxyXG4gICAgcHVibGljIEdldFJlYWRlcihvRGF0YVByb2M6IGFueSkge1xyXG4gICAgICAgIHRoaXMucmVhZGVyID0gb0RhdGFQcm9jLkNTVjtcclxuICAgICAgICB0aGlzLnNlcGFyYWRvciA9IG9EYXRhUHJvYy5TZXBhcmFkb3I7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLy9TZXRlYXIgZXN0cnVjdXRhciBkZSBDU1ZcclxuICAgIHB1YmxpYyBTZXRFc3RydWN0Q1NWKGxpbmU6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBvZXN0cnVjdENTVjogZXN0cnVjdENTViA9IHsgXCJjYW50aWRhZFwiOiBudWxsLCBcInByZWNpb1wiOiBudWxsLCBcInNrdVwiOiBudWxsLCBcIlBhdGhJbWFnZW5cIjogbnVsbCwgXCJEaW5hbWljYXNcIjogW10sIFwiUGVyc29uYXNcIjogW10sIFwiTTNEZXRcIjogW10gfTtcclxuICAgICAgICAgICAgdmFyIG9BcnJDU1Y6IEFycmF5PHN0cmluZz4gPSBsaW5lLnNwbGl0KHRoaXMuc2VwYXJhZG9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLkNvbmZNYXNpdmEgJiYgdGhpcy5Db25mTWFzaXZhLkNvbHVtbmFzKSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdER5bmFtaWMob0FyckNTVik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvZXN0cnVjdENTViA9IHRoaXMuRXN0cnVjdERlZmF1bHQob0FyckNTVik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvZXN0cnVjdENTVjtcclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGNyZWFuZG8gZXN0cnVjdHVyYS4gUmV2aXNhciBsaW5lYXNcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXN0cnVjdHVyYSBkaW5hbWljYSBkZSBjYXJndWUgbWFzaXZhXHJcbiAgICAgKiBAcGFyYW0gb0FyckNTViBhcnJlZ2xvIGNvbiBpbmZvcm1hY2lvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIEVzdHJ1Y3REeW5hbWljKG9BcnJDU1Y6IEFycmF5PHN0cmluZz4pIHtcclxuICAgICAgICB2YXIgY29sdW1uYXM6IEFycmF5PGFueT4gPSB0aGlzLkNvbmZNYXNpdmEuQ29sdW1uYXM7XHJcbiAgICAgICAgdmFyIG9lc3RydWN0Q1NWOiBlc3RydWN0Q1NWID0geyBcImNhbnRpZGFkXCI6IG51bGwsIFwicHJlY2lvXCI6IG51bGwsIFwic2t1XCI6IG51bGwsIFwiUGF0aEltYWdlblwiOiBudWxsLCBcIkRpbmFtaWNhc1wiOiBbXSwgXCJQZXJzb25hc1wiOiBbXSwgXCJNM0RldFwiOiBbXSB9O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbmFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uYXNbaV0uRXN0cnVjdHVyYSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkNhbnRpZGFkXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YuY2FudGlkYWQgPSArb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiUHJlY2lvXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgb2VzdHJ1Y3RDU1YucHJlY2lvID0gK29BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIlNLVVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLnNrdSA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkRJTkFNSUNBXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpbiA9IHsgXCJBdHJpYnV0b1wiOiBjb2x1bW5hc1tpXS5BdHJpYnV0bywgXCJWYWxvclwiOiBvQXJyQ1NWW2NvbHVtbmFzW2ldLlBvc2ljaW9uXSB9O1xyXG4gICAgICAgICAgICAgICAgICAgIG9lc3RydWN0Q1NWLkRpbmFtaWNhcy5wdXNoKGRpbik7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiTTNERVRcIjpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNEZXQgPSB7IFwiQXRyaWJ1dG9cIjogY29sdW1uYXNbaV0uQXRyaWJ1dG8sIFwiVmFsb3JcIjogb0FyckNTVltjb2x1bW5hc1tpXS5Qb3NpY2lvbl0gfTtcclxuICAgICAgICAgICAgICAgICAgICBvZXN0cnVjdENTVi5NM0RldC5wdXNoKG0zRGV0KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJUSVBPUEVSU09OQVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWxvciA9IG9BcnJDU1ZbY29sdW1uYXNbaV0uUG9zaWNpb25dO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZG9jOiBzdHJpbmcgPSBcIjVcIjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmRvYzogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsb3Iuc3BsaXQoXCItXCIpLmxlbmd0aCA+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+IHtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIHJlc3VsdFxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJvd3NbaV0uaWQgJiYgIXJlc3VsdC5yb3dzW2ldLmlkLnN0YXJ0c1dpdGgoXCJDVElWT1NcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbTNQcm9jZXNvOiBNM1Byb2Nlc29zID0gcmVzdWx0LnJvd3NbaV0uZG9jO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlZhbGlkYXJUaWNrZXRDZXJyYWRvKG0zUHJvY2VzbykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbE0zUHJvY2Vzb3MucHVzaChyZXN1bHQucm93c1tpXS5kb2MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiQW50ZXMgUmVnaXN0cm9FdmVudG9NM09mZkxpbmVcIilcclxuICAgICAgICAgICAgb00zUmVnU2VydmljZS5SZWdpc3Ryb0V2ZW50b00zT2ZmTGluZShpZGthdGlvcywgdGhpcy5vUG9zdFNlcnZpY2VNMywgbE0zUHJvY2Vzb3MsIG9EYXRhVXNlcikudGhlbih4ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRGlvIFJlc3B1ZXN0YSBSZWdpc3Ryb0V2ZW50b00zT2ZmTGluZVwiKVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeClcclxuICAgICAgICAgICAgICAgIGlmICh4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImlmIDFcIilcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGVBbGxEb2NzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnVuY2lvblJlc3AodHJ1ZSwgXCJPS1wiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImlmIDJcIilcclxuICAgICAgICAgICAgICAgICAgICAvL1Jlc3B1ZXN0YSBjb24gZXJyb3Jlc1xyXG4gICAgICAgICAgICAgICAgICAgIC8vdGhpcy5vU2VydmljZU9mZkxpbmUuRGVsZXRlQWxsRG9jcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmNpb25SZXNwKGZhbHNlLCBcIk9LXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICBmdW5jaW9uUmVzcChmYWxzZSwgZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYWNpb24gZGUgcXVlIGVsIHRpY2tldCBlc3RhIGNlcnJhZG8uXHJcbiAgICAgKiBAcGFyYW0gbTNQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmFsaWRhclRpY2tldENlcnJhZG8obTNQcm9jZXNvOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgdmFyIGJDZXJyYWRvOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBpZiAobTNQcm9jZXNvLk0zRU5DICE9IG51bGwgJiYgbTNQcm9jZXNvLmxNM1BFbmNGUCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChtM1Byb2Nlc28gJiYgbTNQcm9jZXNvLlN1YkVzdGFkb0FudCAhPSBcIkRlY2xpbmFkb1wiICYmIG0zUHJvY2Vzby5NM0VOQy5sZW5ndGggPiAwICYmIG0zUHJvY2Vzby5sTTNQRW5jRlAubGVuZ3RoID09IDAgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FudGlkYWRUb3RhbEJ5TTNQcm9jZXNvKG0zUHJvY2VzbykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBiQ2VycmFkbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBiQ2VycmFkbyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJDZXJyYWRvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FudGlkYWRUb3RhbEJ5TTNQcm9jZXNvKG9NM1Byb2Nlc29zOiBNM1Byb2Nlc29zKSB7XHJcbiAgICAgICAgaWYgKG9NM1Byb2Nlc29zICYmIG9NM1Byb2Nlc29zLk0zRU5DKSB7XHJcbiAgICAgICAgICAgIHZhciBkQ2FudGlkYWQgPSBvTTNQcm9jZXNvcy5NM0VOQy5maWx0ZXIoZW5jID0+ICgrZW5jLk0zREVULmZpbmQoZGV0ID0+IGRldC5Ob21icmVDb25jZXB0byA9PSBcIkNBTlRJREFEXCIpLlZhbG9yKSA+IDApLlxyXG4gICAgICAgICAgICAgICAgcmVkdWNlKChhY2MsIGN1cikgPT4gKGFjYykgKyAoK2N1ci5NM0RFVC5maW5kKGRldCA9PiBkZXQuTm9tYnJlQ29uY2VwdG8gPT0gXCJDQU5USURBRFwiKS5WYWxvciksIDApO1xyXG4gICAgICAgICAgICBpZiAoZENhbnRpZGFkID09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRDYW50aWRhZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciB0b2RvcyBsb3MgZG9jdW1lbnRvcyBPZmYgbGluZSBxdWUgc2UgaGFuIGd1YXJkYWRvIGNvbW8gb2ZmbGluZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldEFsbERvY3NPZmZsaW5lKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHZhciBsTTNQcm9jZXNvcyA9IG5ldyBBcnJheTxNM1Byb2Nlc29zPigpO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgdGhpcy5vU2VydmljZU9mZkxpbmUuR2V0QWxsRG9jcygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJvd3NbaV0uaWQgIT0gXCJDVElWT1NcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxNM1Byb2Nlc29zLnB1c2gocmVzdWx0LnJvd3NbaV0uZG9jKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbE0zUHJvY2Vzb3M7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIHRvZG9zIGxvcyBkb2N1bWVudG9zIE9mZiBsaW5lIHF1ZSBzZSBoYW4gZ3VhcmRhZG8gY29tbyBvZmZsaW5lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0QWxsRG9jc09mZmxpbmVEZWxldGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5HZXRBbGxEb2NzRGVsZXRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVDdGl2b3ModWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5EZWxldGUodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBbGxDdGl2b3ModWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIGxvcyBjb25zZWN1dGl2b3MgcXVlIGVzdGFuIGxvY2FsbWVudGUgdnMgbG9zIHF1ZSBlc3RhbiBlbiBlbCBzZXJ2aWRvci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZhbGlkYWNpb25DdGl2b3NWU1NlcnZlcihpa2F0aW9zOiBzdHJpbmcsIHViaWNhY2lvbjogc3RyaW5nLCBpZEh1Yjogc3RyaW5nLCBmdW5jaW9uUmVzcDogRnVuY3Rpb24pIHtcclxuICAgICAgICB0aGlzLmdldEFsbEN0aXZvcyh1YmljYWNpb24sIGlkSHViKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBpZiAoeCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICAgICAgICAgIG9TZXJ2aWNlTTNNYWVzdHJvLlZhbGlkYXJDdGl2b3NWU0xvY2FsKHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGlrYXRpb3MsIEpTT04uc3RyaW5naWZ5KHgpLCB1YmljYWNpb24sIGlkSHViLCBmdW5jaW9uUmVzcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBlbCBjb25zZWN1dGl2byBlbiBlbCBxdWUgdmEsIGVsIHByb2Nlc28gb2ZmbGluZSBxdWUgcmVjaWJlIGNvbW8gcGFyYW1ldHJvXHJcbiAgICAgKiBAcGFyYW0gdWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIGh1YiBcclxuICAgICAqIEBwYXJhbSBzSWRQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgR2V0Q3Rpdm9PZmZMaW5lKHViaWNhY2lvbjogc3RyaW5nLCBodWI6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIGN0aXZvOiBzdHJpbmcgPSBcIjBcIjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGEgPSBhd2FpdCB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKTtcclxuICAgICAgICAgICAgaWYgKG9EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0RhdGFGaW5kZWQ6IGFueSA9IG9EYXRhLkN0aXZvcy5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gc0lkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgICAgICBpZiAob0RhdGFGaW5kZWQuQ3Rpdm8pIHtcclxuICAgICAgICAgICAgICAgICAgICBjdGl2byA9IG9EYXRhRmluZGVkLkN0aXZvLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgcmV0dXJuIGN0aXZvO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhciBpZCBtMyBcclxuICAgICAqIEBwYXJhbSBzSWRNMyBcclxuICAgICAqIEBwYXJhbSBzSWRQcm9jZXNvIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgU2F2ZUlkTTMoc0lkTTM6IHN0cmluZywgc0lkUHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9TZXJ2aWNlT2ZmTGluZS5nZXQodGhpcy5HZXRLZXkodWJpY2FjaW9uLCBodWIpKS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB2YXIgb0RhdGE6IEFycmF5PGFueT4gPSBkYXRhLkN0aXZvcztcclxuICAgICAgICAgICAgdmFyIG9EYXRhRmluZGVkOiBhbnkgPSBvRGF0YS5maW5kKHggPT4geC5JZFByb2Nlc28gPT0gc0lkUHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YUZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGN0aXZvQW50ID0gK29EYXRhRmluZGVkLkN0aXZvLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgICAgIHZhciBjdGl2b0FjdCA9ICtzSWRNMy5zdWJzdHJpbmcoOSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3Rpdm9BY3QgPiBjdGl2b0FudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9EYXRhRmluZGVkLkN0aXZvID0gc0lkTTM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvRGF0YS5wdXNoKHsgXCJJZFByb2Nlc29cIjogc0lkUHJvY2VzbywgXCJDdGl2b1wiOiBzSWRNMyB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuU2F2ZUN0aXZvcyhvRGF0YSwgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICBpZiAoc0lkUHJvY2Vzby50b1VwcGVyQ2FzZSgpID09IFwiVElDS0VUVkVOVEFcIikge1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIsIHNJZE0zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIG9EYXRhID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICAgICAgb0RhdGEucHVzaCh7IFwiSWRQcm9jZXNvXCI6IHNJZFByb2Nlc28sIFwiQ3Rpdm9cIjogc0lkTTMgfSlcclxuICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1Yik7XHJcbiAgICAgICAgICAgIGlmIChzSWRQcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJUSUNLRVRWRU5UQVwiKSB7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkN0aXZvVGlja2V0VmVudGFcIiwgc0lkTTMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGFyIGN0aXZvcywgSWRtMy5cclxuICAgICAqIEBwYXJhbSBvRGF0YSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBTYXZlQ3Rpdm9zKG9EYXRhOiBBcnJheTxhbnk+LCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcsIGludGVudG8gPSAwKSB7XHJcbiAgICAgICAgdmFyIG9EYXRhU2VuZCA9IHsgXCJDdGl2b3NcIjogb0RhdGEgfVxyXG4gICAgICAgIHRoaXMub1NlcnZpY2VPZmZMaW5lLkFkZERvY3VtZW50KHRoaXMuR2V0S2V5KHViaWNhY2lvbiwgaHViKSwgb0RhdGFTZW5kKS50aGVuKHggPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIk9LXCIpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgdmFyIHNGZWNoYU5vdzogc3RyaW5nID0gbW9tZW50KG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWU1NRERUSEhtbXNzJylcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJlcnJvckxvZ0N0aXZvc1wiICsgc0ZlY2hhTm93LCBKU09OLnN0cmluZ2lmeSh7IFwiZXJyb3JcIjogZXJyb3IsIFwiQ3Rpdm9zXCI6IG9EYXRhU2VuZCwgXCJmdW5jdGlvblwiOiBcIlNhdmVDdGl2b3NcIiB9KSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgICAgaWYgKGludGVudG8gPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TYXZlQ3Rpdm9zKG9EYXRhLCB1YmljYWNpb24sIGh1YiwgMSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBEZWxldGVPbGREb2NzKG1heERpYXM6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMub2JkT2ZmTGluZUxvZy5EZWxldGVPbGREb2NzKG1heERpYXMpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBJZCBtMywgY3VhbmRvIGVzdGEgZnVlcmEgZGUgbGluZWFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIEdldElkTTNPZmZsaW5lKGlka2F0aW9zOiBzdHJpbmcsIGlkcHJvY2Vzbzogc3RyaW5nLCB1YmljYWNpb246IHN0cmluZywgaHViOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgb0RhdGFJZE0zO1xyXG4gICAgICAgIHZhciBpZE0zO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIG9EYXRhSWRNMyA9IGF3YWl0IHRoaXMub1NlcnZpY2VPZmZMaW5lLmdldCh0aGlzLkdldEtleSh1YmljYWNpb24sIGh1YikpO1xyXG4gICAgICAgICAgICB2YXIgb0RhdGFGaW5kZWQ6IGFueSA9IG9EYXRhSWRNMy5DdGl2b3MuZmluZCh4ID0+IHguSWRQcm9jZXNvID09IGlkcHJvY2Vzbyk7XHJcbiAgICAgICAgICAgIGlmIChvRGF0YUZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IG9EYXRhRmluZGVkLkN0aXZvO1xyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMuU3VtYXJDdGl2byhpZE0zKTtcclxuICAgICAgICAgICAgICAgIGlkTTMgPSB0aGlzLnZhbGlkYXJBdW1lbnRvQ3Rpdm8oaWRNMywgaWRwcm9jZXNvKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIC8vIGlkTTMgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgZGF0ZS5nZXRNb250aCgpICsgXCJcIiArIGRhdGUuZ2V0RGF5KCkgKyBcIlwiICsgZGF0ZS5nZXRIb3VycygpICsgXCJcIiArIGRhdGUuZ2V0TWludXRlcygpICsgXCJcIiArIGRhdGUuZ2V0U2Vjb25kcygpICsgXCJcIiArIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMuR2V0Q3Rpdm8oaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIC8vIHZhciBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgLy8gaWRNMyA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiXCIgKyBkYXRlLmdldE1vbnRoKCkgKyBcIlwiICsgZGF0ZS5nZXREYXkoKSArIFwiXCIgKyBkYXRlLmdldEhvdXJzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCkgKyBcIlwiICsgZGF0ZS5nZXRTZWNvbmRzKCkgKyBcIlwiICsgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcclxuICAgICAgICAgICAgaWRNMyA9IHRoaXMuR2V0Q3Rpdm8oaWRrYXRpb3MsIGlkcHJvY2VzbywgdWJpY2FjaW9uLCBodWIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaWRNMztcclxuICAgIH1cclxuXHJcblxyXG4gICAgdmFsaWRhckF1bWVudG9DdGl2byhpZE0zLCBpZHByb2Nlc28pIHtcclxuICAgICAgICBpZiAoaWRwcm9jZXNvLnRvVXBwZXJDYXNlKCkgPT0gXCJUSUNLRVRWRU5UQVwiKSB7XHJcbiAgICAgICAgICAgIGxldCB1bHRpbW9JZE0zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJDdGl2b1RpY2tldFZlbnRhXCIpO1xyXG4gICAgICAgICAgICBpZiAodWx0aW1vSWRNMyA9PSBpZE0zKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc0ZlY2hhTm93OiBzdHJpbmcgPSBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZTU1ERFRISG1tc3MnKVxyXG4gICAgICAgICAgICAgICAgaWRNMyA9IHRoaXMuU3VtYXJDdGl2byhpZE0zKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiZXJyb3JMb2dDdGl2b3NcIiArIHNGZWNoYU5vdywgSlNPTi5zdHJpbmdpZnkoeyBcImlkTTNcIjogaWRNMywgXCJmdW5jdGlvblwiOiBcInZhbGlkYXJBdW1lbnRvQ3Rpdm9cIiB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlkTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBHZXRDdGl2byhpZGthdGlvczogc3RyaW5nLCBpZHByb2Nlc286IHN0cmluZywgdWJpY2FjaW9uOiBzdHJpbmcsIGh1Yjogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG9TZXJ2aWNlTTNNYWVzdHJvID0gbmV3IFNlcnZpY2VNM01hZXN0cm8oKTtcclxuICAgICAgICB2YXIgc0N0aXZvO1xyXG4gICAgICAgIHNDdGl2byA9IGF3YWl0IG9TZXJ2aWNlTTNNYWVzdHJvLkdldEN0aXZvQllQcm9jZXNvKHRoaXMub1Bvc3RTZXJ2aWNlTTMsIGlka2F0aW9zLCBpZHByb2Nlc28sIHViaWNhY2lvbiwgaHViKTtcclxuICAgICAgICByZXR1cm4gc0N0aXZvO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9idGVuZXIgbGxhdmUgZGUgcG91Y2hEQlxyXG4gICAgICogQHBhcmFtIHViaWMgXHJcbiAgICAgKiBAcGFyYW0gaHViIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2V0S2V5KHViaWMsIGh1Yikge1xyXG4gICAgICAgIHJldHVybiBcIkNUSVZPU19cIiArIHViaWMgKyBodWI7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFBvc3RTZXJ2aWNlTTMgfSBmcm9tIFwiLi4vLi4vQ29uZXhpb25TUUwvcG9zdHMuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTTNOb3RpZlNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb1Bvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idGVuZXIgbGEgaW5mb3JtYWNpb24gZGUgbGFzIG5vdGlkaWNhY2lvbmVzIHBvciBodWJcclxuICAgKiBAcGFyYW0gc0lES2F0aW9zIEVtcHJlc2FcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdChzSURLYXRpb3M6IHN0cmluZywgb0RhdGFTZW5kOiBhbnkpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5vUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNOb3RpZkNvbnRyb2xsZXIvTTNHZXRNM05vdGlmaWNhY2lvbmVzWEh1Yk9iamVjdC9cIiArIHNJREthdGlvcywgb0RhdGFTZW5kKS50b1Byb21pc2UoKTtcclxuICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcbiAgICBjYXRjaHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YlxyXG4gICAqIEBwYXJhbSBzSURLYXRpb3MgRW1wcmVzYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBNM0dldE0zTm90aWZpY2FjaW9uZXNYSHViT2JqZWN0V2l0aFRpbWVPdXQoc0lES2F0aW9zOiBzdHJpbmcsIG9EYXRhU2VuZDogYW55LCB0aW1lT3V0OiBudW1iZXIpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHZhciByZXNwID0gYXdhaXQgdGhpcy5vUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zVGltZU91dChcIk0zTm90aWZDb250cm9sbGVyL00zR2V0TTNOb3RpZmljYWNpb25lc1hIdWJPYmplY3QvXCIgKyBzSURLYXRpb3MsIG9EYXRhU2VuZCwgdGltZU91dCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHJldHVybiByZXNwO1xyXG4gICAgfVxyXG4gICAgY2F0Y2h7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0ZW5lciBsYSBpbmZvcm1hY2lvbiBkZSBsYXMgbm90aWRpY2FjaW9uZXMgcG9yIGh1YiBkZSB1biBpZFJlcCBkYWRvXHJcbiAgICogQHBhcmFtIHNJREthdGlvcyBcclxuICAgKiBAcGFyYW0gZGF0YSBcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgbTNfZ2V0X25vdGlmaWNhY2lvbl94X2h1Yl9vYmplY3Qoc0lES2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSkge1xyXG4gICAgLy92YXIgZGF0YSA9IHtcImlkX3JlcFwiOlwiXCIsIFwiaWRfdWJpY2FjaW9uXCI6XCJcIiwgXCJpZF9odWJcIjpcIlwifVxyXG4gICAgdHJ5IHtcclxuICAgICAgdmFyIHJlc3AgPSBhd2FpdCB0aGlzLm9Qb3N0U2VydmljZU0zLmdldFdpdGhCb2R5TTMoXCJNM05vdGlmQ29udHJvbGxlci9tM19nZXRfbm90aWZpY2FjaW9uX3hfaHViX29iamVjdC9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNwKSk7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG4gICAgY2F0Y2h7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ3VhcmRhckNhbWJpb3NDb25maWd1cmFjaW9uSW1wcmVzaW9uKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnksIG9GdW5jaW9uT0s6IEZ1bmN0aW9uLCBvRnVuY2lvbkVycjogRnVuY3Rpb24pIHtcclxuXHJcbiAgICBQb3N0U2VydmljZU0zLnBvc3RTZXJ2aWNlSHR0cFJlc0Z1bGxNMyhcIk0zTm90aWZDb250cm9sbGVyL2d1YXJkYXJDYW1iaW9zQ29uZmlndXJhY2lvbkltcHJlc2lvbi9cIiArIHNJREthdGlvcy50cmltKCksIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgb0Z1bmNpb25PSygpO1xyXG4gICAgfSxcclxuICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgIG9GdW5jaW9uRXJyKGVycm9yW1wiX2JvZHlcIl0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIE1vZGVsTTNOb3RpZntcclxuICAgIHB1YmxpYyBJZFJlcDpzdHJpbmc7XHJcbiAgICBwdWJsaWMgSURVYmljYWNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIElkSHViOnN0cmluZztcclxuICAgIHB1YmxpYyBDb3JyZXI6c3RyaW5nO1xyXG4gICAgcHVibGljIFRpcG86bnVtYmVyO1xyXG4gICAgcHVibGljIENvbmRpY2lvbmVzOnN0cmluZztcclxuICAgIHB1YmxpYyBEYXRhOnN0cmluZztcclxuICAgIHB1YmxpYyBDb25mSW1wOnN0cmluZztcclxufSIsImV4cG9ydCBjbGFzcyBNM1ByZXNlbnRhY2lvbmVze1xyXG4gICAgcHVibGljIE5JVkVMUFJTOnN0cmluZztcclxuICAgIHB1YmxpYyBWQUxPUjpudW1iZXI7XHJcbiAgICBwdWJsaWMgVE9QRTpudW1iZXI7XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUG9zdFNlcnZpY2VNMyB9IGZyb20gXCIuLi8uLi8uLi9Db25leGlvblNRTC9wb3N0cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IHJlc2VydmVTbG90cyB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9uc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTTNDb25zdWx0YXMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBQb3N0U2VydmljZU0zOiBQb3N0U2VydmljZU0zKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0ZW5lciBpbmZvcm1hY2lvbiBkZSBpbnZlbnRhcmlvLCB0ZW5pZW5kbyBlbiBjdWVudGEgbG9zIHBhY2sgYXNvY2lhZG9zIFxyXG4gICAgICogQHBhcmFtIHNJREthdGlvcyBFbXByZXNhXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBKc29uIGNvbiBpbmZvcm1hY2lvbiBkZSBTS1AxIChNb2RlbG8pIHkgVWJpY2FjaW9uIFxyXG4gICAgICogQHBhcmFtIG9GdW5jaW9uT0sgXHJcbiAgICAgKiBAcGFyYW0gb0Z1bmNpb25FcnIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBNM19HRVRJTlZFTlRBUklPQllQQUNLKHNJREthdGlvczogc3RyaW5nLCBkYXRhOiBhbnkpIHtcclxuICAgICAgICB2YXIgcmVzcCA9IGF3YWl0IHRoaXMuUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNDb25zdWx0YXMvTTNfR0VUSU5WRU5UQVJJT0JZUEFDSy9cIiArIHNJREthdGlvcywgZGF0YSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhckludmVudGFyaW9OZWdhdGl2b1Byb2R1Y3RvKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgICBvRnVuY2lvbk9LOiBGdW5jdGlvbiwgb0Z1bmNpb25FcnI6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTMvdmFsaWRhckludmVudGFyaW9OZWdhdGl2b1Byb2R1Y3RvL1wiICsgaWRLYXRpb3MsIGRhdGEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgIG9GdW5jaW9uT0soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICBvRnVuY2lvbkVycihKU09OLnBhcnNlKGVycm9yLmVycm9yLk1lc3NhZ2UpKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgQnVzY2FyQ29uY2VwdG9Fbk0zU0lVKFBvc3RTZXJ2aWNlTTM6IFBvc3RTZXJ2aWNlTTMsIGlkS2F0aW9zOiBzdHJpbmcsIGRhdGE6IGFueSxcclxuICAgICAgb0Z1bmNpb25PSzogRnVuY3Rpb24sIG9GdW5jaW9uRXJyOiBGdW5jdGlvbil7XHJcbiAgICAgICAgUG9zdFNlcnZpY2VNMy5nZXRXaXRoQm9keU0zKFwiTTNDb25zdWx0YXMvTTNfR0VUQ29uY2VwdG9Gcm9tU0lVL1wiICsgaWRLYXRpb3MgKyBcIi9cIiArIGRhdGEuc1ViaWNhY2lvbiArIFwiL1wiICsgZGF0YS5zQ29uY2VwdG8sIHt9KS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBvRnVuY2lvbk9LKHJlc3ApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIG9GdW5jaW9uRXJyKEpTT04ucGFyc2UoZXJyb3IuZXJyb3IuTWVzc2FnZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcblxyXG59IiwiZXhwb3J0IGNsYXNzIFRFQ0xBU1JBUElEQVN7XHJcbiAgICBwdWJsaWMgQ29tcG9uZW50ZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgVGVjbGE6c3RyaW5nO1xyXG4gICAgcHVibGljIEZ1bmNpb246c3RyaW5nO1xyXG4gICAgcHVibGljIElkRWxlbWVudG86c3RyaW5nO1xyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoUFJEU1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGlka2F0aW9zOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgYXBsU3luY0NvdWNoQXV0byA9IHRydWU7XHJcbiAgICBwcml2YXRlIGFwbFBhcXVldGVzID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLkdldEthdGlvc00zRnJvbVNlc3Npb24oKTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbnN0YW50aWF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmxhZ1N5bmNDb3VjaCgpIHtcclxuICAgICAgICB2YXIgc1NVYmljYWNpb24gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU1ViaWNhY2lvblwiKTtcclxuICAgICAgICB2YXIgb1NVYmljYWNpb247XHJcbiAgICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGxldCBjb25maWc7XHJcblxyXG4gICAgICAgIGlmIChzU1ViaWNhY2lvbikge1xyXG4gICAgICAgICAgICBvU1ViaWNhY2lvbiA9IEpTT04ucGFyc2Uoc1NVYmljYWNpb24pO1xyXG4gICAgICAgICAgICBpZiAob1NVYmljYWNpb24uTTNIVUJTICYmIG9TVWJpY2FjaW9uLk0zSFVCU1swXSAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShvU1ViaWNhY2lvbi5NM0hVQlNbMF0uQ29uZmlndXJhY2lvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IG51bGwgJiYgY29uZmlnLlN5bmNDb3VjaEF1dG8gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGNvbmZpZy5TeW5jQ291Y2hBdXRvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuaWRrYXRpb3MpIHRoaXMuR2V0S2F0aW9zTTNGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcIlBSRFwiICsgdGhpcy5pZGthdGlvcywgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcImFkYXB0ZXJcIilcclxuICAgICAgICBjb25zb2xlLmRlYnVnKHRoaXMuZGF0YWJhc2UuYWRhcHRlcik7XHJcbiAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICB0aGlzLnZhbGlkYXJQYXF1ZXRlcygpXHJcbiAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOU1RBTkNFIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGFyUGFxdWV0ZXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXBsUGFxdWV0ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHViaWNhY2lvbiA9IHRoaXMuZ2V0VWJpY2FjaW9uKCk7XHJcbiAgICAgICAgICAgIGlmICh1YmljYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwcmRzYVwiICsgdWJpY2FjaW9uICsgXCJfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcInByZHNfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwicHJkc19cIiArIHRoaXMuaWRrYXRpb3MudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN5bmNDb3VjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaWRrYXRpb3MpIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhclBhcXVldGVzKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VWJpY2FjaW9uKCkge1xyXG4gICAgICAgIGxldCBzU1ViaWNhY2lvbiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTVWJpY2FjaW9uXCIpO1xyXG4gICAgICAgIGxldCBvU1ViaWNhY2lvbjtcclxuXHJcbiAgICAgICAgaWYgKHNTVWJpY2FjaW9uKSB7XHJcbiAgICAgICAgICAgIG9TVWJpY2FjaW9uID0gSlNPTi5wYXJzZShzU1ViaWNhY2lvbik7XHJcbiAgICAgICAgICAgIGlmIChvU1ViaWNhY2lvbi5JRFViaWNhY2lvbikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TVWJpY2FjaW9uLklEVWJpY2FjaW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIHNTZXNzaW9uTFZMMU0zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNlc3Npb25MVkwxTTNcIik7XHJcbiAgICAgICAgdmFyIG9TZXNzaW9uTFZMMU0zO1xyXG4gICAgICAgIGlmIChzU2Vzc2lvbkxWTDFNMyAhPT0gdW5kZWZpbmVkICYmIHNTZXNzaW9uTFZMMU0zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRLYXRpb3NNM0Zyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBLYXRpb3MgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0thdGlvc1wiICsgdGhpcy5pZGthdGlvcy50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICBpZiAoS2F0aW9zICE9PSB1bmRlZmluZWQgJiYgS2F0aW9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdmFyIGpLYXRpb3NNMyA9IEpTT04ucGFyc2UoS2F0aW9zKTtcclxuICAgICAgICAgICAgaWYgKGpLYXRpb3NNMyAmJiBqS2F0aW9zTTMuS2F0aW9zICYmIGpLYXRpb3NNMy5LYXRpb3MuS2F0aW9zTTMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhcGwgPSBqS2F0aW9zTTMuS2F0aW9zLkthdGlvc00zLmZpbmQoeCA9PiB4LkxsYXZlLnRvVXBwZXJDYXNlKCkgPT0gXCJBUExQQVFTXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFwbCAmJiBhcGwuVmFsb3IgPT0gXCIxXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwbFBhcXVldGVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveShpZGthdGlvcykge1xyXG4gICAgICAgIHZhciByZXNwdWVzdGE7XHJcbiAgICAgICAgcmVzcHVlc3RhID0gYXdhaXQgdGhpcy5kYXRhYmFzZS5kZXN0cm95KClcclxuICAgICAgICByZXR1cm4gcmVzcHVlc3RhXHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXBsU3luY0NvdWNoQXV0byA9IHRoaXMuZ2V0RmxhZ1N5bmNDb3VjaCgpO1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdGhpcy5hcGxTeW5jQ291Y2hBdXRvLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST0RVQ1RPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW5mbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5pbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZWxldGVQcmQoaWQpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpZCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5yZW1vdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgRGVsZXRlQWxsRG9jcygpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSkudGhlbihhbGxEb2NzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbERvY3Mucm93cy5tYXAocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IF9pZDogcm93LmlkLCBfcmV2OiByb3cuZG9jLl9yZXYsIF9kZWxldGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pLnRoZW4oZGVsZXRlRG9jcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmJ1bGtEb2NzKGRlbGV0ZURvY3MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hDb2RzUFJEU1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgaWRrYXRpb3M7XHJcbiAgICBwcml2YXRlIGFwbFN5bmNDb3VjaEF1dG8gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEZsYWdTeW5jQ291Y2goKSB7XHJcbiAgICAgICAgdmFyIHNTVWJpY2FjaW9uID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIlNVYmljYWNpb25cIik7XHJcbiAgICAgICAgdmFyIG9TVWJpY2FjaW9uO1xyXG4gICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBsZXQgY29uZmlnO1xyXG5cclxuICAgICAgICBpZiAoc1NVYmljYWNpb24pIHtcclxuICAgICAgICAgICAgb1NVYmljYWNpb24gPSBKU09OLnBhcnNlKHNTVWJpY2FjaW9uKTtcclxuICAgICAgICAgICAgaWYgKG9TVWJpY2FjaW9uLk0zSFVCUyAmJiBvU1ViaWNhY2lvbi5NM0hVQlNbMF0gJiYgb1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2Uob1NVYmljYWNpb24uTTNIVUJTWzBdLkNvbmZpZ3VyYWNpb24pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuU3luY0NvdWNoQXV0byAhPSBudWxsICYmIGNvbmZpZy5TeW5jQ291Y2hBdXRvICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZsYWcgPSBjb25maWcuU3luY0NvdWNoQXV0bztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG5cclxuICAgICAgICB0aGlzLmlka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcImNvZHNwcmRfXCIgKyB0aGlzLmlka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiYWRhcHRlclwiKVxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5kYXRhYmFzZS5hZGFwdGVyKTtcclxuXHJcbiAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvZHNwcmRfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc3luY0NvdWNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pZGthdGlvcykge1xyXG4gICAgICAgICAgICB0aGlzLkNyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zeW5jKHRoaXMuR2V0U2VydmVyKCkgKyBcImNvZHNwcmRfXCIgKyB0aGlzLmlka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXBsU3luY0NvdWNoQXV0byA9IHRoaXMuZ2V0RmxhZ1N5bmNDb3VjaCgpO1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdGhpcy5hcGxTeW5jQ291Y2hBdXRvLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gQ09EUyBQUk9EVUNUT1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIENPRFMgUFJPRFVDVE9TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgRGVzdHJveSgpIHtcclxuICAgICAgICB2YXIgcmVzcHVlc3RhO1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvdWNoUHJvbW9jaW9uZXNTZXJ2aWNlIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZW06IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICBzSWRrYXRpb3MgPSB0aGlzLkdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcInByb21vY2lvbmVzX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdmFyIHNJZGthdGlvczogc3RyaW5nO1xyXG5cclxuICAgICAgICAgICAgLy90aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoc0lka2F0aW9zKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcihzSWRrYXRpb3MpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zICsgXCJwcm9tb2Npb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTVBMRVRPIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoY2hhbmdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENIQU5HRSBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jV2l0aERCKHJlbW90ZURhdGFiYXNlOiBQb3VjaERCKSB7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgcmV0cnk6IHRydWVcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzeW5jQXdhaXQocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gUFJPTU9DSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aERCKHJlbW90ZURhdGFiYXNlKTtcclxuICAgICAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3JcIilcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmRhdGFiYXNlLmNvbXBhY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgY2hhbmdlcyhyZW1vdGU6IHN0cmluZyl7XHJcbiAgICAvLyAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlKTtcclxuICAgIC8vICAgICByZW1vdGVEYXRhYmFzZS5jaGFuZ2VzKHtcclxuICAgIC8vICAgICAgICAgc2luY2U6ICdub3cnLFxyXG4gICAgLy8gICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgLy8gICAgICAgICBpbmNsdWRlX2RvY3M6IHRydWVcclxuICAgIC8vICAgICAgIH0pLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoY2hhbmdlKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIGNoYW5nZS5pZCBjb250YWlucyB0aGUgZG9jIGlkLCBjaGFuZ2UuZG9jIGNvbnRhaW5zIHRoZSBkb2NcclxuICAgIC8vICAgICAgICAgaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAvLyAgICAgICAgICAgLy8gZG9jdW1lbnQgd2FzIGRlbGV0ZWRcclxuICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAvLyBkb2N1bWVudCB3YXMgYWRkZWQvbW9kaWZpZWRcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgLy8gICAgICAgICAvLyBoYW5kbGUgZXJyb3JzXHJcbiAgICAvLyAgICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLmdldChpZCkudGhlbihkb2MgPT57XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLnJlbW92ZShkb2MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmZXRjaCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHsgaW5jbHVkZV9kb2NzOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDaGFuZ2VMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZWxlbWVudFJlbW92ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jaGFuZ2VzKHsgbGl2ZTogdHJ1ZSwgc2luY2U6ICdub3cnLCBpbmNsdWRlX2RvY3M6IHRydWUgfSlcclxuICAgICAgICAub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2UuZGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbmdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlbS5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9yZW5kZXJEb2NzU29tZWhvdygpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSZW1vdmVMaXN0ZW5lcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVtO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgUG91Y2hEQiAgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxuICB9KVxyXG5leHBvcnQgY2xhc3MgQ291Y2hVYmljYWNpb25lc1NlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNJbnN0YW50aWF0ZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlOiBhbnk7XHJcbiAgICBwcml2YXRlIGxpc3RlbmVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHByaXZhdGUgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBpZighdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICBzSWRrYXRpb3M9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwidWJpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOnN0cmluZztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJ1YmljYWNpb25lc19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5pc0luc3RhbnRpYXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBVQklDQUNJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOnN0cmluZ3tcclxuICAgICAgICB2YXIganNvbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkNvbmZpZ0pTT05cIikpO1xyXG4gICAgICAgIHJldHVybiBqc29uLkNvdWNoREJNMztcclxuICAgIH1cclxuXHJcbiAgICAvL0lka2F0aW9zIHF1ZSBzZSBjYXJnYSwgY3VhbmRvIHNlIGluaWNpYSBlbCByZWRpcmVjY2lvbmFtaWVudG8gaGFjaWEgZWwgV0U4XHJcbiAgICBwdWJsaWMgR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKXtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKXtcclxuICAgICAgICAgICAgb1Nlc3Npb25MVkwxTTMgPSBKU09OLnBhcnNlKHNTZXNzaW9uTFZMMU0zKTtcclxuICAgICAgICAgICAgaWYgKG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9PSB1bmRlZmluZWQgJiYgb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TO1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcbiAgICBcclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IHRydWUsXHJcbiAgICAgICAgICAgIHJldHJ5OiB0cnVlXHJcbiAgICAgICAgfSkub24oJ2NvbXBsZXRlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gVUJJQ0FDSU9ORVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIFVCSUNBQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENoYW5nZUl0ZW0oKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jaGFuZ2VzKHsgbGl2ZTogdHJ1ZSwgc2luY2U6ICdub3cnLCBpbmNsdWRlX2RvY3M6IHRydWUgfSlcclxuICAgICAgICAub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIC8vaWYgKGNoYW5nZS5kZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgLy9yZW5kZXJEb2NzU29tZWhvdygpO1xyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFbmNhYmV6YWRvKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3Moe2luY2x1ZGVfZG9jczogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhbmdlTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNM1Byb2Nlc29zIH0gZnJvbSAnLi4vUmVnaXN0cm8vbTMtcHJvY2Vzb3MnO1xyXG5pbXBvcnQgUG91Y2hEQiBmcm9tICdwb3VjaGRiJztcclxuaW1wb3J0ICdyeGpzL2FkZC9vcGVyYXRvci9tYXAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNM05vdGlmaWNhY2lvbmVzQVBQIHtcclxuICAgIHB1YmxpYyBvRGF0YU0zUHJvY2Vzb3M6IE0zUHJvY2Vzb3M7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0luc3RhbnRpYXRlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZGF0YWJhc2U6IGFueTtcclxuICAgIHByaXZhdGUgbGlzdGVuZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0luc3RhbnRpYXRlZCkge1xyXG4gICAgICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcbiAgICAgICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBQb3VjaERCKFwibm90aWZpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCksIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnN5bmModGhpcy5HZXRTZXJ2ZXIoKSArIFwibm90aWZpY2FjaW9uZXNfXCIgKyBzSWRrYXRpb3MudG9Mb3dlckNhc2UoKS50cmltKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICAvL09idGVuZXIgaW5mb3JtYWNpb24gZGUgYmFzZSBkZSBkYXRvcy5cclxuICAgIHB1YmxpYyBHZXREYXRhUG91Y2hCRChpc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlzS2V5KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzeW5jKHJlbW90ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHJlbW90ZURhdGFiYXNlID0gbmV3IFBvdWNoREIocmVtb3RlLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5yZXBsaWNhdGUuZnJvbShyZW1vdGVEYXRhYmFzZSwge1xyXG4gICAgICAgICAgICBsaXZlOiB0cnVlLFxyXG4gICAgICAgICAgICByZXRyeTogdHJ1ZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIFBST01PQ0lPTkVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBQUk9NT0NJT05FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vYXJtYXIga2V5IGRlIGRvY3VtZW50byBxdWUgc2UgcXVpZXJlIGNvbnN1bHRhclxyXG4gICAgcHVibGljIEdldEtleURvY3VtZW50b0RCKGlzSURLYXRpb3M6IHN0cmluZywgaXNEb2N1bWVudG86IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBpc0lES2F0aW9zICsgXCI/XCIgKyBpc0RvY3VtZW50bztcclxuICAgIH1cclxuXHJcblxyXG59XHJcbiIsImltcG9ydCB7IFR5cGVNM1ByZEdycCB9IGZyb20gXCIuLi9NYWVzdHJvL00zUHJkR3JwLnR5cGVcIjtcclxuaW1wb3J0IHsgTTNQcmRQYWNrQnlUaXBvIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcGFjay1ieS10aXBvXCI7XHJcbmltcG9ydCB7IE0zUGFja0J5UmVnbGFzIH0gZnJvbSBcIi4uL01hZXN0cm8vbTMtcGFjay1ieS1yZWdsYXNcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE0zUEl0ZW1zV0VCIH0gZnJvbSBcIi4uL1JlZ2lzdHJvL20zLXBkZXRhbGxlLWl0ZW1zXCI7XHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VydmljZU0zUGFja0J5aXBvIHtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBvcGVyYXRvcnMgPSB7XHJcbiAgICAgICAgJzwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPCArYiB9LFxyXG4gICAgICAgICc+JzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuICthID4gK2IgfSxcclxuICAgICAgICAnPD0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPD0gK2IgfSxcclxuICAgICAgICAnPj0nOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gK2EgPj0gK2IgfSxcclxuICAgICAgICAnSUdVQUwnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSA9PSBiIH0sXHJcbiAgICAgICAgJ0RJRkYnOiBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAhPSBiIH0sXHJcbiAgICAgICAgJ0VOJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgPT09IGIgfSxcclxuICAgICAgICAnQU5EJzogZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEgJiYgYiB9LFxyXG4gICAgICAgICdPUic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIHx8IGIgfSxcclxuICAgICAgICAnKic6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiB0cnVlIH0sXHJcbiAgICAgICAgJ01PRCc6IGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiArYSAlICtiID09IDAgfSxcclxuICAgICAgICAvLyAuLi5cclxuICAgIH07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhciBzaSBlbCBwcm9kdWN0byBxdWUgc2Vyw4PCoSBoaWpvLCBjdW1wbGUgY29uIGxhcyBjYXJhY3RlcmlzdGljYXNcclxuICAgICAqIEBwYXJhbSBtM1Byb2NQS0cgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdG8gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWYWxpZGFyU2lFc1RpcG8obTNQcm9jUEtHOiBUeXBlTTNQcmRHcnAsIHByb2R1Y3RvOiBUeXBlTTNQcmRHcnApIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAobTNQcm9jUEtHLk0zUEFDS0JZVElQTy5maW5kKHggPT4geC5ERVNUSU5PID09IHByb2R1Y3RvLlRJUE8pKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2h7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwbGljYWNpb24gZGUgcmVnbGFzIGRlIHBhcXVldGVzLCB0ZW5pZW5kbyBlbiBjdWVudGEgYWwgaW5mb3JtYWNpw4PCs24gZGVsIHByb2R1Y3RvIGluZ3Jlc2Fkby5cclxuICAgICAqIEBwYXJhbSBtM1Byb2NQS0cgXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdG8gXHJcbiAgICAgKiBAcGFyYW0gb00zUEl0ZW1zV0VCIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgR2VuZXJhVmFsaWRhY2lvbmVzKG0zUHJvY1BLRzogVHlwZU0zUHJkR3JwLCBwcm9kdWN0bzogVHlwZU0zUHJkR3JwLCBvTTNQSXRlbXNXRUI6IE0zUEl0ZW1zV0VCKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIGJSZXNwOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgb00zUEFDS0JZVElQTzogTTNQcmRQYWNrQnlUaXBvID0gbTNQcm9jUEtHLk0zUEFDS0JZVElQTy5maW5kKHggPT4geC5ERVNUSU5PID09IHByb2R1Y3RvLlRJUE8pO1xyXG4gICAgICAgICAgICBpZiAob00zUEFDS0JZVElQTykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IG9NM1BBQ0tCWVRJUE8uTTNQQUNLUkVHTEFTLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9NM1BhY2tCeVJlZ2xhczogTTNQYWNrQnlSZWdsYXMgPSBvTTNQQUNLQllUSVBPLk0zUEFDS1JFR0xBU1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAvL1NlIGVzdGEgdmFsaWRhbmRvIGVsIHBhcGEgZGVsIHBhcXVldGUuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcGVyYXRvcnNbb00zUGFja0J5UmVnbGFzLk9wZXJhY2lvbl0odGhpcy5HZXRQYXJhbWV0cm9zKG9NM1BhY2tCeVJlZ2xhcy5QYXJhbTEsIG0zUHJvY1BLRykgLCB0aGlzLkdldFBhcmFtZXRyb3Mob00zUGFja0J5UmVnbGFzLlBhcmFtMiwgbTNQcm9jUEtHKSkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZhbGlkYWNpb25BY2Npb24ob00zUGFja0J5UmVnbGFzLkFjY2lvbiwgb00zUEl0ZW1zV0VCKTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3AgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGJSZXNwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhY2nDg8KzbiBkZSBhY2Npb24gZGUgcmVnbGFzIGRlIHBhcXVldGUuXHJcbiAgICAgKiBAcGFyYW0gc0FjY2lvbiBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBWYWxpZGFjaW9uQWNjaW9uKHNBY2Npb246c3RyaW5nLCBvTTNQSXRlbXNXRUI6TTNQSXRlbXNXRUIpe1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgaWYoc0FjY2lvbiAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb0FjY2lvbjphbnkgPSBKU09OLnBhcnNlKHNBY2Npb24pO1xyXG4gICAgICAgICAgICAgICAgaWYob0FjY2lvbi5BY2Npb24pe1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvQWNjaW9uLkFjY2lvbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYW50aWRhZFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb00zUEl0ZW1zV0VCLmRDYW50aWRhZCA9IG9BY2Npb24uVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9Y2F0Y2goZXgpe1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRlbmVyIGluZm9ybWFjacODwrNuIGRlIHBhcmFtZXRyb3MsIHRlbmllbmRvIGVuIGN1ZW50YSBsYXMgcmVnbGFzLlxyXG4gICAgICogQHBhcmFtIHBhcmFtZXRybyBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0byBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBHZXRQYXJhbWV0cm9zKHBhcmFtZXRybzogc3RyaW5nLCBwcm9kdWN0bzogVHlwZU0zUHJkR3JwKSB7XHJcbiAgICAgICAgdmFyIHNQYXJhbTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcmVnbGE6IHN0cmluZyA9IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMF07XHJcbiAgICAgICAgICAgIHN3aXRjaCAocmVnbGEudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBcIkFESVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHByb2R1Y3RvLkxvTTNQcmRBZGljaW9uYWxlcy5maW5kKHggPT4geC5BVFJJQlVUTyA9PSBwYXJhbWV0cm8uc3BsaXQoXCJfXCIpWzFdKS5WQUxPUjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT05TVFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHNQYXJhbSA9IHBhcmFtZXRyby5zcGxpdChcIl9cIilbMV07XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlZ2xhLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlNLUFwiKSApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzUGFyYW0gPSBwcm9kdWN0by5Mb00zUHJkR2VuZXJhbFswXVtyZWdsYV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaHtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzUGFyYW07XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbn0iLCJpbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZpbHRyb3NEaWFyaW9PZmZMaW5lIHtcclxuICAgIHB1YmxpYyBGaWx0cmFyQnlGZWNoYXNPZmYoRGF0YSwgQWRkVG9Eb2M6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHJvd3M6IEFycmF5PGFueT47XHJcbiAgICAgICAgICAgIC8vdmFyIG5ld1Jvd3MgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICAgICAgICB2YXIgZmVjaGFJID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkZlY2hhSXRDT0ZGXCIpO1xyXG4gICAgICAgICAgICB2YXIgZmVjaGFGID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcIkZlY2hhRnRDT0ZGXCIpO1xyXG4gICAgICAgICAgICByb3dzID0gRGF0YS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGZlY2hhRiAmJiBmZWNoYUkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpRkluaWNpbyA9IHRoaXMuR2V0RmVjaGFOdW1iZXIoZmVjaGFJKTtcclxuICAgICAgICAgICAgICAgIHZhciBpRkZpbmFsID0gdGhpcy5HZXRGZWNoYU51bWJlcihmZWNoYUYpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coaUZJbmljaW8pXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpRkZpbmFsKVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG0zcDogYW55ID0gcm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0zcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmVjaGFQcm9jID0gdGhpcy5HZXRGZWNoYU51bWJlcihtM3AuRmVjaGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZlY2hhUHJvYylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCtmZWNoYVByb2MgPj0gK2lGSW5pY2lvICYmICtmZWNoYVByb2MgPD0gK2lGRmluYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV3Um93cy5wdXNoKHJvd3NbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9Eb2MobTNwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpbHRyYXJCeUZlY2hhc09mZlwiKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhleClcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEZpbHRyYXJCeVRleHRvKERhdGEsIHNUZXh0bzogc3RyaW5nLCBBZGRUb0RvYzogRnVuY3Rpb24pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgcm93czogQXJyYXk8YW55PjtcclxuXHJcbiAgICAgICAgICAgIHJvd3MgPSBEYXRhLnJvd3M7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG0zcDogYW55ID0gcm93c1tpXS5kb2M7XHJcbiAgICAgICAgICAgICAgICBpZiAobTNwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0zcC5JZE0zLmluY2x1ZGVzKHNUZXh0bykgfHwgKG0zcC5uZG9jVUFjdGl2byAmJiBtM3AubmRvY1VBY3Rpdm8uaW5jbHVkZXMoc1RleHRvKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uZXdSb3dzLnB1c2gocm93c1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZFRvRG9jKG0zcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmlsdHJhckJ5RmVjaGFzT2ZmXCIpXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIEdldEZlY2hhTnVtYmVyKHNkYXRlOiBzdHJpbmcpIHtcclxuICAgICAgICAvL3ZhciBkYXRlID0gbmV3IERhdGUoc2RhdGUpO1xyXG4gICAgICAgIHZhciBkID0gbW9tZW50KHNkYXRlKS5mb3JtYXQoJ1lZWVlNTUREJyk7XHJcblxyXG4gICAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IFBvdWNoREIgZnJvbSAncG91Y2hkYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuLy8gQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ291Y2hQZXJ4aXBvIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENyZWFyUG91Y2hTaW5jcm9uaXphY2lvbigpIHtcclxuXHJcbiAgICAgICAgc0lka2F0aW9zID0gdGhpcy5HZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpO1xyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUG91Y2hEQihcInBlcnh0aXBvX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJwZXJ4dGlwb19cIiArIHNJZGthdGlvcy50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB0aGlzLmlzSW5zdGFudGlhdGVkID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSU5TVEFOQ0UgcGVyeHRpcG8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiQ29uZmlnSlNPTlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGpzb24uQ291Y2hEQk0zO1xyXG4gICAgfVxyXG5cclxuICAgIC8vSWRrYXRpb3MgcXVlIHNlIGNhcmdhLCBjdWFuZG8gc2UgaW5pY2lhIGVsIHJlZGlyZWNjaW9uYW1pZW50byBoYWNpYSBlbCBXRThcclxuICAgIHB1YmxpYyBHZXRJZEthdGlvc0xWTDFGcm9tU2Vzc2lvbigpIHtcclxuICAgICAgICB2YXIgc1Nlc3Npb25MVkwxTTMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFwiU2Vzc2lvbkxWTDFNM1wiKTtcclxuICAgICAgICB2YXIgb1Nlc3Npb25MVkwxTTM7XHJcbiAgICAgICAgaWYgKHNTZXNzaW9uTFZMMU0zICE9PSB1bmRlZmluZWQgJiYgc1Nlc3Npb25MVkwxTTMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBvU2Vzc2lvbkxWTDFNMyA9IEpTT04ucGFyc2Uoc1Nlc3Npb25MVkwxTTMpO1xyXG4gICAgICAgICAgICBpZiAob1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1MgIT09IHVuZGVmaW5lZCAmJiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb1Nlc3Npb25MVkwxTTMuVXN1YXJpb1Npc3RlbWEuSURLQVRJT1M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN5bmMocmVtb3RlOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgcmVtb3RlRGF0YWJhc2UgPSBuZXcgUG91Y2hEQihyZW1vdGUsIHsgYXV0b19jb21wYWN0aW9uOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGFiYXNlLnJlcGxpY2F0ZS5mcm9tKHJlbW90ZURhdGFiYXNlLCB7XHJcbiAgICAgICAgICAgIGxpdmU6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXRyeTogZmFsc2VcclxuICAgICAgICB9KS5vbignY29tcGxldGUnLCBjaGFuZ2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUExFVE8gQ0FNQklPIHBlcnh0aXBvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2NoYW5nZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0hBTkdFIENBTUJJTyBwZXJ4dGlwbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgICAgIH0pLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvclwiKVxyXG4gICAgICAgICAgICAvLyBib28sIHNvbWV0aGluZyB3ZW50IHdyb25nIVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZldGNoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmFsbERvY3MoeyBpbmNsdWRlX2RvY3M6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVuY2FiZXphZG8oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogZmFsc2UgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGEgPSBhd2FpdCB0aGlzLmRhdGFiYXNlLmRlc3Ryb3koKVxyXG4gICAgICAgIHJldHVybiByZXNwdWVzdGFcclxuICAgIH1cclxufSIsImltcG9ydCB7IEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCBQb3VjaERCIGZyb20gJ3BvdWNoZGInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbi8vIEBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvdWNoRGluYW1CeVByb2Nlc29zIHtcclxuXHJcbiAgICBwcml2YXRlIGlzSW5zdGFudGlhdGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZTogYW55O1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zdGFudGlhdGVkKSB7XHJcbiAgICAgICAgICAgdGhpcy5DcmVhclBvdWNoU2luY3Jvbml6YWNpb24oKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ3JlYXJQb3VjaFNpbmNyb25pemFjaW9uKCkge1xyXG4gICAgICAgIFxyXG4gICAgICAgIHNJZGthdGlvcyA9IHRoaXMuR2V0SWRLYXRpb3NMVkwxRnJvbVNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlID0gbmV3IFBvdWNoREIoXCJkaW5hbXhwcm9jX1wiICsgc0lka2F0aW9zLCB7IGF1dG9fY29tcGFjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICB2YXIgc0lka2F0aW9zOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIHRoaXMuc3luYyh0aGlzLkdldFNlcnZlcigpICsgXCJkaW5hbXhwcm9jX1wiICsgc0lka2F0aW9zLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIHRoaXMuaXNJbnN0YW50aWF0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTlNUQU5DRSBkaW5hbXhwcm9jXyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiKVxyXG4gICAgXHJcbn1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2VydmVyKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGpzb24gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJDb25maWdKU09OXCIpKTtcclxuICAgICAgICByZXR1cm4ganNvbi5Db3VjaERCTTM7XHJcbiAgICB9XHJcblxyXG4gICAgLy9JZGthdGlvcyBxdWUgc2UgY2FyZ2EsIGN1YW5kbyBzZSBpbmljaWEgZWwgcmVkaXJlY2Npb25hbWllbnRvIGhhY2lhIGVsIFdFOFxyXG4gICAgcHVibGljIEdldElkS2F0aW9zTFZMMUZyb21TZXNzaW9uKCkge1xyXG4gICAgICAgIHZhciBzU2Vzc2lvbkxWTDFNMyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJTZXNzaW9uTFZMMU0zXCIpO1xyXG4gICAgICAgIHZhciBvU2Vzc2lvbkxWTDFNMztcclxuICAgICAgICBpZiAoc1Nlc3Npb25MVkwxTTMgIT09IHVuZGVmaW5lZCAmJiBzU2Vzc2lvbkxWTDFNMyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9TZXNzaW9uTFZMMU0zID0gSlNPTi5wYXJzZShzU2Vzc2lvbkxWTDFNMyk7XHJcbiAgICAgICAgICAgIGlmIChvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUyAhPT0gdW5kZWZpbmVkICYmIG9TZXNzaW9uTFZMMU0zLlVzdWFyaW9TaXN0ZW1hLklES0FUSU9TICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvU2Vzc2lvbkxWTDFNMy5Vc3VhcmlvU2lzdGVtYS5JREtBVElPUztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3luYyhyZW1vdGU6IHN0cmluZykge1xyXG4gICAgICAgIGxldCByZW1vdGVEYXRhYmFzZSA9IG5ldyBQb3VjaERCKHJlbW90ZSwgeyBhdXRvX2NvbXBhY3Rpb246IHRydWUgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YWJhc2UucmVwbGljYXRlLmZyb20ocmVtb3RlRGF0YWJhc2UsIHtcclxuICAgICAgICAgICAgbGl2ZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldHJ5OiBmYWxzZVxyXG4gICAgICAgIH0pLm9uKCdjb21wbGV0ZScsIGNoYW5nZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT01QTEVUTyBDQU1CSU8gZGluYW14cHJvY18gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIilcclxuICAgICAgICB9KS5vbignY2hhbmdlJywgY2hhbmdlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDSEFOR0UgQ0FNQklPIGRpbmFteHByb2NfICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCIpXHJcbiAgICAgICAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yXCIpXHJcbiAgICAgICAgICAgIC8vIGJvbywgc29tZXRoaW5nIHdlbnQgd3JvbmchXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmV0Y2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuYWxsRG9jcyh7IGluY2x1ZGVfZG9jczogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RW5jYWJlemFkbygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5hbGxEb2NzKHtpbmNsdWRlX2RvY3M6IGZhbHNlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYW5nZUxpc3RlbmVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHVibGljIGFzeW5jIERlc3Ryb3koKSB7XHJcbiAgICAgICAgdmFyIHJlc3B1ZXN0YTtcclxuICAgICAgICByZXNwdWVzdGE9IGF3YWl0IHRoaXMuZGF0YWJhc2UuZGVzdHJveSgpXHJcbiAgICAgICAgcmV0dXJuIHJlc3B1ZXN0YVxyXG4gICAgfVxyXG59Il0sIm5hbWVzIjpbIm1vbWVudCIsInRzbGliXzEuX192YWx1ZXMiLCJfLmNsb25lRGVlcCIsIlBvc3RTZXJ2aWNlTTMiLCJ0c2xpYl8xLl9fZGVjb3JhdGUiLCJ0c2xpYl8xLl9fcGFyYW0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7SUFzQkksdUJBQ1ksTUFDQTtRQURBLFNBQUksR0FBSixJQUFJO1FBQ0osZUFBVSxHQUFWLFVBQVU7UUFFbEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBQ3ZCOzs7O0lBRU0sb0NBQVk7Ozs7O1FBRWYsSUFBSSxJQUFJLENBQU07O1FBQ2QsSUFBSSxXQUFXLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxJQUFJLFdBQVcsRUFBRTs7WUFDYixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFO2dCQUM5QixJQUFJLEdBQUcsV0FBVyxDQUFDO2FBQ3RCO1NBQ0o7YUFDSTtZQUNELElBQUksR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdB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
|