import base64,json,sys,types
sources=json.loads(base64.b64decode("eyJydW50aW1lX3Byb3ZlbmFuY2UiOiAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9uc1xuXG5pbXBvcnQgb3NcbmltcG9ydCByZVxuZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgYXNkaWN0LCBkYXRhY2xhc3NcblxuXG5VTlZFUklGSUVEID0gXCJVTlZFUklGSUVEXCJcbl9HSVRfRElHRVNUID0gcmUuY29tcGlsZShyXCJeKD86WzAtOWEtZkEtRl17NDB9fFswLTlhLWZBLUZdezY0fSkkXCIpXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIFJ1bnRpbWVQcm92ZW5hbmNlOlxuICAgIHNvdXJjZV9jb21taXQ6IHN0clxuICAgIHNvdXJjZV9yZWY6IHN0clxuICAgIGJ1aWxkX2lkOiBzdHJcbiAgICB2ZXJpZmllZDogYm9vbFxuXG4gICAgZGVmIGFzX2RpY3Qoc2VsZikgLT4gZGljdFtzdHIsIHN0ciB8IGJvb2xdOlxuICAgICAgICByZXR1cm4gYXNkaWN0KHNlbGYpXG5cblxuZGVmIF9lbnZfdmFsdWUobmFtZTogc3RyKSAtPiBzdHI6XG4gICAgcmF3ID0gb3MuZW52aXJvbi5nZXQobmFtZSlcbiAgICBpZiByYXcgaXMgTm9uZTpcbiAgICAgICAgcmV0dXJuIFVOVkVSSUZJRURcbiAgICB2YWx1ZSA9IHJhdy5zdHJpcCgpXG4gICAgcmV0dXJuIHZhbHVlIGlmIHZhbHVlIGVsc2UgVU5WRVJJRklFRFxuXG5cbmRlZiBjdXJyZW50X3J1bnRpbWVfcHJvdmVuYW5jZSgpIC0+IFJ1bnRpbWVQcm92ZW5hbmNlOlxuICAgIHNvdXJjZV9jb21taXQgPSBfZW52X3ZhbHVlKFwiQk9EVUxTS0lIQUxfU09VUkNFX0NPTU1JVFwiKVxuICAgIHNvdXJjZV9yZWYgPSBfZW52X3ZhbHVlKFwiQk9EVUxTS0lIQUxfU09VUkNFX1JFRlwiKVxuICAgIGJ1aWxkX2lkID0gX2Vudl92YWx1ZShcIkJPRFVMU0tJSEFMX0JVSUxEX0lEXCIpXG5cbiAgICBjb21taXRfdmVyaWZpZWQgPSBib29sKF9HSVRfRElHRVNULmZ1bGxtYXRjaChzb3VyY2VfY29tbWl0KSlcbiAgICB2ZXJpZmllZCA9IChcbiAgICAgICAgY29tbWl0X3ZlcmlmaWVkXG4gICAgICAgIGFuZCBzb3VyY2VfcmVmICE9IFVOVkVSSUZJRURcbiAgICAgICAgYW5kIGJ1aWxkX2lkICE9IFVOVkVSSUZJRURcbiAgICApXG5cbiAgICByZXR1cm4gUnVudGltZVByb3ZlbmFuY2UoXG4gICAgICAgIHNvdXJjZV9jb21taXQ9c291cmNlX2NvbW1pdC5sb3dlcigpIGlmIGNvbW1pdF92ZXJpZmllZCBlbHNlIHNvdXJjZV9jb21taXQsXG4gICAgICAgIHNvdXJjZV9yZWY9c291cmNlX3JlZixcbiAgICAgICAgYnVpbGRfaWQ9YnVpbGRfaWQsXG4gICAgICAgIHZlcmlmaWVkPXZlcmlmaWVkLFxuICAgICkiLCAiZW5naW5lIjogImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnNcblxuaW1wb3J0IGhhc2hsaWJcbmltcG9ydCBqc29uXG5mcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3NcbmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lXG5mcm9tIGVudW0gaW1wb3J0IEVudW1cbmZyb20gdHlwaW5nIGltcG9ydCBJdGVyYWJsZSwgTWFwcGluZywgU2VxdWVuY2VcblxuZnJvbSAucnVudGltZV9wcm92ZW5hbmNlIGltcG9ydCBSdW50aW1lUHJvdmVuYW5jZSwgY3VycmVudF9ydW50aW1lX3Byb3ZlbmFuY2VcblxuQUxHT1JJVEhNX1ZFUlNJT04gPSBcIjIuMS4yXCJcblxuXG5jbGFzcyBDbGFpbVR5cGUoc3RyLCBFbnVtKTpcbiAgICBVTkNMQVNTSUZJRUQgPSBcInVuY2xhc3NpZmllZFwiXG4gICAgT0JTRVJWQVRJT04gPSBcIm9ic2VydmF0aW9uXCJcbiAgICBJTkZFUkVOQ0UgPSBcImluZmVyZW5jZVwiXG4gICAgRVNUSU1BVEUgPSBcImVzdGltYXRlXCJcbiAgICBBQ1RJT05fU1RBVEUgPSBcImFjdGlvbl9zdGF0ZVwiXG4gICAgUklTS19TRU5TSVRJVkUgPSBcInJpc2tfc2Vuc2l0aXZlXCJcblxuXG5jbGFzcyBDbGFzc2lmaWNhdGlvbihzdHIsIEVudW0pOlxuICAgIEZBQ1QgPSBcIkZBQ1RcIlxuICAgIElORkVSRU5DRSA9IFwiSU5GRVJFTkNFXCJcbiAgICBFU1RJTUFURSA9IFwiRVNUSU1BVEVcIlxuICAgIFVOS05PV04gPSBcIlVOS05PV05cIlxuICAgIFJFRlVURUQgPSBcIlJFRlVURURcIlxuICAgIENPTkZMSUNUID0gXCJDT05GTElDVFwiXG5cblxuY2xhc3MgVmVyZGljdChzdHIsIEVudW0pOlxuICAgIEFQUFJPVkUgPSBcIkFQUFJPVkVcIlxuICAgIEJMT0NLID0gXCJCTE9DS1wiXG4gICAgRVNDQUxBVEUgPSBcIkVTQ0FMQVRFXCJcblxuXG5jbGFzcyBSaXNrTGV2ZWwoc3RyLCBFbnVtKTpcbiAgICBMT1cgPSBcImxvd1wiXG4gICAgTUVESVVNID0gXCJtZWRpdW1cIlxuICAgIEhJR0ggPSBcImhpZ2hcIlxuXG5cbmNsYXNzIERpcmVjdG5lc3Moc3RyLCBFbnVtKTpcbiAgICBESVJFQ1QgPSBcImRpcmVjdFwiXG4gICAgSU5ESVJFQ1QgPSBcImluZGlyZWN0XCJcblxuXG5jbGFzcyBTb3VyY2VSb2xlKHN0ciwgRW51bSk6XG4gICAgRVhFQ1VUT1IgPSBcImV4ZWN1dG9yXCJcbiAgICBWRVJJRklFUiA9IFwidmVyaWZpZXJcIlxuICAgIEVYVEVSTkFMID0gXCJleHRlcm5hbFwiXG5cblxuY2xhc3MgRXZpZGVuY2VPcmlnaW4oc3RyLCBFbnVtKTpcbiAgICBFWFRFUk5BTF9TT1VSQ0UgPSBcImV4dGVybmFsX3NvdXJjZVwiXG4gICAgVE9PTF9PQlNFUlZBVElPTiA9IFwidG9vbF9vYnNlcnZhdGlvblwiXG4gICAgQ09NUFVURURfUkVTVUxUID0gXCJjb21wdXRlZF9yZXN1bHRcIlxuICAgIE1FTU9SWSA9IFwibWVtb3J5XCJcbiAgICBVU0VSX0FTU0VSVElPTiA9IFwidXNlcl9hc3NlcnRpb25cIlxuICAgIFVTRVJfU0VMRl9SRVBPUlQgPSBcInVzZXJfc2VsZl9yZXBvcnRcIlxuICAgIFVTRVJfUFJFRkVSRU5DRSA9IFwidXNlcl9wcmVmZXJlbmNlXCJcbiAgICBVU0VSX0lOU1RSVUNUSU9OID0gXCJ1c2VyX2luc3RydWN0aW9uXCJcblxuXG5jbGFzcyBBdXRob3JpdHlTY29wZShzdHIsIEVudW0pOlxuICAgIEVYVEVSTkFMX0ZBQ1QgPSBcImV4dGVybmFsX2ZhY3RcIlxuICAgIFNZU1RFTV9TVEFURSA9IFwic3lzdGVtX3N0YXRlXCJcbiAgICBVU0VSX1NFTEZfUkVQT1JUID0gXCJ1c2VyX3NlbGZfcmVwb3J0XCJcbiAgICBVU0VSX1BSRUZFUkVOQ0UgPSBcInVzZXJfcHJlZmVyZW5jZVwiXG4gICAgVVNFUl9JTlNUUlVDVElPTiA9IFwidXNlcl9pbnN0cnVjdGlvblwiXG5cblxuY2xhc3MgQW5zd2VyYWJpbGl0eVN0YXR1cyhzdHIsIEVudW0pOlxuICAgIEFOU1dFUkFCTEUgPSBcImFuc3dlcmFibGVcIlxuICAgIFBBUlRJQUxMWV9BTlNXRVJBQkxFID0gXCJwYXJ0aWFsbHlfYW5zd2VyYWJsZVwiXG4gICAgVU5ERVJTUEVDSUZJRUQgPSBcInVuZGVyc3BlY2lmaWVkXCJcbiAgICBGQUxTRV9QUkVNSVNFID0gXCJmYWxzZV9wcmVtaXNlXCJcbiAgICBDT05UUkFESUNUT1JZX0lOUFVUID0gXCJjb250cmFkaWN0b3J5X2lucHV0XCJcbiAgICBORUVEU19DTEFSSUZJQ0FUSU9OID0gXCJuZWVkc19jbGFyaWZpY2F0aW9uXCJcbiAgICBPVVRfT0ZfU0NPUEUgPSBcIm91dF9vZl9zY29wZVwiXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIENsYWltOlxuICAgIGNsYWltX2lkOiBzdHJcbiAgICB0ZXh0OiBzdHJcbiAgICBjbGFpbV90eXBlOiBDbGFpbVR5cGVcbiAgICByaXNrOiBSaXNrTGV2ZWwgPSBSaXNrTGV2ZWwuTE9XXG4gICAgY29uc2VxdWVudGlhbDogYm9vbCA9IFRydWVcbiAgICBhdXRob3JpdHlfc2NvcGU6IEF1dGhvcml0eVNjb3BlID0gQXV0aG9yaXR5U2NvcGUuRVhURVJOQUxfRkFDVFxuICAgIGFuc3dlcmFiaWxpdHk6IEFuc3dlcmFiaWxpdHlTdGF0dXMgPSBBbnN3ZXJhYmlsaXR5U3RhdHVzLkFOU1dFUkFCTEVcblxuXG5AZGF0YWNsYXNzKGZyb3plbj1UcnVlKVxuY2xhc3MgRXZpZGVuY2U6XG4gICAgc291cmNlX2lkOiBzdHJcbiAgICBzdXBwb3J0czogYm9vbFxuICAgIG9ic2VydmVkX2F0OiBkYXRldGltZVxuICAgIGRpcmVjdG5lc3M6IERpcmVjdG5lc3NcbiAgICBwb3N0X2FjdGlvbjogYm9vbCA9IEZhbHNlXG4gICAgZWxpZ2libGU6IGJvb2wgPSBUcnVlXG4gICAgZXZpZGVuY2VfaWQ6IHN0ciB8IE5vbmUgPSBOb25lXG4gICAgc291cmNlX3JvbGU6IFNvdXJjZVJvbGUgPSBTb3VyY2VSb2xlLkVYVEVSTkFMXG4gICAgc291cmNlX3JlZjogc3RyIHwgTm9uZSA9IE5vbmVcbiAgICBpbmRlcGVuZGVuY2VfZ3JvdXA6IHN0ciB8IE5vbmUgPSBOb25lXG4gICAgY29udGVudF9zaGEyNTY6IHN0ciB8IE5vbmUgPSBOb25lXG4gICAgb3JpZ2luOiBFdmlkZW5jZU9yaWdpbiA9IEV2aWRlbmNlT3JpZ2luLkVYVEVSTkFMX1NPVVJDRVxuICAgIGF1dGhvcml0eV9zY29wZTogQXV0aG9yaXR5U2NvcGUgPSBBdXRob3JpdHlTY29wZS5FWFRFUk5BTF9GQUNUXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIFBvbGljeTpcbiAgICB2ZXJzaW9uOiBzdHJcbiAgICBtYXhfYWdlX3NlY29uZHM6IGludFxuICAgIHJlamVjdF9mdXR1cmVfZXZpZGVuY2U6IGJvb2wgPSBUcnVlXG4gICAgcmVxdWlyZV9pbmRlcGVuZGVudF9hY3Rpb25fZXZpZGVuY2U6IGJvb2wgPSBUcnVlXG4gICAgbWVkaXVtX3Jpc2tfbWluX2luZGVwZW5kZW50X3NvdXJjZXM6IGludCA9IDJcbiAgICByZXF1aXJlX3J1bnRpbWVfcHJvdmVuYW5jZTogYm9vbCA9IEZhbHNlXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIFZlcmlmaWNhdGlvblJlc3VsdDpcbiAgICBjbGFpbTogQ2xhaW1cbiAgICBjbGFzc2lmaWNhdGlvbjogQ2xhc3NpZmljYXRpb25cbiAgICB2ZXJkaWN0OiBWZXJkaWN0XG4gICAgcmVhc29uOiBzdHJcbiAgICByZWNlaXB0OiBkaWN0XG4gICAgZmFpbHVyZV9yZWNvcmQ6IGRpY3QgfCBOb25lXG5cblxuQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSlcbmNsYXNzIENvbXBvdW5kUmVzdWx0OlxuICAgIHJlc3VsdHM6IHR1cGxlW1ZlcmlmaWNhdGlvblJlc3VsdCwgLi4uXVxuICAgIHZlcmRpY3Q6IFZlcmRpY3RcblxuXG5kZWYgX2lzX2F3YXJlKHZhbHVlOiBkYXRldGltZSkgLT4gYm9vbDpcbiAgICByZXR1cm4gdmFsdWUudHppbmZvIGlzIG5vdCBOb25lIGFuZCB2YWx1ZS51dGNvZmZzZXQoKSBpcyBub3QgTm9uZVxuXG5cbmRlZiBfZWZmZWN0aXZlX2V2aWRlbmNlX2lkKGl0ZW06IEV2aWRlbmNlKSAtPiBzdHI6XG4gICAgcmV0dXJuIGl0ZW0uZXZpZGVuY2VfaWQgb3IgaXRlbS5zb3VyY2VfaWRcblxuXG5kZWYgX3ZhbGlkYXRlX2h1bWFuX2FwcHJvdmFsKHZhbHVlOiBib29sLCAqLCBmaWVsZF9uYW1lOiBzdHIgPSBcImh1bWFuX2FwcHJvdmVkXCIpIC0+IE5vbmU6XG4gICAgaWYgdHlwZSh2YWx1ZSkgaXMgbm90IGJvb2w6XG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihmXCJ7ZmllbGRfbmFtZX0gbXVzdCBiZSBib29sXCIpXG5cblxuZGVmIF92YWxpZGF0ZV9ub25fZW1wdHlfc3RyaW5nKHZhbHVlOiBvYmplY3QsIGZpZWxkX25hbWU6IHN0cikgLT4gTm9uZTpcbiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSBvciBub3QgdmFsdWUuc3RyaXAoKTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmXCJ7ZmllbGRfbmFtZX0gbXVzdCBiZSBub24tZW1wdHkgc3RyaW5nXCIpXG5cblxuZGVmIF92YWxpZGF0ZV9wcm92ZW5hbmNlX2lucHV0cyhcbiAgICBjbGFpbTogQ2xhaW0sIGV2aWRlbmNlOiBTZXF1ZW5jZVtFdmlkZW5jZV0sIHBvbGljeTogUG9saWN5XG4pIC0+IE5vbmU6XG4gICAgX3ZhbGlkYXRlX25vbl9lbXB0eV9zdHJpbmcoY2xhaW0uY2xhaW1faWQsIFwiY2xhaW1faWRcIilcbiAgICBfdmFsaWRhdGVfbm9uX2VtcHR5X3N0cmluZyhjbGFpbS50ZXh0LCBcImNsYWltLnRleHRcIilcbiAgICBfdmFsaWRhdGVfbm9uX2VtcHR5X3N0cmluZyhwb2xpY3kudmVyc2lvbiwgXCJwb2xpY3kudmVyc2lvblwiKVxuICAgIGlmIG5vdCBpc2luc3RhbmNlKGNsYWltLmF1dGhvcml0eV9zY29wZSwgQXV0aG9yaXR5U2NvcGUpOlxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXCJjbGFpbS5hdXRob3JpdHlfc2NvcGUgbXVzdCBiZSBBdXRob3JpdHlTY29wZVwiKVxuICAgIGlmIG5vdCBpc2luc3RhbmNlKGNsYWltLmFuc3dlcmFiaWxpdHksIEFuc3dlcmFiaWxpdHlTdGF0dXMpOlxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXCJjbGFpbS5hbnN3ZXJhYmlsaXR5IG11c3QgYmUgQW5zd2VyYWJpbGl0eVN0YXR1c1wiKVxuICAgIGZvciBpdGVtIGluIGV2aWRlbmNlOlxuICAgICAgICBfdmFsaWRhdGVfbm9uX2VtcHR5X3N0cmluZyhpdGVtLnNvdXJjZV9pZCwgXCJldmlkZW5jZS5zb3VyY2VfaWRcIilcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbS5vcmlnaW4sIEV2aWRlbmNlT3JpZ2luKTpcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcImV2aWRlbmNlLm9yaWdpbiBtdXN0IGJlIEV2aWRlbmNlT3JpZ2luXCIpXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0uYXV0aG9yaXR5X3Njb3BlLCBBdXRob3JpdHlTY29wZSk6XG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXCJldmlkZW5jZS5hdXRob3JpdHlfc2NvcGUgbXVzdCBiZSBBdXRob3JpdHlTY29wZVwiKVxuXG5cblxuZGVmIF92YWxpZGF0ZV9jb21tb25faW5wdXRzKFxuICAgIGV2aWRlbmNlOiBTZXF1ZW5jZVtFdmlkZW5jZV0sICosIHBvbGljeTogUG9saWN5LCBldmFsdWF0aW9uX3RpbWU6IGRhdGV0aW1lXG4pIC0+IE5vbmU6XG4gICAgaWYgbm90IF9pc19hd2FyZShldmFsdWF0aW9uX3RpbWUpOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiZXZhbHVhdGlvbl90aW1lIG11c3QgYmUgdGltZXpvbmUtYXdhcmVcIilcbiAgICBpZiBwb2xpY3kubWF4X2FnZV9zZWNvbmRzIDwgMDpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIm1heF9hZ2Vfc2Vjb25kcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZVwiKVxuICAgIGlmIHBvbGljeS5tZWRpdW1fcmlza19taW5faW5kZXBlbmRlbnRfc291cmNlcyA8IDE6XG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXCJtZWRpdW1fcmlza19taW5faW5kZXBlbmRlbnRfc291cmNlcyBtdXN0IGJlIGF0IGxlYXN0IDFcIilcbiAgICBpZiB0eXBlKHBvbGljeS5yZXF1aXJlX3J1bnRpbWVfcHJvdmVuYW5jZSkgaXMgbm90IGJvb2w6XG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcInJlcXVpcmVfcnVudGltZV9wcm92ZW5hbmNlIG11c3QgYmUgYm9vbFwiKVxuICAgIGZvciBpdGVtIGluIGV2aWRlbmNlOlxuICAgICAgICBpZiBub3QgX2lzX2F3YXJlKGl0ZW0ub2JzZXJ2ZWRfYXQpOlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIm9ic2VydmVkX2F0IG11c3QgYmUgdGltZXpvbmUtYXdhcmVcIilcbiAgICAgICAgaWYgaXRlbS5ldmlkZW5jZV9pZCBpcyBub3QgTm9uZSBhbmQgbm90IGl0ZW0uZXZpZGVuY2VfaWQuc3RyaXAoKTpcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXCJldmlkZW5jZV9pZCBtdXN0IGJlIG5vbi1lbXB0eSB3aGVuIHN1cHBsaWVkXCIpXG4gICAgICAgIGlmIGl0ZW0uc291cmNlX3JlZiBpcyBub3QgTm9uZSBhbmQgbm90IGl0ZW0uc291cmNlX3JlZi5zdHJpcCgpOlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcInNvdXJjZV9yZWYgbXVzdCBiZSBub24tZW1wdHkgd2hlbiBzdXBwbGllZFwiKVxuICAgICAgICBpZiBpdGVtLmluZGVwZW5kZW5jZV9ncm91cCBpcyBub3QgTm9uZSBhbmQgbm90IGl0ZW0uaW5kZXBlbmRlbmNlX2dyb3VwLnN0cmlwKCk6XG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiaW5kZXBlbmRlbmNlX2dyb3VwIG11c3QgYmUgbm9uLWVtcHR5IHdoZW4gc3VwcGxpZWRcIilcbiAgICAgICAgaWYgaXRlbS5jb250ZW50X3NoYTI1NiBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgIGRpZ2VzdCA9IGl0ZW0uY29udGVudF9zaGEyNTYubG93ZXIoKVxuICAgICAgICAgICAgaWYgbGVuKGRpZ2VzdCkgIT0gNjQgb3IgYW55KGNoIG5vdCBpbiBcIjAxMjM0NTY3ODlhYmNkZWZcIiBmb3IgY2ggaW4gZGlnZXN0KTpcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiY29udGVudF9zaGEyNTYgbXVzdCBiZSBhIDY0LWNoYXJhY3RlciBoZXhhZGVjaW1hbCBTSEEtMjU2XCIpXG5cblxuZGVmIF92YWxpZGF0ZV9ldmlkZW5jZV9nYXRlX3R5cGVzKGV2aWRlbmNlOiBTZXF1ZW5jZVtFdmlkZW5jZV0pIC0+IE5vbmU6XG4gICAgZm9yIGl0ZW0gaW4gZXZpZGVuY2U6XG4gICAgICAgIGlmIHR5cGUoaXRlbS5zdXBwb3J0cykgaXMgbm90IGJvb2w6XG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXCJldmlkZW5jZS5zdXBwb3J0cyBtdXN0IGJlIGJvb2xcIilcbiAgICAgICAgaWYgdHlwZShpdGVtLnBvc3RfYWN0aW9uKSBpcyBub3QgYm9vbDpcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcImV2aWRlbmNlLnBvc3RfYWN0aW9uIG11c3QgYmUgYm9vbFwiKVxuICAgICAgICBpZiB0eXBlKGl0ZW0uZWxpZ2libGUpIGlzIG5vdCBib29sOlxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFwiZXZpZGVuY2UuZWxpZ2libGUgbXVzdCBiZSBib29sXCIpXG5cblxuZGVmIF92YWxpZGF0ZV9ldmlkZW5jZV9pZGVudGl0eShldmlkZW5jZTogU2VxdWVuY2VbRXZpZGVuY2VdKSAtPiBOb25lOlxuICAgIGlkcyA9IFtfZWZmZWN0aXZlX2V2aWRlbmNlX2lkKGl0ZW0pIGZvciBpdGVtIGluIGV2aWRlbmNlXVxuICAgIGlmIGxlbihpZHMpICE9IGxlbihzZXQoaWRzKSk6XG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBcImR1cGxpY2F0ZSBldmlkZW5jZV9pZDsgZHVwbGljYXRlIHNvdXJjZV9pZCBmYWxsYmFjayBpZGVudGl0eSBpcyBub3QgYWxsb3dlZFwiXG4gICAgICAgIClcblxuXG5kZWYgX2lzX2ZyZXNoKGl0ZW06IEV2aWRlbmNlLCAqLCBwb2xpY3k6IFBvbGljeSwgZXZhbHVhdGlvbl90aW1lOiBkYXRldGltZSkgLT4gYm9vbDpcbiAgICBhZ2UgPSAoZXZhbHVhdGlvbl90aW1lIC0gaXRlbS5vYnNlcnZlZF9hdCkudG90YWxfc2Vjb25kcygpXG4gICAgaWYgcG9saWN5LnJlamVjdF9mdXR1cmVfZXZpZGVuY2UgYW5kIGFnZSA8IDA6XG4gICAgICAgIHJldHVybiBGYWxzZVxuICAgIHJldHVybiAwIDw9IGFnZSA8PSBwb2xpY3kubWF4X2FnZV9zZWNvbmRzXG5cblxuZGVmIF9lbGlnaWJsZV9ldmlkZW5jZShcbiAgICBldmlkZW5jZTogU2VxdWVuY2VbRXZpZGVuY2VdLCAqLCBwb2xpY3k6IFBvbGljeSwgZXZhbHVhdGlvbl90aW1lOiBkYXRldGltZVxuKSAtPiB0dXBsZVtFdmlkZW5jZSwgLi4uXTpcbiAgICByZXR1cm4gdHVwbGUoXG4gICAgICAgIGl0ZW1cbiAgICAgICAgZm9yIGl0ZW0gaW4gZXZpZGVuY2VcbiAgICAgICAgaWYgaXRlbS5lbGlnaWJsZSBhbmQgX2lzX2ZyZXNoKGl0ZW0sIHBvbGljeT1wb2xpY3ksIGV2YWx1YXRpb25fdGltZT1ldmFsdWF0aW9uX3RpbWUpXG4gICAgKVxuXG5cbl9VU0VSX09SSUdJTlMgPSB7XG4gICAgRXZpZGVuY2VPcmlnaW4uVVNFUl9BU1NFUlRJT04sXG4gICAgRXZpZGVuY2VPcmlnaW4uVVNFUl9TRUxGX1JFUE9SVCxcbiAgICBFdmlkZW5jZU9yaWdpbi5VU0VSX1BSRUZFUkVOQ0UsXG4gICAgRXZpZGVuY2VPcmlnaW4uVVNFUl9JTlNUUlVDVElPTixcbn1cblxuXG5kZWYgX2F1dGhvcml0eV9hbGxvd3MoY2xhaW06IENsYWltLCBpdGVtOiBFdmlkZW5jZSkgLT4gYm9vbDpcbiAgICBpZiBpdGVtLmF1dGhvcml0eV9zY29wZSBpcyBub3QgY2xhaW0uYXV0aG9yaXR5X3Njb3BlOlxuICAgICAgICByZXR1cm4gRmFsc2VcblxuICAgIGlmIGNsYWltLmF1dGhvcml0eV9zY29wZSBpbiB7QXV0aG9yaXR5U2NvcGUuRVhURVJOQUxfRkFDVCwgQXV0aG9yaXR5U2NvcGUuU1lTVEVNX1NUQVRFfTpcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JpZ2luIGluIHtcbiAgICAgICAgICAgIEV2aWRlbmNlT3JpZ2luLkVYVEVSTkFMX1NPVVJDRSxcbiAgICAgICAgICAgIEV2aWRlbmNlT3JpZ2luLlRPT0xfT0JTRVJWQVRJT04sXG4gICAgICAgICAgICBFdmlkZW5jZU9yaWdpbi5DT01QVVRFRF9SRVNVTFQsXG4gICAgICAgIH1cbiAgICBpZiBjbGFpbS5hdXRob3JpdHlfc2NvcGUgaXMgQXV0aG9yaXR5U2NvcGUuVVNFUl9QUkVGRVJFTkNFOlxuICAgICAgICByZXR1cm4gaXRlbS5vcmlnaW4gaW4ge1xuICAgICAgICAgICAgRXZpZGVuY2VPcmlnaW4uVVNFUl9QUkVGRVJFTkNFLFxuICAgICAgICAgICAgRXZpZGVuY2VPcmlnaW4uVVNFUl9TRUxGX1JFUE9SVCxcbiAgICAgICAgICAgIEV2aWRlbmNlT3JpZ2luLlRPT0xfT0JTRVJWQVRJT04sXG4gICAgICAgIH1cbiAgICBpZiBjbGFpbS5hdXRob3JpdHlfc2NvcGUgaXMgQXV0aG9yaXR5U2NvcGUuVVNFUl9JTlNUUlVDVElPTjpcbiAgICAgICAgcmV0dXJuIGl0ZW0ub3JpZ2luIGluIHtcbiAgICAgICAgICAgIEV2aWRlbmNlT3JpZ2luLlVTRVJfSU5TVFJVQ1RJT04sXG4gICAgICAgICAgICBFdmlkZW5jZU9yaWdpbi5UT09MX09CU0VSVkFUSU9OLFxuICAgICAgICB9XG4gICAgaWYgY2xhaW0uYXV0aG9yaXR5X3Njb3BlIGlzIEF1dGhvcml0eVNjb3BlLlVTRVJfU0VMRl9SRVBPUlQ6XG4gICAgICAgIHJldHVybiBpdGVtLm9yaWdpbiBpbiB7XG4gICAgICAgICAgICBFdmlkZW5jZU9yaWdpbi5VU0VSX1NFTEZfUkVQT1JULFxuICAgICAgICAgICAgRXZpZGVuY2VPcmlnaW4uVE9PTF9PQlNFUlZBVElPTixcbiAgICAgICAgfVxuICAgIHJldHVybiBGYWxzZVxuXG5cbmRlZiBfYXV0aG9yaXplZF9ldmlkZW5jZShcbiAgICBjbGFpbTogQ2xhaW0sIGV2aWRlbmNlOiBTZXF1ZW5jZVtFdmlkZW5jZV1cbikgLT4gdHVwbGVbRXZpZGVuY2UsIC4uLl06XG4gICAgcmV0dXJuIHR1cGxlKGl0ZW0gZm9yIGl0ZW0gaW4gZXZpZGVuY2UgaWYgX2F1dGhvcml0eV9hbGxvd3MoY2xhaW0sIGl0ZW0pKVxuXG5cbmRlZiBfY2xhc3NpZnkoY2xhaW06IENsYWltLCBlbGlnaWJsZTogU2VxdWVuY2VbRXZpZGVuY2VdKSAtPiBDbGFzc2lmaWNhdGlvbjpcbiAgICBpZiBjbGFpbS5hbnN3ZXJhYmlsaXR5IGlzIEFuc3dlcmFiaWxpdHlTdGF0dXMuQ09OVFJBRElDVE9SWV9JTlBVVDpcbiAgICAgICAgcmV0dXJuIENsYXNzaWZpY2F0aW9uLkNPTkZMSUNUXG4gICAgaWYgY2xhaW0uYW5zd2VyYWJpbGl0eSBpcyBub3QgQW5zd2VyYWJpbGl0eVN0YXR1cy5BTlNXRVJBQkxFOlxuICAgICAgICByZXR1cm4gQ2xhc3NpZmljYXRpb24uVU5LTk9XTlxuICAgIGlmIGNsYWltLmNsYWltX3R5cGUgaXMgQ2xhaW1UeXBlLlVOQ0xBU1NJRklFRDpcbiAgICAgICAgcmV0dXJuIENsYXNzaWZpY2F0aW9uLlVOS05PV05cblxuICAgIHN1cHBvcnRpbmcgPSB0dXBsZShpdGVtIGZvciBpdGVtIGluIGVsaWdpYmxlIGlmIGl0ZW0uc3VwcG9ydHMpXG4gICAgY29udHJhZGljdGluZyA9IHR1cGxlKGl0ZW0gZm9yIGl0ZW0gaW4gZWxpZ2libGUgaWYgbm90IGl0ZW0uc3VwcG9ydHMpXG4gICAgaWYgc3VwcG9ydGluZyBhbmQgY29udHJhZGljdGluZzpcbiAgICAgICAgcmV0dXJuIENsYXNzaWZpY2F0aW9uLkNPTkZMSUNUXG4gICAgaWYgY29udHJhZGljdGluZzpcbiAgICAgICAgcmV0dXJuIENsYXNzaWZpY2F0aW9uLlJFRlVURURcbiAgICBpZiBub3Qgc3VwcG9ydGluZzpcbiAgICAgICAgcmV0dXJuIENsYXNzaWZpY2F0aW9uLlVOS05PV05cblxuICAgIGlmIGNsYWltLmNsYWltX3R5cGUgaXMgQ2xhaW1UeXBlLklORkVSRU5DRTpcbiAgICAgICAgcmV0dXJuIENsYXNzaWZpY2F0aW9uLklORkVSRU5DRVxuICAgIGlmIGNsYWltLmNsYWltX3R5cGUgaXMgQ2xhaW1UeXBlLkVTVElNQVRFOlxuICAgICAgICByZXR1cm4gQ2xhc3NpZmljYXRpb24uRVNUSU1BVEVcblxuICAgIGlmIG5vdCBhbnkoaXRlbS5kaXJlY3RuZXNzIGlzIERpcmVjdG5lc3MuRElSRUNUIGZvciBpdGVtIGluIHN1cHBvcnRpbmcpOlxuICAgICAgICByZXR1cm4gQ2xhc3NpZmljYXRpb24uSU5GRVJFTkNFXG5cbiAgICByZXR1cm4gQ2xhc3NpZmljYXRpb24uRkFDVFxuXG5cbmRlZiBfaGFzX2RpcmVjdF9wb3N0X2FjdGlvbl9ldmlkZW5jZShlbGlnaWJsZTogU2VxdWVuY2VbRXZpZGVuY2VdKSAtPiBib29sOlxuICAgIHJldHVybiBhbnkoXG4gICAgICAgIGl0ZW0uc3VwcG9ydHNcbiAgICAgICAgYW5kIGl0ZW0ucG9zdF9hY3Rpb25cbiAgICAgICAgYW5kIGl0ZW0uZGlyZWN0bmVzcyBpcyBEaXJlY3RuZXNzLkRJUkVDVFxuICAgICAgICBmb3IgaXRlbSBpbiBlbGlnaWJsZVxuICAgIClcblxuXG5kZWYgX2hhc19pbmRlcGVuZGVudF9wb3N0X2FjdGlvbl9ldmlkZW5jZShlbGlnaWJsZTogU2VxdWVuY2VbRXZpZGVuY2VdKSAtPiBib29sOlxuICAgIHJldHVybiBhbnkoXG4gICAgICAgIGl0ZW0uc3VwcG9ydHNcbiAgICAgICAgYW5kIGl0ZW0ucG9zdF9hY3Rpb25cbiAgICAgICAgYW5kIGl0ZW0uZGlyZWN0bmVzcyBpcyBEaXJlY3RuZXNzLkRJUkVDVFxuICAgICAgICBhbmQgaXRlbS5zb3VyY2Vfcm9sZSBpbiB7U291cmNlUm9sZS5WRVJJRklFUiwgU291cmNlUm9sZS5FWFRFUk5BTH1cbiAgICAgICAgZm9yIGl0ZW0gaW4gZWxpZ2libGVcbiAgICApXG5cblxuZGVmIF9pbmRlcGVuZGVudF9zdXBwb3J0aW5nX3NvdXJjZV9jb3VudChlbGlnaWJsZTogU2VxdWVuY2VbRXZpZGVuY2VdKSAtPiBpbnQ6XG4gICAgIyBFeHRyYSBtZXRhZGF0YSBtYXkgam9pbiBrbm93biBpZGVudGl0aWVzLCBuZXZlciBzcGxpdCB0aGUgc2FtZSBwcm92ZW5hbmNlLlxuICAgICMgQ29ubmVjdGVkIGNvbXBvbmVudHMgcHJlc2VydmUgb3ZlcmxhcCB0cmFuc2l0aXZlbHksIHJlZ2FyZGxlc3Mgb2YgaW5wdXQgb3JkZXIuXG4gICAgcGFyZW50czogbGlzdFtpbnRdID0gW11cbiAgICBzZWVuOiBkaWN0W3R1cGxlW3N0ciwgc3RyXSwgaW50XSA9IHt9XG5cbiAgICBkZWYgcm9vdChpbmRleDogaW50KSAtPiBpbnQ6XG4gICAgICAgIHdoaWxlIHBhcmVudHNbaW5kZXhdICE9IGluZGV4OlxuICAgICAgICAgICAgcGFyZW50c1tpbmRleF0gPSBwYXJlbnRzW3BhcmVudHNbaW5kZXhdXVxuICAgICAgICAgICAgaW5kZXggPSBwYXJlbnRzW2luZGV4XVxuICAgICAgICByZXR1cm4gaW5kZXhcblxuICAgIGZvciBpdGVtIGluIGVsaWdpYmxlOlxuICAgICAgICBpZiBub3QgKFxuICAgICAgICAgICAgaXRlbS5zdXBwb3J0c1xuICAgICAgICAgICAgYW5kIGl0ZW0uZGlyZWN0bmVzcyBpcyBEaXJlY3RuZXNzLkRJUkVDVFxuICAgICAgICAgICAgYW5kIGl0ZW0uc291cmNlX3JvbGUgaW4ge1NvdXJjZVJvbGUuVkVSSUZJRVIsIFNvdXJjZVJvbGUuRVhURVJOQUx9XG4gICAgICAgICk6XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICBpbmRleCA9IGxlbihwYXJlbnRzKVxuICAgICAgICBwYXJlbnRzLmFwcGVuZChpbmRleClcbiAgICAgICAgaWRlbnRpdGllcyA9IFsoXCJzb3VyY2VcIiwgaXRlbS5zb3VyY2VfaWQuc3RyaXAoKSldXG4gICAgICAgIGlmIGl0ZW0uc291cmNlX3JlZiBpcyBub3QgTm9uZTpcbiAgICAgICAgICAgIGlkZW50aXRpZXMuYXBwZW5kKChcInJlZlwiLCBpdGVtLnNvdXJjZV9yZWYuc3RyaXAoKSkpXG4gICAgICAgIGlmIGl0ZW0uaW5kZXBlbmRlbmNlX2dyb3VwIGlzIG5vdCBOb25lOlxuICAgICAgICAgICAgaWRlbnRpdGllcy5hcHBlbmQoKFwiZ3JvdXBcIiwgaXRlbS5pbmRlcGVuZGVuY2VfZ3JvdXAuc3RyaXAoKSkpXG4gICAgICAgIGlmIGl0ZW0uY29udGVudF9zaGEyNTYgaXMgbm90IE5vbmU6XG4gICAgICAgICAgICBpZGVudGl0aWVzLmFwcGVuZCgoXCJjb250ZW50XCIsIGl0ZW0uY29udGVudF9zaGEyNTYubG93ZXIoKSkpXG4gICAgICAgIGZvciBpZGVudGl0eSBpbiBpZGVudGl0aWVzOlxuICAgICAgICAgICAgcHJldmlvdXMgPSBzZWVuLnNldGRlZmF1bHQoaWRlbnRpdHksIGluZGV4KVxuICAgICAgICAgICAgcGFyZW50c1tyb290KGluZGV4KV0gPSByb290KHByZXZpb3VzKVxuXG4gICAgcmV0dXJuIGxlbih7cm9vdChpbmRleCkgZm9yIGluZGV4IGluIHJhbmdlKGxlbihwYXJlbnRzKSl9KVxuXG5cbmRlZiBfZGVjaWRlX3ZlcmRpY3QoXG4gICAgY2xhaW06IENsYWltLFxuICAgIGNsYXNzaWZpY2F0aW9uOiBDbGFzc2lmaWNhdGlvbixcbiAgICBlbGlnaWJsZTogU2VxdWVuY2VbRXZpZGVuY2VdLFxuICAgICosXG4gICAgcG9saWN5OiBQb2xpY3ksXG4gICAgaHVtYW5fYXBwcm92ZWQ6IGJvb2wsXG4gICAgYXV0aG9yaXR5X3JlamVjdGVkOiBib29sID0gRmFsc2UsXG4gICAgcnVudGltZV9wcm92ZW5hbmNlX3ZlcmlmaWVkOiBib29sID0gRmFsc2UsXG4pIC0+IHR1cGxlW1ZlcmRpY3QsIHN0cl06XG4gICAgaWYgcG9saWN5LnJlcXVpcmVfcnVudGltZV9wcm92ZW5hbmNlIGFuZCBub3QgcnVudGltZV9wcm92ZW5hbmNlX3ZlcmlmaWVkOlxuICAgICAgICByZXR1cm4gVmVyZGljdC5CTE9DSywgXCJydW50aW1lX3Byb3ZlbmFuY2VfdW52ZXJpZmllZFwiXG5cbiAgICBpZiBjbGFpbS5hbnN3ZXJhYmlsaXR5IGlzIEFuc3dlcmFiaWxpdHlTdGF0dXMuTkVFRFNfQ0xBUklGSUNBVElPTjpcbiAgICAgICAgcmV0dXJuIFZlcmRpY3QuRVNDQUxBVEUsIFwiYW5zd2VyYWJpbGl0eV9uZWVkc19jbGFyaWZpY2F0aW9uXCJcbiAgICBpZiBjbGFpbS5hbnN3ZXJhYmlsaXR5IGlzIG5vdCBBbnN3ZXJhYmlsaXR5U3RhdHVzLkFOU1dFUkFCTEU6XG4gICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBmXCJhbnN3ZXJhYmlsaXR5X3tjbGFpbS5hbnN3ZXJhYmlsaXR5LnZhbHVlfVwiXG4gICAgaWYgY2xhaW0uY2xhaW1fdHlwZSBpcyBDbGFpbVR5cGUuVU5DTEFTU0lGSUVEOlxuICAgICAgICByZXR1cm4gVmVyZGljdC5CTE9DSywgXCJ1bmNsYXNzaWZpZWRfY2xhaW1cIlxuXG4gICAgaWYgY2xhc3NpZmljYXRpb24gaXMgQ2xhc3NpZmljYXRpb24uQ09ORkxJQ1Q6XG4gICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcImVsaWdpYmxlX2NvbnRyYWRpY3Rpb25cIlxuICAgIGlmIGNsYXNzaWZpY2F0aW9uIGlzIENsYXNzaWZpY2F0aW9uLlJFRlVURUQ6XG4gICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcImNsYWltX3JlZnV0ZWRfYnlfZWxpZ2libGVfZXZpZGVuY2VcIlxuICAgIGlmIGNsYXNzaWZpY2F0aW9uIGlzIENsYXNzaWZpY2F0aW9uLlVOS05PV046XG4gICAgICAgIGlmIGF1dGhvcml0eV9yZWplY3RlZDpcbiAgICAgICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcImluc3VmZmljaWVudF9hdXRob3JpemVkX2V2aWRlbmNlXCJcbiAgICAgICAgcmV0dXJuIFZlcmRpY3QuQkxPQ0ssIFwiaW5zdWZmaWNpZW50X2VsaWdpYmxlX2V2aWRlbmNlXCJcbiAgICBpZiBjbGFzc2lmaWNhdGlvbiBpcyBDbGFzc2lmaWNhdGlvbi5JTkZFUkVOQ0U6XG4gICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcImluZmVyZW5jZV9ub3RfZmFjdFwiXG4gICAgaWYgY2xhc3NpZmljYXRpb24gaXMgQ2xhc3NpZmljYXRpb24uRVNUSU1BVEU6XG4gICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcImVzdGltYXRlX25vdF9mYWN0XCJcblxuICAgIGlmIGNsYWltLmNsYWltX3R5cGUgaXMgQ2xhaW1UeXBlLkFDVElPTl9TVEFURTpcbiAgICAgICAgaWYgbm90IF9oYXNfZGlyZWN0X3Bvc3RfYWN0aW9uX2V2aWRlbmNlKGVsaWdpYmxlKTpcbiAgICAgICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcIm1pc3NpbmdfcG9zdF9hY3Rpb25fZmluYWxfc3RhdGVfZXZpZGVuY2VcIlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwb2xpY3kucmVxdWlyZV9pbmRlcGVuZGVudF9hY3Rpb25fZXZpZGVuY2VcbiAgICAgICAgICAgIGFuZCBub3QgX2hhc19pbmRlcGVuZGVudF9wb3N0X2FjdGlvbl9ldmlkZW5jZShlbGlnaWJsZSlcbiAgICAgICAgKTpcbiAgICAgICAgICAgIHJldHVybiBWZXJkaWN0LkJMT0NLLCBcIm1pc3NpbmdfaW5kZXBlbmRlbnRfcG9zdF9hY3Rpb25fZXZpZGVuY2VcIlxuXG4gICAgaWYgKFxuICAgICAgICBjbGFpbS5yaXNrIGlzIFJpc2tMZXZlbC5NRURJVU1cbiAgICAgICAgYW5kIF9pbmRlcGVuZGVudF9zdXBwb3J0aW5nX3NvdXJjZV9jb3VudChlbGlnaWJsZSlcbiAgICAgICAgPCBwb2xpY3kubWVkaXVtX3Jpc2tfbWluX2luZGVwZW5kZW50X3NvdXJjZXNcbiAgICApOlxuICAgICAgICByZXR1cm4gVmVyZGljdC5FU0NBTEFURSwgXCJhZGRpdGlvbmFsX2luZGVwZW5kZW50X2V2aWRlbmNlX3JlcXVpcmVkXCJcblxuICAgIGlmIGNsYWltLnJpc2sgaXMgUmlza0xldmVsLkhJR0ggYW5kIG5vdCBodW1hbl9hcHByb3ZlZDpcbiAgICAgICAgcmV0dXJuIFZlcmRpY3QuRVNDQUxBVEUsIFwiaHVtYW5fYXBwcm92YWxfcmVxdWlyZWRcIlxuXG4gICAgcmV0dXJuIFZlcmRpY3QuQVBQUk9WRSwgXCJmYWN0X3dpdGhfcmVxdWlyZWRfZ2F0ZXNcIlxuXG5cbmRlZiBfaXNvKHZhbHVlOiBkYXRldGltZSkgLT4gc3RyOlxuICAgIHJldHVybiB2YWx1ZS5pc29mb3JtYXQoKVxuXG5cbmRlZiBfbWFrZV9mYWlsdXJlX3JlY29yZChjbGFpbTogQ2xhaW0sIHZlcmRpY3Q6IFZlcmRpY3QsIHJlYXNvbjogc3RyKSAtPiBkaWN0IHwgTm9uZTpcbiAgICBpZiB2ZXJkaWN0IGlzIFZlcmRpY3QuQVBQUk9WRTpcbiAgICAgICAgcmV0dXJuIE5vbmVcbiAgICByZXR1cm4ge1xuICAgICAgICBcInJlY29yZF90eXBlXCI6IFwiZXhwZWN0ZWRfZ2F0ZVwiLFxuICAgICAgICBcImNsYWltX2lkXCI6IGNsYWltLmNsYWltX2lkLFxuICAgICAgICBcImZhaWx1cmVfbW9kZVwiOiByZWFzb24sXG4gICAgICAgIFwicm9vdF9jYXVzZVwiOiBcInZlcmlmaWNhdGlvbl9nYXRlX25vdF9zYXRpc2ZpZWRcIixcbiAgICAgICAgXCJndWFyZHJhaWxcIjogZlwicHJlc2VydmVfe3ZlcmRpY3QudmFsdWUubG93ZXIoKX1fdW50aWxfbmV3X2VsaWdpYmxlX2V2aWRlbmNlX29yX3JlcXVpcmVkX2FwcHJvdmFsXCIsXG4gICAgICAgIFwicmVncmVzc2lvbl90ZXN0X3JlcXVpcmVkXCI6IEZhbHNlLFxuICAgICAgICBcInZlcnNpb25fY2hhbmdlX3JlcXVpcmVkXCI6IEZhbHNlLFxuICAgIH1cblxuXG5kZWYgbWFrZV9mYWlsdXJlX2V2b2x1dGlvbl9yZWNvcmQoXG4gICAgKixcbiAgICBmYWlsdXJlX21vZGU6IHN0cixcbiAgICByb290X2NhdXNlOiBzdHIsXG4gICAgZ3VhcmRyYWlsOiBzdHIsXG4gICAgcmVncmVzc2lvbl90ZXN0OiBzdHIsXG4pIC0+IGRpY3Q6XG4gICAgZmllbGRzID0ge1xuICAgICAgICBcImZhaWx1cmVfbW9kZVwiOiBmYWlsdXJlX21vZGUsXG4gICAgICAgIFwicm9vdF9jYXVzZVwiOiByb290X2NhdXNlLFxuICAgICAgICBcImd1YXJkcmFpbFwiOiBndWFyZHJhaWwsXG4gICAgICAgIFwicmVncmVzc2lvbl90ZXN0XCI6IHJlZ3Jlc3Npb25fdGVzdCxcbiAgICB9XG4gICAgZm9yIG5hbWUsIHZhbHVlIGluIGZpZWxkcy5pdGVtcygpOlxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSBvciBub3QgdmFsdWUuc3RyaXAoKTpcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZlwie25hbWV9IG11c3QgYmUgbm9uLWVtcHR5XCIpXG4gICAgcmV0dXJuIHtcbiAgICAgICAgXCJyZWNvcmRfdHlwZVwiOiBcImZhaWx1cmVfZXZvbHV0aW9uXCIsXG4gICAgICAgIFwiZmFpbHVyZV9tb2RlXCI6IGZhaWx1cmVfbW9kZS5zdHJpcCgpLFxuICAgICAgICBcInJvb3RfY2F1c2VcIjogcm9vdF9jYXVzZS5zdHJpcCgpLFxuICAgICAgICBcImd1YXJkcmFpbFwiOiBndWFyZHJhaWwuc3RyaXAoKSxcbiAgICAgICAgXCJyZWdyZXNzaW9uX3Rlc3RcIjogcmVncmVzc2lvbl90ZXN0LnN0cmlwKCksXG4gICAgICAgIFwicmVncmVzc2lvbl90ZXN0X3JlcXVpcmVkXCI6IFRydWUsXG4gICAgICAgIFwidmVyc2lvbl9jaGFuZ2VfcmVxdWlyZWRcIjogVHJ1ZSxcbiAgICB9XG5cblxuZGVmIGNhbm9uaWNhbF9yZWNlaXB0X3NoYTI1NihyZWNlaXB0OiBNYXBwaW5nKSAtPiBzdHI6XG4gICAgcGF5bG9hZCA9IHtcbiAgICAgICAga2V5OiB2YWx1ZVxuICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiByZWNlaXB0Lml0ZW1zKClcbiAgICAgICAgaWYga2V5ICE9IFwicmVjZWlwdF9zaGEyNTZcIlxuICAgIH1cbiAgICBjYW5vbmljYWwgPSBqc29uLmR1bXBzKFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBzb3J0X2tleXM9VHJ1ZSxcbiAgICAgICAgc2VwYXJhdG9ycz0oXCIsXCIsIFwiOlwiKSxcbiAgICAgICAgZW5zdXJlX2FzY2lpPUZhbHNlLFxuICAgICkuZW5jb2RlKFwidXRmLThcIilcbiAgICByZXR1cm4gaGFzaGxpYi5zaGEyNTYoY2Fub25pY2FsKS5oZXhkaWdlc3QoKVxuXG5cbmRlZiBfbWFrZV9yZWNlaXB0KFxuICAgICosXG4gICAgY2xhaW06IENsYWltLFxuICAgIHBvbGljeTogUG9saWN5LFxuICAgIGV2YWx1YXRpb25fdGltZTogZGF0ZXRpbWUsXG4gICAgYWxsX2V2aWRlbmNlOiBTZXF1ZW5jZVtFdmlkZW5jZV0sXG4gICAgZWxpZ2libGU6IFNlcXVlbmNlW0V2aWRlbmNlXSxcbiAgICBjbGFzc2lmaWNhdGlvbjogQ2xhc3NpZmljYXRpb24sXG4gICAgdmVyZGljdDogVmVyZGljdCxcbiAgICByZWFzb246IHN0cixcbiAgICBodW1hbl9hcHByb3ZlZDogYm9vbCxcbiAgICBhdXRob3JpdHlfcmVqZWN0ZWQ6IFNlcXVlbmNlW0V2aWRlbmNlXSA9ICgpLFxuICAgIHJ1bnRpbWVfcHJvdmVuYW5jZTogUnVudGltZVByb3ZlbmFuY2UgfCBOb25lID0gTm9uZSxcbikgLT4gZGljdDpcbiAgICBlbGlnaWJsZV9pZHMgPSB7X2VmZmVjdGl2ZV9ldmlkZW5jZV9pZChpdGVtKSBmb3IgaXRlbSBpbiBlbGlnaWJsZX1cbiAgICBzb3J0ZWRfYWxsID0gc29ydGVkKFxuICAgICAgICBhbGxfZXZpZGVuY2UsXG4gICAgICAgIGtleT1sYW1iZGEgaXRlbTogKF9lZmZlY3RpdmVfZXZpZGVuY2VfaWQoaXRlbSksIGl0ZW0uc291cmNlX2lkKSxcbiAgICApXG5cbiAgICBzdXBwb3J0aW5nX3NvdXJjZXMgPSBzb3J0ZWQoaXRlbS5zb3VyY2VfaWQgZm9yIGl0ZW0gaW4gZWxpZ2libGUgaWYgaXRlbS5zdXBwb3J0cylcbiAgICBjb250cmFkaWN0aW5nX3NvdXJjZXMgPSBzb3J0ZWQoaXRlbS5zb3VyY2VfaWQgZm9yIGl0ZW0gaW4gZWxpZ2libGUgaWYgbm90IGl0ZW0uc3VwcG9ydHMpXG4gICAgc3VwcG9ydGluZ19ldmlkZW5jZV9pZHMgPSBzb3J0ZWQoXG4gICAgICAgIF9lZmZlY3RpdmVfZXZpZGVuY2VfaWQoaXRlbSkgZm9yIGl0ZW0gaW4gZWxpZ2libGUgaWYgaXRlbS5zdXBwb3J0c1xuICAgIClcbiAgICBjb250cmFkaWN0aW5nX2V2aWRlbmNlX2lkcyA9IHNvcnRlZChcbiAgICAgICAgX2VmZmVjdGl2ZV9ldmlkZW5jZV9pZChpdGVtKSBmb3IgaXRlbSBpbiBlbGlnaWJsZSBpZiBub3QgaXRlbS5zdXBwb3J0c1xuICAgIClcbiAgICBpZiBjbGFpbS5yaXNrIGlzIFJpc2tMZXZlbC5ISUdIOlxuICAgICAgICBodW1hbl9nYXRlID0gXCJhcHByb3ZlZFwiIGlmIGh1bWFuX2FwcHJvdmVkIGVsc2UgXCJyZXF1aXJlZFwiXG4gICAgZWxzZTpcbiAgICAgICAgaHVtYW5fZ2F0ZSA9IFwibm90X3JlcXVpcmVkXCJcblxuICAgIHJlY2VpcHQgPSB7XG4gICAgICAgIFwiYWxnb3JpdGhtX3ZlcnNpb25cIjogQUxHT1JJVEhNX1ZFUlNJT04sXG4gICAgICAgIFwicG9saWN5X3ZlcnNpb25cIjogcG9saWN5LnZlcnNpb24sXG4gICAgICAgIFwiZXZhbHVhdGlvbl90aW1lXCI6IF9pc28oZXZhbHVhdGlvbl90aW1lKSxcbiAgICAgICAgXCJjbGFpbVwiOiB7XG4gICAgICAgICAgICBcImlkXCI6IGNsYWltLmNsYWltX2lkLFxuICAgICAgICAgICAgXCJ0ZXh0XCI6IGNsYWltLnRleHQsXG4gICAgICAgICAgICBcInR5cGVcIjogY2xhaW0uY2xhaW1fdHlwZS52YWx1ZSxcbiAgICAgICAgICAgIFwicmlza1wiOiBjbGFpbS5yaXNrLnZhbHVlLFxuICAgICAgICAgICAgXCJjb25zZXF1ZW50aWFsXCI6IGNsYWltLmNvbnNlcXVlbnRpYWwsXG4gICAgICAgICAgICBcImF1dGhvcml0eV9zY29wZVwiOiBjbGFpbS5hdXRob3JpdHlfc2NvcGUudmFsdWUsXG4gICAgICAgICAgICBcImFuc3dlcmFiaWxpdHlcIjogY2xhaW0uYW5zd2VyYWJpbGl0eS52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJjbGFzc2lmaWNhdGlvblwiOiBjbGFzc2lmaWNhdGlvbi52YWx1ZSxcbiAgICAgICAgXCJ2ZXJkaWN0XCI6IHZlcmRpY3QudmFsdWUsXG4gICAgICAgIFwicmVhc29uXCI6IHJlYXNvbixcbiAgICAgICAgXCJodW1hbl9hcHByb3ZlZFwiOiBodW1hbl9hcHByb3ZlZCxcbiAgICAgICAgXCJydW50aW1lX3Byb3ZlbmFuY2VcIjogKFxuICAgICAgICAgICAgcnVudGltZV9wcm92ZW5hbmNlLmFzX2RpY3QoKVxuICAgICAgICAgICAgaWYgcnVudGltZV9wcm92ZW5hbmNlIGlzIG5vdCBOb25lXG4gICAgICAgICAgICBlbHNlIGN1cnJlbnRfcnVudGltZV9wcm92ZW5hbmNlKCkuYXNfZGljdCgpXG4gICAgICAgICksXG4gICAgICAgIFwiZ2F0ZXNcIjoge1xuICAgICAgICAgICAgXCJlbGlnaWJsZV9zb3VyY2VfY291bnRcIjogbGVuKGVsaWdpYmxlKSxcbiAgICAgICAgICAgIFwic3VwcG9ydGluZ19zb3VyY2VzXCI6IHN1cHBvcnRpbmdfc291cmNlcyxcbiAgICAgICAgICAgIFwiY29udHJhZGljdGluZ19zb3VyY2VzXCI6IGNvbnRyYWRpY3Rpbmdfc291cmNlcyxcbiAgICAgICAgICAgIFwic3VwcG9ydGluZ19ldmlkZW5jZV9pZHNcIjogc3VwcG9ydGluZ19ldmlkZW5jZV9pZHMsXG4gICAgICAgICAgICBcImNvbnRyYWRpY3RpbmdfZXZpZGVuY2VfaWRzXCI6IGNvbnRyYWRpY3RpbmdfZXZpZGVuY2VfaWRzLFxuICAgICAgICAgICAgXCJjb250cmFkaWN0aW9uX2NvdW50XCI6IGxlbihjb250cmFkaWN0aW5nX2V2aWRlbmNlX2lkcyksXG4gICAgICAgICAgICBcImF1dGhvcml0eV9yZWplY3RlZF9ldmlkZW5jZV9pZHNcIjogc29ydGVkKFxuICAgICAgICAgICAgICAgIF9lZmZlY3RpdmVfZXZpZGVuY2VfaWQoaXRlbSkgZm9yIGl0ZW0gaW4gYXV0aG9yaXR5X3JlamVjdGVkXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgXCJwb3N0X2FjdGlvbl92ZXJpZmllZFwiOiAoXG4gICAgICAgICAgICAgICAgX2hhc19kaXJlY3RfcG9zdF9hY3Rpb25fZXZpZGVuY2UoZWxpZ2libGUpXG4gICAgICAgICAgICAgICAgaWYgY2xhaW0uY2xhaW1fdHlwZSBpcyBDbGFpbVR5cGUuQUNUSU9OX1NUQVRFXG4gICAgICAgICAgICAgICAgZWxzZSBOb25lXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgXCJpbmRlcGVuZGVudF9wb3N0X2FjdGlvbl92ZXJpZmllZFwiOiAoXG4gICAgICAgICAgICAgICAgX2hhc19pbmRlcGVuZGVudF9wb3N0X2FjdGlvbl9ldmlkZW5jZShlbGlnaWJsZSlcbiAgICAgICAgICAgICAgICBpZiBjbGFpbS5jbGFpbV90eXBlIGlzIENsYWltVHlwZS5BQ1RJT05fU1RBVEVcbiAgICAgICAgICAgICAgICBlbHNlIE5vbmVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBcImluZGVwZW5kZW50X3N1cHBvcnRpbmdfc291cmNlX2NvdW50XCI6IF9pbmRlcGVuZGVudF9zdXBwb3J0aW5nX3NvdXJjZV9jb3VudChlbGlnaWJsZSksXG4gICAgICAgICAgICBcImluZGVwZW5kZW50X3N1cHBvcnRpbmdfZ3JvdXBfY291bnRcIjogX2luZGVwZW5kZW50X3N1cHBvcnRpbmdfc291cmNlX2NvdW50KGVsaWdpYmxlKSxcbiAgICAgICAgICAgIFwibWVkaXVtX3Jpc2tfcmVxdWlyZWRfc291cmNlc1wiOiAoXG4gICAgICAgICAgICAgICAgcG9saWN5Lm1lZGl1bV9yaXNrX21pbl9pbmRlcGVuZGVudF9zb3VyY2VzXG4gICAgICAgICAgICAgICAgaWYgY2xhaW0ucmlzayBpcyBSaXNrTGV2ZWwuTUVESVVNXG4gICAgICAgICAgICAgICAgZWxzZSBOb25lXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgXCJodW1hbl9nYXRlXCI6IGh1bWFuX2dhdGUsXG4gICAgICAgICAgICBcInJ1bnRpbWVfcHJvdmVuYW5jZV9yZXF1aXJlZFwiOiBwb2xpY3kucmVxdWlyZV9ydW50aW1lX3Byb3ZlbmFuY2UsXG4gICAgICAgIH0sXG4gICAgICAgIFwiZXZpZGVuY2VcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiZXZpZGVuY2VfaWRcIjogX2VmZmVjdGl2ZV9ldmlkZW5jZV9pZChpdGVtKSxcbiAgICAgICAgICAgICAgICBcInNvdXJjZV9pZFwiOiBpdGVtLnNvdXJjZV9pZCxcbiAgICAgICAgICAgICAgICBcInNvdXJjZV9yb2xlXCI6IGl0ZW0uc291cmNlX3JvbGUudmFsdWUsXG4gICAgICAgICAgICAgICAgXCJzb3VyY2VfcmVmXCI6IGl0ZW0uc291cmNlX3JlZixcbiAgICAgICAgICAgICAgICBcImluZGVwZW5kZW5jZV9ncm91cFwiOiBpdGVtLmluZGVwZW5kZW5jZV9ncm91cCxcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRfc2hhMjU2XCI6IChcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jb250ZW50X3NoYTI1Ni5sb3dlcigpXG4gICAgICAgICAgICAgICAgICAgIGlmIGl0ZW0uY29udGVudF9zaGEyNTYgaXMgbm90IE5vbmVcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBOb25lXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBcIm9yaWdpblwiOiBpdGVtLm9yaWdpbi52YWx1ZSxcbiAgICAgICAgICAgICAgICBcImF1dGhvcml0eV9zY29wZVwiOiBpdGVtLmF1dGhvcml0eV9zY29wZS52YWx1ZSxcbiAgICAgICAgICAgICAgICBcInN1cHBvcnRzXCI6IGl0ZW0uc3VwcG9ydHMsXG4gICAgICAgICAgICAgICAgXCJvYnNlcnZlZF9hdFwiOiBfaXNvKGl0ZW0ub2JzZXJ2ZWRfYXQpLFxuICAgICAgICAgICAgICAgIFwiZGlyZWN0bmVzc1wiOiBpdGVtLmRpcmVjdG5lc3MudmFsdWUsXG4gICAgICAgICAgICAgICAgXCJwb3N0X2FjdGlvblwiOiBpdGVtLnBvc3RfYWN0aW9uLFxuICAgICAgICAgICAgICAgIFwiY2FsbGVyX2VsaWdpYmxlXCI6IGl0ZW0uZWxpZ2libGUsXG4gICAgICAgICAgICAgICAgXCJlbGlnaWJsZV9hdF9ldmFsdWF0aW9uXCI6IF9lZmZlY3RpdmVfZXZpZGVuY2VfaWQoaXRlbSkgaW4gZWxpZ2libGVfaWRzLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkX2FsbFxuICAgICAgICBdLFxuICAgIH1cbiAgICByZWNlaXB0W1wicmVjZWlwdF9zaGEyNTZcIl0gPSBjYW5vbmljYWxfcmVjZWlwdF9zaGEyNTYocmVjZWlwdClcbiAgICByZXR1cm4gcmVjZWlwdFxuXG5cbmRlZiB2ZXJpZnlfY2xhaW0oXG4gICAgY2xhaW06IENsYWltLFxuICAgIGV2aWRlbmNlOiBJdGVyYWJsZVtFdmlkZW5jZV0sXG4gICAgKixcbiAgICBwb2xpY3k6IFBvbGljeSxcbiAgICBldmFsdWF0aW9uX3RpbWU6IGRhdGV0aW1lLFxuICAgIGh1bWFuX2FwcHJvdmVkOiBib29sID0gRmFsc2UsXG4pIC0+IFZlcmlmaWNhdGlvblJlc3VsdDpcbiAgICBfdmFsaWRhdGVfaHVtYW5fYXBwcm92YWwoaHVtYW5fYXBwcm92ZWQpXG4gICAgZXZpZGVuY2Vfc2VxID0gdHVwbGUoZXZpZGVuY2UpXG4gICAgX3ZhbGlkYXRlX3Byb3ZlbmFuY2VfaW5wdXRzKGNsYWltLCBldmlkZW5jZV9zZXEsIHBvbGljeSlcbiAgICBfdmFsaWRhdGVfZXZpZGVuY2VfZ2F0ZV90eXBlcyhldmlkZW5jZV9zZXEpXG4gICAgX3ZhbGlkYXRlX2V2aWRlbmNlX2lkZW50aXR5KGV2aWRlbmNlX3NlcSlcbiAgICBfdmFsaWRhdGVfY29tbW9uX2lucHV0cyhldmlkZW5jZV9zZXEsIHBvbGljeT1wb2xpY3ksIGV2YWx1YXRpb25fdGltZT1ldmFsdWF0aW9uX3RpbWUpXG5cbiAgICBmcmVzaF9lbGlnaWJsZSA9IF9lbGlnaWJsZV9ldmlkZW5jZShcbiAgICAgICAgZXZpZGVuY2Vfc2VxLFxuICAgICAgICBwb2xpY3k9cG9saWN5LFxuICAgICAgICBldmFsdWF0aW9uX3RpbWU9ZXZhbHVhdGlvbl90aW1lLFxuICAgIClcbiAgICBlbGlnaWJsZSA9IF9hdXRob3JpemVkX2V2aWRlbmNlKGNsYWltLCBmcmVzaF9lbGlnaWJsZSlcbiAgICBhdXRob3JpdHlfcmVqZWN0ZWQgPSB0dXBsZShcbiAgICAgICAgaXRlbSBmb3IgaXRlbSBpbiBmcmVzaF9lbGlnaWJsZSBpZiBpdGVtIG5vdCBpbiBlbGlnaWJsZVxuICAgIClcbiAgICBydW50aW1lX3Byb3ZlbmFuY2UgPSBjdXJyZW50X3J1bnRpbWVfcHJvdmVuYW5jZSgpXG4gICAgY2xhc3NpZmljYXRpb24gPSBfY2xhc3NpZnkoY2xhaW0sIGVsaWdpYmxlKVxuICAgIHZlcmRpY3QsIHJlYXNvbiA9IF9kZWNpZGVfdmVyZGljdChcbiAgICAgICAgY2xhaW0sXG4gICAgICAgIGNsYXNzaWZpY2F0aW9uLFxuICAgICAgICBlbGlnaWJsZSxcbiAgICAgICAgcG9saWN5PXBvbGljeSxcbiAgICAgICAgaHVtYW5fYXBwcm92ZWQ9aHVtYW5fYXBwcm92ZWQsXG4gICAgICAgIGF1dGhvcml0eV9yZWplY3RlZD1ib29sKGF1dGhvcml0eV9yZWplY3RlZCksXG4gICAgICAgIHJ1bnRpbWVfcHJvdmVuYW5jZV92ZXJpZmllZD1ydW50aW1lX3Byb3ZlbmFuY2UudmVyaWZpZWQsXG4gICAgKVxuICAgIHJlY2VpcHQgPSBfbWFrZV9yZWNlaXB0KFxuICAgICAgICBjbGFpbT1jbGFpbSxcbiAgICAgICAgcG9saWN5PXBvbGljeSxcbiAgICAgICAgZXZhbHVhdGlvbl90aW1lPWV2YWx1YXRpb25fdGltZSxcbiAgICAgICAgYWxsX2V2aWRlbmNlPWV2aWRlbmNlX3NlcSxcbiAgICAgICAgZWxpZ2libGU9ZWxpZ2libGUsXG4gICAgICAgIGNsYXNzaWZpY2F0aW9uPWNsYXNzaWZpY2F0aW9uLFxuICAgICAgICB2ZXJkaWN0PXZlcmRpY3QsXG4gICAgICAgIHJlYXNvbj1yZWFzb24sXG4gICAgICAgIGh1bWFuX2FwcHJvdmVkPWh1bWFuX2FwcHJvdmVkLFxuICAgICAgICBhdXRob3JpdHlfcmVqZWN0ZWQ9YXV0aG9yaXR5X3JlamVjdGVkLFxuICAgICAgICBydW50aW1lX3Byb3ZlbmFuY2U9cnVudGltZV9wcm92ZW5hbmNlLFxuICAgIClcbiAgICBmYWlsdXJlX3JlY29yZCA9IF9tYWtlX2ZhaWx1cmVfcmVjb3JkKGNsYWltLCB2ZXJkaWN0LCByZWFzb24pXG4gICAgcmV0dXJuIFZlcmlmaWNhdGlvblJlc3VsdChcbiAgICAgICAgY2xhaW09Y2xhaW0sXG4gICAgICAgIGNsYXNzaWZpY2F0aW9uPWNsYXNzaWZpY2F0aW9uLFxuICAgICAgICB2ZXJkaWN0PXZlcmRpY3QsXG4gICAgICAgIHJlYXNvbj1yZWFzb24sXG4gICAgICAgIHJlY2VpcHQ9cmVjZWlwdCxcbiAgICAgICAgZmFpbHVyZV9yZWNvcmQ9ZmFpbHVyZV9yZWNvcmQsXG4gICAgKVxuXG5cbmRlZiB2ZXJpZnlfY29tcG91bmQoXG4gICAgY2xhaW1zOiBTZXF1ZW5jZVtDbGFpbV0sXG4gICAgZXZpZGVuY2VfYnlfY2xhaW06IE1hcHBpbmdbc3RyLCBJdGVyYWJsZVtFdmlkZW5jZV1dLFxuICAgICosXG4gICAgcG9saWN5OiBQb2xpY3ksXG4gICAgZXZhbHVhdGlvbl90aW1lOiBkYXRldGltZSxcbiAgICBodW1hbl9hcHByb3ZhbHM6IE1hcHBpbmdbc3RyLCBib29sXSB8IE5vbmUgPSBOb25lLFxuKSAtPiBDb21wb3VuZFJlc3VsdDpcbiAgICBpZiBub3QgY2xhaW1zOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiYXQgbGVhc3Qgb25lIGNsYWltIGlzIHJlcXVpcmVkXCIpXG4gICAgY2xhaW1faWRzID0gW2NsYWltLmNsYWltX2lkIGZvciBjbGFpbSBpbiBjbGFpbXNdXG4gICAgaWYgbGVuKGNsYWltX2lkcykgIT0gbGVuKHNldChjbGFpbV9pZHMpKTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcImR1cGxpY2F0ZSBjbGFpbV9pZFwiKVxuXG4gICAgYXBwcm92YWxzID0gaHVtYW5fYXBwcm92YWxzIG9yIHt9XG4gICAgZm9yIGFwcHJvdmFsX2NsYWltX2lkLCBhcHByb3ZhbCBpbiBhcHByb3ZhbHMuaXRlbXMoKTpcbiAgICAgICAgX3ZhbGlkYXRlX2h1bWFuX2FwcHJvdmFsKFxuICAgICAgICAgICAgYXBwcm92YWwsXG4gICAgICAgICAgICBmaWVsZF9uYW1lPWZcImh1bWFuIGFwcHJvdmFsIGZvciB7YXBwcm92YWxfY2xhaW1faWR9XCIsXG4gICAgICAgIClcblxuICAgIHJlc3VsdHMgPSB0dXBsZShcbiAgICAgICAgdmVyaWZ5X2NsYWltKFxuICAgICAgICAgICAgY2xhaW0sXG4gICAgICAgICAgICBldmlkZW5jZV9ieV9jbGFpbS5nZXQoY2xhaW0uY2xhaW1faWQsICgpKSxcbiAgICAgICAgICAgIHBvbGljeT1wb2xpY3ksXG4gICAgICAgICAgICBldmFsdWF0aW9uX3RpbWU9ZXZhbHVhdGlvbl90aW1lLFxuICAgICAgICAgICAgaHVtYW5fYXBwcm92ZWQ9YXBwcm92YWxzLmdldChjbGFpbS5jbGFpbV9pZCwgRmFsc2UpLFxuICAgICAgICApXG4gICAgICAgIGZvciBjbGFpbSBpbiBjbGFpbXNcbiAgICApXG5cbiAgICBjb25zZXF1ZW50aWFsID0gW3Jlc3VsdCBmb3IgcmVzdWx0IGluIHJlc3VsdHMgaWYgcmVzdWx0LmNsYWltLmNvbnNlcXVlbnRpYWxdXG4gICAgaWYgYW55KHJlc3VsdC52ZXJkaWN0IGlzIFZlcmRpY3QuRVNDQUxBVEUgZm9yIHJlc3VsdCBpbiBjb25zZXF1ZW50aWFsKTpcbiAgICAgICAgb3ZlcmFsbCA9IFZlcmRpY3QuRVNDQUxBVEVcbiAgICBlbGlmIGFueShyZXN1bHQudmVyZGljdCBpcyBub3QgVmVyZGljdC5BUFBST1ZFIGZvciByZXN1bHQgaW4gY29uc2VxdWVudGlhbCk6XG4gICAgICAgIG92ZXJhbGwgPSBWZXJkaWN0LkJMT0NLXG4gICAgZWxzZTpcbiAgICAgICAgb3ZlcmFsbCA9IFZlcmRpY3QuQVBQUk9WRVxuXG4gICAgcmV0dXJuIENvbXBvdW5kUmVzdWx0KHJlc3VsdHM9cmVzdWx0cywgdmVyZGljdD1vdmVyYWxsKSIsICJhZGFwdGVyIjogImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnNcblxuZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWVcbmZyb20gdHlwaW5nIGltcG9ydCBBbnksIE1hcHBpbmdcblxuZnJvbSAuZW5naW5lIGltcG9ydCAoXG4gICAgQUxHT1JJVEhNX1ZFUlNJT04sXG4gICAgQW5zd2VyYWJpbGl0eVN0YXR1cyxcbiAgICBBdXRob3JpdHlTY29wZSxcbiAgICBDbGFpbSxcbiAgICBDbGFpbVR5cGUsXG4gICAgRGlyZWN0bmVzcyxcbiAgICBFdmlkZW5jZSxcbiAgICBFdmlkZW5jZU9yaWdpbixcbiAgICBQb2xpY3ksXG4gICAgUmlza0xldmVsLFxuICAgIFNvdXJjZVJvbGUsXG4gICAgdmVyaWZ5X2NsYWltLFxuICAgIHZlcmlmeV9jb21wb3VuZCxcbilcblxuU0NIRU1BX1ZFUlNJT04gPSAzXG5cblxuZGVmIF9tYXBwaW5nKHZhbHVlOiBBbnksIHBhdGg6IHN0cikgLT4gTWFwcGluZ1tzdHIsIEFueV06XG4gICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIE1hcHBpbmcpOlxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoZlwie3BhdGh9IG11c3QgYmUgb2JqZWN0XCIpXG4gICAgcmV0dXJuIHZhbHVlXG5cblxuZGVmIF9saXN0KHZhbHVlOiBBbnksIHBhdGg6IHN0cikgLT4gbGlzdFtBbnldOlxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KTpcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKGZcIntwYXRofSBtdXN0IGJlIGxpc3RcIilcbiAgICByZXR1cm4gdmFsdWVcblxuXG5kZWYgX3JlcXVpcmVkKG9iajogTWFwcGluZ1tzdHIsIEFueV0sIGtleTogc3RyLCBwYXRoOiBzdHIpIC0+IEFueTpcbiAgICBpZiBrZXkgbm90IGluIG9iajpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmXCJtaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiB7cGF0aH0ue2tleX1cIilcbiAgICByZXR1cm4gb2JqW2tleV1cblxuXG5kZWYgX3N0cmluZyh2YWx1ZTogQW55LCBwYXRoOiBzdHIpIC0+IHN0cjpcbiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSBvciBub3QgdmFsdWU6XG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihmXCJ7cGF0aH0gbXVzdCBiZSBub24tZW1wdHkgc3RyaW5nXCIpXG4gICAgcmV0dXJuIHZhbHVlXG5cblxuZGVmIF9vcHRpb25hbF9zdHJpbmcodmFsdWU6IEFueSwgcGF0aDogc3RyKSAtPiBzdHIgfCBOb25lOlxuICAgIGlmIHZhbHVlIGlzIE5vbmU6XG4gICAgICAgIHJldHVybiBOb25lXG4gICAgcmV0dXJuIF9zdHJpbmcodmFsdWUsIHBhdGgpXG5cblxuZGVmIF9ib29sKHZhbHVlOiBBbnksIHBhdGg6IHN0cikgLT4gYm9vbDpcbiAgICBpZiB0eXBlKHZhbHVlKSBpcyBub3QgYm9vbDpcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKGZcIntwYXRofSBtdXN0IGJlIGJvb2xcIilcbiAgICByZXR1cm4gdmFsdWVcblxuXG5kZWYgX2ludCh2YWx1ZTogQW55LCBwYXRoOiBzdHIpIC0+IGludDpcbiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKSBvciBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKGZcIntwYXRofSBtdXN0IGJlIGludFwiKVxuICAgIHJldHVybiB2YWx1ZVxuXG5cbmRlZiBfZGF0ZXRpbWUodmFsdWU6IEFueSwgcGF0aDogc3RyKSAtPiBkYXRldGltZTpcbiAgICByYXcgPSBfc3RyaW5nKHZhbHVlLCBwYXRoKVxuICAgIGlmIHJhdy5lbmRzd2l0aChcIlpcIik6XG4gICAgICAgIHJhdyA9IHJhd1s6LTFdICsgXCIrMDA6MDBcIlxuICAgIHRyeTpcbiAgICAgICAgcGFyc2VkID0gZGF0ZXRpbWUuZnJvbWlzb2Zvcm1hdChyYXcpXG4gICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGZcIntwYXRofSBtdXN0IGJlIElTTyA4NjAxIGRhdGV0aW1lXCIpIGZyb20gZXhjXG4gICAgaWYgcGFyc2VkLnR6aW5mbyBpcyBOb25lIG9yIHBhcnNlZC51dGNvZmZzZXQoKSBpcyBOb25lOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGZcIntwYXRofSBtdXN0IGJlIHRpbWV6b25lLWF3YXJlXCIpXG4gICAgcmV0dXJuIHBhcnNlZFxuXG5cbmRlZiBfZW51bShlbnVtX3R5cGUsIHZhbHVlOiBBbnksIHBhdGg6IHN0cik6XG4gICAgcmF3ID0gX3N0cmluZyh2YWx1ZSwgcGF0aClcbiAgICB0cnk6XG4gICAgICAgIHJldHVybiBlbnVtX3R5cGUocmF3KVxuICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmXCJpbnZhbGlkIHtwYXRofToge3Jhd31cIikgZnJvbSBleGNcblxuXG5kZWYgX2NsYWltKHJhdzogQW55LCBwYXRoOiBzdHIgPSBcImNsYWltXCIpIC0+IENsYWltOlxuICAgIG9iaiA9IF9tYXBwaW5nKHJhdywgcGF0aClcbiAgICByZXR1cm4gQ2xhaW0oXG4gICAgICAgIGNsYWltX2lkPV9zdHJpbmcoX3JlcXVpcmVkKG9iaiwgXCJpZFwiLCBwYXRoKSwgZlwie3BhdGh9LmlkXCIpLFxuICAgICAgICB0ZXh0PV9zdHJpbmcoX3JlcXVpcmVkKG9iaiwgXCJ0ZXh0XCIsIHBhdGgpLCBmXCJ7cGF0aH0udGV4dFwiKSxcbiAgICAgICAgY2xhaW1fdHlwZT1fZW51bShDbGFpbVR5cGUsIF9yZXF1aXJlZChvYmosIFwidHlwZVwiLCBwYXRoKSwgZlwie3BhdGh9LnR5cGVcIiksXG4gICAgICAgIHJpc2s9X2VudW0oUmlza0xldmVsLCBvYmouZ2V0KFwicmlza1wiLCBSaXNrTGV2ZWwuTE9XLnZhbHVlKSwgZlwie3BhdGh9LnJpc2tcIiksXG4gICAgICAgIGNvbnNlcXVlbnRpYWw9X2Jvb2wob2JqLmdldChcImNvbnNlcXVlbnRpYWxcIiwgVHJ1ZSksIGZcIntwYXRofS5jb25zZXF1ZW50aWFsXCIpLFxuICAgICAgICBhdXRob3JpdHlfc2NvcGU9X2VudW0oXG4gICAgICAgICAgICBBdXRob3JpdHlTY29wZSxcbiAgICAgICAgICAgIG9iai5nZXQoXCJhdXRob3JpdHlfc2NvcGVcIiwgQXV0aG9yaXR5U2NvcGUuRVhURVJOQUxfRkFDVC52YWx1ZSksXG4gICAgICAgICAgICBmXCJ7cGF0aH0uYXV0aG9yaXR5X3Njb3BlXCIsXG4gICAgICAgICksXG4gICAgICAgIGFuc3dlcmFiaWxpdHk9X2VudW0oXG4gICAgICAgICAgICBBbnN3ZXJhYmlsaXR5U3RhdHVzLFxuICAgICAgICAgICAgb2JqLmdldChcImFuc3dlcmFiaWxpdHlcIiwgQW5zd2VyYWJpbGl0eVN0YXR1cy5BTlNXRVJBQkxFLnZhbHVlKSxcbiAgICAgICAgICAgIGZcIntwYXRofS5hbnN3ZXJhYmlsaXR5XCIsXG4gICAgICAgICksXG4gICAgKVxuXG5cbmRlZiBfZXZpZGVuY2UocmF3OiBBbnksIHBhdGg6IHN0cikgLT4gRXZpZGVuY2U6XG4gICAgb2JqID0gX21hcHBpbmcocmF3LCBwYXRoKVxuICAgIHJldHVybiBFdmlkZW5jZShcbiAgICAgICAgc291cmNlX2lkPV9zdHJpbmcoX3JlcXVpcmVkKG9iaiwgXCJzb3VyY2VfaWRcIiwgcGF0aCksIGZcIntwYXRofS5zb3VyY2VfaWRcIiksXG4gICAgICAgIHN1cHBvcnRzPV9ib29sKF9yZXF1aXJlZChvYmosIFwic3VwcG9ydHNcIiwgcGF0aCksIGZcIntwYXRofS5zdXBwb3J0c1wiKSxcbiAgICAgICAgb2JzZXJ2ZWRfYXQ9X2RhdGV0aW1lKF9yZXF1aXJlZChvYmosIFwib2JzZXJ2ZWRfYXRcIiwgcGF0aCksIGZcIntwYXRofS5vYnNlcnZlZF9hdFwiKSxcbiAgICAgICAgZGlyZWN0bmVzcz1fZW51bShEaXJlY3RuZXNzLCBfcmVxdWlyZWQob2JqLCBcImRpcmVjdG5lc3NcIiwgcGF0aCksIGZcIntwYXRofS5kaXJlY3RuZXNzXCIpLFxuICAgICAgICBwb3N0X2FjdGlvbj1fYm9vbChvYmouZ2V0KFwicG9zdF9hY3Rpb25cIiwgRmFsc2UpLCBmXCJ7cGF0aH0ucG9zdF9hY3Rpb25cIiksXG4gICAgICAgIGVsaWdpYmxlPV9ib29sKG9iai5nZXQoXCJlbGlnaWJsZVwiLCBUcnVlKSwgZlwie3BhdGh9LmVsaWdpYmxlXCIpLFxuICAgICAgICBldmlkZW5jZV9pZD1fb3B0aW9uYWxfc3RyaW5nKG9iai5nZXQoXCJldmlkZW5jZV9pZFwiKSwgZlwie3BhdGh9LmV2aWRlbmNlX2lkXCIpLFxuICAgICAgICBzb3VyY2Vfcm9sZT1fZW51bShcbiAgICAgICAgICAgIFNvdXJjZVJvbGUsXG4gICAgICAgICAgICBvYmouZ2V0KFwic291cmNlX3JvbGVcIiwgU291cmNlUm9sZS5FWFRFUk5BTC52YWx1ZSksXG4gICAgICAgICAgICBmXCJ7cGF0aH0uc291cmNlX3JvbGVcIixcbiAgICAgICAgKSxcbiAgICAgICAgc291cmNlX3JlZj1fb3B0aW9uYWxfc3RyaW5nKG9iai5nZXQoXCJzb3VyY2VfcmVmXCIpLCBmXCJ7cGF0aH0uc291cmNlX3JlZlwiKSxcbiAgICAgICAgaW5kZXBlbmRlbmNlX2dyb3VwPV9vcHRpb25hbF9zdHJpbmcoXG4gICAgICAgICAgICBvYmouZ2V0KFwiaW5kZXBlbmRlbmNlX2dyb3VwXCIpLFxuICAgICAgICAgICAgZlwie3BhdGh9LmluZGVwZW5kZW5jZV9ncm91cFwiLFxuICAgICAgICApLFxuICAgICAgICBjb250ZW50X3NoYTI1Nj1fb3B0aW9uYWxfc3RyaW5nKFxuICAgICAgICAgICAgb2JqLmdldChcImNvbnRlbnRfc2hhMjU2XCIpLFxuICAgICAgICAgICAgZlwie3BhdGh9LmNvbnRlbnRfc2hhMjU2XCIsXG4gICAgICAgICksXG4gICAgICAgIG9yaWdpbj1fZW51bShcbiAgICAgICAgICAgIEV2aWRlbmNlT3JpZ2luLFxuICAgICAgICAgICAgb2JqLmdldChcIm9yaWdpblwiLCBFdmlkZW5jZU9yaWdpbi5FWFRFUk5BTF9TT1VSQ0UudmFsdWUpLFxuICAgICAgICAgICAgZlwie3BhdGh9Lm9yaWdpblwiLFxuICAgICAgICApLFxuICAgICAgICBhdXRob3JpdHlfc2NvcGU9X2VudW0oXG4gICAgICAgICAgICBBdXRob3JpdHlTY29wZSxcbiAgICAgICAgICAgIG9iai5nZXQoXCJhdXRob3JpdHlfc2NvcGVcIiwgQXV0aG9yaXR5U2NvcGUuRVhURVJOQUxfRkFDVC52YWx1ZSksXG4gICAgICAgICAgICBmXCJ7cGF0aH0uYXV0aG9yaXR5X3Njb3BlXCIsXG4gICAgICAgICksXG4gICAgKVxuXG5cbmRlZiBfcG9saWN5KHJhdzogQW55KSAtPiBQb2xpY3k6XG4gICAgcGF0aCA9IFwicG9saWN5XCJcbiAgICBvYmogPSBfbWFwcGluZyhyYXcsIHBhdGgpXG4gICAgcmV0dXJuIFBvbGljeShcbiAgICAgICAgdmVyc2lvbj1fc3RyaW5nKF9yZXF1aXJlZChvYmosIFwidmVyc2lvblwiLCBwYXRoKSwgXCJwb2xpY3kudmVyc2lvblwiKSxcbiAgICAgICAgbWF4X2FnZV9zZWNvbmRzPV9pbnQoX3JlcXVpcmVkKG9iaiwgXCJtYXhfYWdlX3NlY29uZHNcIiwgcGF0aCksIFwicG9saWN5Lm1heF9hZ2Vfc2Vjb25kc1wiKSxcbiAgICAgICAgcmVqZWN0X2Z1dHVyZV9ldmlkZW5jZT1fYm9vbChcbiAgICAgICAgICAgIG9iai5nZXQoXCJyZWplY3RfZnV0dXJlX2V2aWRlbmNlXCIsIFRydWUpLFxuICAgICAgICAgICAgXCJwb2xpY3kucmVqZWN0X2Z1dHVyZV9ldmlkZW5jZVwiLFxuICAgICAgICApLFxuICAgICAgICByZXF1aXJlX2luZGVwZW5kZW50X2FjdGlvbl9ldmlkZW5jZT1fYm9vbChcbiAgICAgICAgICAgIG9iai5nZXQoXCJyZXF1aXJlX2luZGVwZW5kZW50X2FjdGlvbl9ldmlkZW5jZVwiLCBUcnVlKSxcbiAgICAgICAgICAgIFwicG9saWN5LnJlcXVpcmVfaW5kZXBlbmRlbnRfYWN0aW9uX2V2aWRlbmNlXCIsXG4gICAgICAgICksXG4gICAgICAgIG1lZGl1bV9yaXNrX21pbl9pbmRlcGVuZGVudF9zb3VyY2VzPV9pbnQoXG4gICAgICAgICAgICBvYmouZ2V0KFwibWVkaXVtX3Jpc2tfbWluX2luZGVwZW5kZW50X3NvdXJjZXNcIiwgMiksXG4gICAgICAgICAgICBcInBvbGljeS5tZWRpdW1fcmlza19taW5faW5kZXBlbmRlbnRfc291cmNlc1wiLFxuICAgICAgICApLFxuICAgICAgICByZXF1aXJlX3J1bnRpbWVfcHJvdmVuYW5jZT1fYm9vbChcbiAgICAgICAgICAgIG9iai5nZXQoXCJyZXF1aXJlX3J1bnRpbWVfcHJvdmVuYW5jZVwiLCBGYWxzZSksXG4gICAgICAgICAgICBcInBvbGljeS5yZXF1aXJlX3J1bnRpbWVfcHJvdmVuYW5jZVwiLFxuICAgICAgICApLFxuICAgIClcblxuXG5kZWYgX3Jlc3VsdF9kaWN0KHJlc3VsdCkgLT4gZGljdFtzdHIsIEFueV06XG4gICAgcmV0dXJuIHtcbiAgICAgICAgXCJzY2hlbWFfdmVyc2lvblwiOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgXCJhbGdvcml0aG1fdmVyc2lvblwiOiBBTEdPUklUSE1fVkVSU0lPTixcbiAgICAgICAgXCJjbGFzc2lmaWNhdGlvblwiOiByZXN1bHQuY2xhc3NpZmljYXRpb24udmFsdWUsXG4gICAgICAgIFwidmVyZGljdFwiOiByZXN1bHQudmVyZGljdC52YWx1ZSxcbiAgICAgICAgXCJyZWFzb25cIjogcmVzdWx0LnJlYXNvbixcbiAgICAgICAgXCJyZWNlaXB0XCI6IHJlc3VsdC5yZWNlaXB0LFxuICAgICAgICBcImZhaWx1cmVfcmVjb3JkXCI6IHJlc3VsdC5mYWlsdXJlX3JlY29yZCxcbiAgICB9XG5cblxuZGVmIHZlcmlmeV9wYXlsb2FkKHBheWxvYWQ6IE1hcHBpbmdbc3RyLCBBbnldKSAtPiBkaWN0W3N0ciwgQW55XTpcbiAgICBvYmogPSBfbWFwcGluZyhwYXlsb2FkLCBcInBheWxvYWRcIilcbiAgICBjbGFpbSA9IF9jbGFpbShfcmVxdWlyZWQob2JqLCBcImNsYWltXCIsIFwicGF5bG9hZFwiKSlcbiAgICBldmlkZW5jZV9yYXcgPSBfbGlzdChfcmVxdWlyZWQob2JqLCBcImV2aWRlbmNlXCIsIFwicGF5bG9hZFwiKSwgXCJwYXlsb2FkLmV2aWRlbmNlXCIpXG4gICAgZXZpZGVuY2UgPSB0dXBsZShcbiAgICAgICAgX2V2aWRlbmNlKGl0ZW0sIGZcImV2aWRlbmNlW3tpbmRleH1dXCIpXG4gICAgICAgIGZvciBpbmRleCwgaXRlbSBpbiBlbnVtZXJhdGUoZXZpZGVuY2VfcmF3KVxuICAgIClcbiAgICBwb2xpY3kgPSBfcG9saWN5KF9yZXF1aXJlZChvYmosIFwicG9saWN5XCIsIFwicGF5bG9hZFwiKSlcbiAgICBldmFsdWF0aW9uX3RpbWUgPSBfZGF0ZXRpbWUoXG4gICAgICAgIF9yZXF1aXJlZChvYmosIFwiZXZhbHVhdGlvbl90aW1lXCIsIFwicGF5bG9hZFwiKSxcbiAgICAgICAgXCJwYXlsb2FkLmV2YWx1YXRpb25fdGltZVwiLFxuICAgIClcbiAgICBodW1hbl9hcHByb3ZlZCA9IF9ib29sKG9iai5nZXQoXCJodW1hbl9hcHByb3ZlZFwiLCBGYWxzZSksIFwicGF5bG9hZC5odW1hbl9hcHByb3ZlZFwiKVxuICAgIHJldHVybiBfcmVzdWx0X2RpY3QoXG4gICAgICAgIHZlcmlmeV9jbGFpbShcbiAgICAgICAgICAgIGNsYWltLFxuICAgICAgICAgICAgZXZpZGVuY2UsXG4gICAgICAgICAgICBwb2xpY3k9cG9saWN5LFxuICAgICAgICAgICAgZXZhbHVhdGlvbl90aW1lPWV2YWx1YXRpb25fdGltZSxcbiAgICAgICAgICAgIGh1bWFuX2FwcHJvdmVkPWh1bWFuX2FwcHJvdmVkLFxuICAgICAgICApXG4gICAgKVxuXG5cbmRlZiB2ZXJpZnlfY29tcG91bmRfcGF5bG9hZChwYXlsb2FkOiBNYXBwaW5nW3N0ciwgQW55XSkgLT4gZGljdFtzdHIsIEFueV06XG4gICAgb2JqID0gX21hcHBpbmcocGF5bG9hZCwgXCJwYXlsb2FkXCIpXG4gICAgY2xhaW1zX3JhdyA9IF9saXN0KF9yZXF1aXJlZChvYmosIFwiY2xhaW1zXCIsIFwicGF5bG9hZFwiKSwgXCJwYXlsb2FkLmNsYWltc1wiKVxuICAgIGNsYWltcyA9IHR1cGxlKF9jbGFpbShpdGVtLCBmXCJjbGFpbXNbe2luZGV4fV1cIikgZm9yIGluZGV4LCBpdGVtIGluIGVudW1lcmF0ZShjbGFpbXNfcmF3KSlcbiAgICBjbGFpbV9pZHMgPSB7Y2xhaW0uY2xhaW1faWQgZm9yIGNsYWltIGluIGNsYWltc31cblxuICAgIGV2aWRlbmNlX21hcF9yYXcgPSBfbWFwcGluZyhcbiAgICAgICAgX3JlcXVpcmVkKG9iaiwgXCJldmlkZW5jZV9ieV9jbGFpbVwiLCBcInBheWxvYWRcIiksXG4gICAgICAgIFwicGF5bG9hZC5ldmlkZW5jZV9ieV9jbGFpbVwiLFxuICAgIClcbiAgICB1bmtub3duX2V2aWRlbmNlX2lkcyA9IHNldChldmlkZW5jZV9tYXBfcmF3KSAtIGNsYWltX2lkc1xuICAgIGlmIHVua25vd25fZXZpZGVuY2VfaWRzOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgXCJldmlkZW5jZV9ieV9jbGFpbSBjb250YWlucyB1bmtub3duIGNsYWltIGlkOiBcIlxuICAgICAgICAgICAgKyBcIiwgXCIuam9pbihzb3J0ZWQodW5rbm93bl9ldmlkZW5jZV9pZHMpKVxuICAgICAgICApXG5cbiAgICBldmlkZW5jZV9ieV9jbGFpbSA9IHtcbiAgICAgICAgY2xhaW1faWQ6IHR1cGxlKFxuICAgICAgICAgICAgX2V2aWRlbmNlKGl0ZW0sIGZcImV2aWRlbmNlX2J5X2NsYWltLntjbGFpbV9pZH1be2luZGV4fV1cIilcbiAgICAgICAgICAgIGZvciBpbmRleCwgaXRlbSBpbiBlbnVtZXJhdGUoXG4gICAgICAgICAgICAgICAgX2xpc3QoZXZpZGVuY2VfbWFwX3Jhdy5nZXQoY2xhaW1faWQsIFtdKSwgZlwiZXZpZGVuY2VfYnlfY2xhaW0ue2NsYWltX2lkfVwiKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGZvciBjbGFpbV9pZCBpbiBjbGFpbV9pZHNcbiAgICB9XG5cbiAgICBhcHByb3ZhbHNfcmF3ID0gX21hcHBpbmcob2JqLmdldChcImh1bWFuX2FwcHJvdmFsc1wiLCB7fSksIFwicGF5bG9hZC5odW1hbl9hcHByb3ZhbHNcIilcbiAgICB1bmtub3duX2FwcHJvdmFsX2lkcyA9IHNldChhcHByb3ZhbHNfcmF3KSAtIGNsYWltX2lkc1xuICAgIGlmIHVua25vd25fYXBwcm92YWxfaWRzOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgXCJodW1hbl9hcHByb3ZhbHMgY29udGFpbnMgdW5rbm93biBjbGFpbSBpZDogXCJcbiAgICAgICAgICAgICsgXCIsIFwiLmpvaW4oc29ydGVkKHVua25vd25fYXBwcm92YWxfaWRzKSlcbiAgICAgICAgKVxuICAgIGFwcHJvdmFscyA9IHtcbiAgICAgICAgY2xhaW1faWQ6IF9ib29sKHZhbHVlLCBmXCJodW1hbl9hcHByb3ZhbHMue2NsYWltX2lkfVwiKVxuICAgICAgICBmb3IgY2xhaW1faWQsIHZhbHVlIGluIGFwcHJvdmFsc19yYXcuaXRlbXMoKVxuICAgIH1cblxuICAgIHBvbGljeSA9IF9wb2xpY3koX3JlcXVpcmVkKG9iaiwgXCJwb2xpY3lcIiwgXCJwYXlsb2FkXCIpKVxuICAgIGV2YWx1YXRpb25fdGltZSA9IF9kYXRldGltZShcbiAgICAgICAgX3JlcXVpcmVkKG9iaiwgXCJldmFsdWF0aW9uX3RpbWVcIiwgXCJwYXlsb2FkXCIpLFxuICAgICAgICBcInBheWxvYWQuZXZhbHVhdGlvbl90aW1lXCIsXG4gICAgKVxuICAgIHJlc3VsdCA9IHZlcmlmeV9jb21wb3VuZChcbiAgICAgICAgY2xhaW1zLFxuICAgICAgICBldmlkZW5jZV9ieV9jbGFpbSxcbiAgICAgICAgcG9saWN5PXBvbGljeSxcbiAgICAgICAgZXZhbHVhdGlvbl90aW1lPWV2YWx1YXRpb25fdGltZSxcbiAgICAgICAgaHVtYW5fYXBwcm92YWxzPWFwcHJvdmFscyxcbiAgICApXG4gICAgcmV0dXJuIHtcbiAgICAgICAgXCJzY2hlbWFfdmVyc2lvblwiOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgXCJhbGdvcml0aG1fdmVyc2lvblwiOiBBTEdPUklUSE1fVkVSU0lPTixcbiAgICAgICAgXCJ2ZXJkaWN0XCI6IHJlc3VsdC52ZXJkaWN0LnZhbHVlLFxuICAgICAgICBcInJlc3VsdHNcIjogW19yZXN1bHRfZGljdChpdGVtKSBmb3IgaXRlbSBpbiByZXN1bHQucmVzdWx0c10sXG4gICAgfSIsICJkZW1vIjogIlwiXCJcIlB1YmxpYyBzdXBwbGllZC1ldmlkZW5jZSBib3VuZGFyeSB2MS4xLjA7IGFwcHJvdmFscyBhcmUgbmV2ZXIgYXV0aGVudGljYXRlZC5cIlwiXCJcbmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lem9uZVxuZnJvbSBib2R1bHNraWhhbF9jb3JlIGltcG9ydCB2ZXJpZnlfcGF5bG9hZCwgdmVyaWZ5X2NvbXBvdW5kX3BheWxvYWRcbmZyb20gc2FmZV9qc29uIGltcG9ydCBzdHJpY3RfbG9hZHMsIHN0cmljdF9kdW1wc1xuZnJvbSBtYXRyaXhfY29yZSBpbXBvcnQgcGFyc2VfaW5zdGFudFxuXG5CT1VOREFSWV9WRVJTSU9OID0gXCIxLjEuMFwiXG5NQVhfRVZJREVOQ0UgPSAxMDAwXG5cblxuZGVmIF90aW1lcyhwYXlsb2FkLCBldmlkZW5jZSk6XG4gICAgaWYgXCJldmFsdWF0aW9uX3RpbWVcIiBpbiBwYXlsb2FkOlxuICAgICAgICBwYXlsb2FkW1wiZXZhbHVhdGlvbl90aW1lXCJdID0gcGFyc2VfaW5zdGFudChwYXlsb2FkW1wiZXZhbHVhdGlvbl90aW1lXCJdKS5pc29mb3JtYXQoKVxuICAgIGZvciBpdGVtIGluIGV2aWRlbmNlOlxuICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIGRpY3QpIGFuZCBcIm9ic2VydmVkX2F0XCIgaW4gaXRlbTpcbiAgICAgICAgICAgIGl0ZW1bXCJvYnNlcnZlZF9hdFwiXSA9IHBhcnNlX2luc3RhbnQoaXRlbVtcIm9ic2VydmVkX2F0XCJdKS5pc29mb3JtYXQoKVxuXG5cbmRlZiBldmFsdWF0ZShwYXlsb2FkLCBiYXRjaD1GYWxzZSk6XG4gICAgXCJcIlwiQm91bmRlZCBsb2NhbCBldmFsdWF0aW9uLiBJbnB1dCBldmlkZW5jZSBpcyBzdXBwbGllZCwgbm90IGZldGNoZWQvYXV0aGVudGljYXRlZC5cIlwiXCJcbiAgICB0cnk6XG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBheWxvYWQsIGRpY3QpIG9yIHR5cGUoYmF0Y2gpIGlzIG5vdCBib29sOlxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFwicGF5bG9hZCBtdXN0IGJlIGFuIG9iamVjdDsgYmF0Y2ggbXVzdCBiZSBib29sXCIpXG4gICAgICAgICMgQXBwbHkgdGhlIHNhbWUgZmluaXRlLW51bWJlciwgc2NhbGFyLVVuaWNvZGUgYW5kIHJlc291cmNlIGxpbWl0cyB0b1xuICAgICAgICAjIFB5dGhvbiBjYWxsZXJzIGFzIHRoZSBwdWJsaWMgSlNPTiBlbnRyeSBwb2ludC5cbiAgICAgICAgY2xlYW4gPSBzdHJpY3RfbG9hZHMoc3RyaWN0X2R1bXBzKHBheWxvYWQpKVxuICAgICAgICBpZiBiYXRjaDpcbiAgICAgICAgICAgIGNsYWltcyA9IGNsZWFuLmdldChcImNsYWltc1wiKVxuICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2xhaW1zLCBsaXN0KSBvciBub3QgMSA8PSBsZW4oY2xhaW1zKSA8PSAxMDA6XG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIlByb3ZpZGUgYmV0d2VlbiAxIGFuZCAxMDAgY2xhaW1zXCIpXG4gICAgICAgICAgICBldmlkZW5jZV9tYXAgPSBjbGVhbi5nZXQoXCJldmlkZW5jZV9ieV9jbGFpbVwiLCB7fSlcbiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV2aWRlbmNlX21hcCwgZGljdCk6XG4gICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFwiZXZpZGVuY2VfYnlfY2xhaW0gbXVzdCBiZSBhbiBvYmplY3RcIilcbiAgICAgICAgICAgIGlmIHN1bShsZW4odikgaWYgaXNpbnN0YW5jZSh2LCBsaXN0KSBlbHNlIE1BWF9FVklERU5DRSArIDEgZm9yIHYgaW4gZXZpZGVuY2VfbWFwLnZhbHVlcygpKSA+IE1BWF9FVklERU5DRTpcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiVG9vIG1hbnkgZXZpZGVuY2UgcmVjb3Jkc1wiKVxuICAgICAgICAgICAgX3RpbWVzKGNsZWFuLCBbaXRlbSBmb3IgcmVjb3JkcyBpbiBldmlkZW5jZV9tYXAudmFsdWVzKCkgZm9yIGl0ZW0gaW4gcmVjb3Jkc10pXG4gICAgICAgICAgICBjbGVhbltcImh1bWFuX2FwcHJvdmFsc1wiXSA9IHt9XG4gICAgICAgICAgICByZXR1cm4gdmVyaWZ5X2NvbXBvdW5kX3BheWxvYWQoY2xlYW4pXG4gICAgICAgIGV2aWRlbmNlID0gY2xlYW4uZ2V0KFwiZXZpZGVuY2VcIiwgW10pXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV2aWRlbmNlLCBsaXN0KSBvciBsZW4oZXZpZGVuY2UpID4gTUFYX0VWSURFTkNFOlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIkV2aWRlbmNlIG11c3QgYmUgYSBsaXN0IG9mIGF0IG1vc3QgMTAwMCByZWNvcmRzXCIpXG4gICAgICAgIF90aW1lcyhjbGVhbiwgZXZpZGVuY2UpXG4gICAgICAgIGNsZWFuW1wiaHVtYW5fYXBwcm92ZWRcIl0gPSBGYWxzZVxuICAgICAgICByZXR1cm4gdmVyaWZ5X3BheWxvYWQoY2xlYW4pXG4gICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IsIEtleUVycm9yLCBPdmVyZmxvd0Vycm9yLCBSZWN1cnNpb25FcnJvciwgVW5pY29kZUVycm9yKSBhcyBleGM6XG4gICAgICAgIHJldHVybiB7XCJjbGFzc2lmaWNhdGlvblwiOiBcIlVOS05PV05cIiwgXCJ2ZXJkaWN0XCI6IFwiQkxPQ0tcIiwgXCJyZWFzb25cIjogXCJpbnZhbGlkX2lucHV0XCIsIFwiZXJyb3JcIjogc3RyKGV4Yyl9XG5cblxuZGVmIGV2YWx1YXRlX2pzb24odGV4dCwgYmF0Y2g9RmFsc2UpOlxuICAgIHRyeTpcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlKHN0cmljdF9sb2Fkcyh0ZXh0KSwgYmF0Y2g9YmF0Y2gpXG4gICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IsIE92ZXJmbG93RXJyb3IsIFJlY3Vyc2lvbkVycm9yLCBVbmljb2RlRXJyb3IpIGFzIGV4YzpcbiAgICAgICAgcmV0dXJuIHtcImNsYXNzaWZpY2F0aW9uXCI6IFwiVU5LTk9XTlwiLCBcInZlcmRpY3RcIjogXCJCTE9DS1wiLCBcInJlYXNvblwiOiBcImludmFsaWRfanNvblwiLCBcImVycm9yXCI6IHN0cihleGMpfVxuXG5cbmRlZiBleGFtcGxlKHNjZW5hcmlvPVwic3VwcG9ydGVkXCIsICosIGF0PU5vbmUpOlxuICAgIFwiXCJcIlN5bnRoZXRpYyBmaXh0dXJlOyBhbiBleHBsaWNpdCBhd2FyZSBkYXRldGltZSBzdXBwb3J0cyBoaXN0b3JpY2FsIHJlcGxheS5cIlwiXCJcbiAgICBpbnN0YW50ID0gZGF0ZXRpbWUubm93KHRpbWV6b25lLnV0YykgaWYgYXQgaXMgTm9uZSBlbHNlIGF0XG4gICAgaWYgbm90IGlzaW5zdGFuY2UoaW5zdGFudCwgZGF0ZXRpbWUpIG9yIGluc3RhbnQudHppbmZvIGlzIE5vbmUgb3IgaW5zdGFudC51dGNvZmZzZXQoKSBpcyBOb25lOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiYXQgbXVzdCBiZSB0aW1lem9uZS1hd2FyZVwiKVxuICAgIG5vdyA9IGluc3RhbnQuYXN0aW1lem9uZSh0aW1lem9uZS51dGMpLmlzb2Zvcm1hdCgpXG4gICAgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJjbGFpbVwiOiB7XCJpZFwiOiBcInN5bnRoZXRpYy1jb3VudFwiLCBcInRleHRcIjogXCJUaGlzIHN5bnRoZXRpYyByZWNvcmQgY29udGFpbnMgMzAgcXVlc3Rpb25zXCIsIFwidHlwZVwiOiBcIm9ic2VydmF0aW9uXCIsIFwicmlza1wiOiBcImxvd1wifSxcbiAgICAgICAgXCJldmlkZW5jZVwiOiBbe1wic291cmNlX2lkXCI6IFwic3ludGhldGljLWRlbW9cIiwgXCJzdXBwb3J0c1wiOiBUcnVlLCBcIm9ic2VydmVkX2F0XCI6IG5vdywgXCJkaXJlY3RuZXNzXCI6IFwiZGlyZWN0XCIsIFwib3JpZ2luXCI6IFwiY29tcHV0ZWRfcmVzdWx0XCJ9XSxcbiAgICAgICAgXCJwb2xpY3lcIjoge1widmVyc2lvblwiOiBcIjMuMFwiLCBcIm1heF9hZ2Vfc2Vjb25kc1wiOiAzMDB9LFxuICAgICAgICBcImV2YWx1YXRpb25fdGltZVwiOiBub3csXG4gICAgfVxuICAgIGlmIHNjZW5hcmlvID09IFwidW5zdXBwb3J0ZWRcIjpcbiAgICAgICAgcGF5bG9hZFtcImV2aWRlbmNlXCJdID0gW11cbiAgICBlbGlmIHNjZW5hcmlvID09IFwiY29udHJhZGljdGlvblwiOlxuICAgICAgICBwYXlsb2FkW1wiZXZpZGVuY2VcIl1bMF1bXCJzdXBwb3J0c1wiXSA9IEZhbHNlXG4gICAgZWxpZiBzY2VuYXJpbyAhPSBcInN1cHBvcnRlZFwiOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiVW5rbm93biBzeW50aGV0aWMgc2NlbmFyaW9cIilcbiAgICByZXR1cm4gcGF5bG9hZFxuIiwgIm1hdHJpeF9jb3JlIjogIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcblwiXCJcIkJPRFVMQUkgTWF0cml4IENvcmU6IHBvcnRhYmxlIHYxIHRleHQgY2hlY2tzdW1zOyBBcGFjaGUtMi4wLlxuXG5BdXRob3I6IERhbWlyIEJhbGVub3ZpXHUwMTA3IChtaXJkYXgyNS11eCkuXG5UaGUgZm9ybWF0IGFuZCBub3JtYWxpemF0aW9uIHRhYmxlIGFyZSBmcm96ZW47IHNlZSBNQVRSSVhfRk9STUFULm1kLlxuQSBjaGVja3N1bSBpcyBub3QgYSBzaWduYXR1cmUsIGF1dGhvcml6YXRpb24sIG9yIGV2aWRlbmNlIG9mIHRydXRoLlxuXCJcIlwiXG5pbXBvcnQgaGFzaGxpYlxuaW1wb3J0IGhtYWNcbmltcG9ydCBqc29uXG5pbXBvcnQgbG9nZ2luZ1xuaW1wb3J0IHJlXG5pbXBvcnQgc3lzXG5mcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpvbmVcbmZyb20gdHlwaW5nIGltcG9ydCBBbnksIERpY3QsIE9wdGlvbmFsXG5cbkVOR0lORV9WRVJTSU9OID0gXCIzLjYuMC1PTUVHQVwiXG5DSEVDS1NVTV9GT1JNQVQgPSBcImJvZHVsLW1hdHJpeC12MVwiXG5OT1JNQUxJWkFUSU9OX1BST0ZJTEUgPSBcImJvZHVsLXdoaXRlc3BhY2UtdjFcIlxuSEFTSF9BTEdPUklUSE0gPSBcInNoYTI1NlwiXG5NQVhfUEFZTE9BRF9CWVRFUyA9IDFfMDQ4XzU3NlxuIyBGcm96ZW4gY29tcGF0aWJpbGl0eSB0YWJsZTogUHl0aG9uIDMuMTIgc3BsaXQoKSB3aGl0ZXNwYWNlLCAyOSBjb2RlIHBvaW50cy5cbiMgRG8gbm90IHJlcGxhY2Ugd2l0aCBzdHIuc3BsaXQoKSwgaXNzcGFjZSgpLCBvciByZWdleCBcXHM6IFVuaWNvZGUgZXZvbHZlcy5cbldISVRFU1BBQ0VfQ09ERVBPSU5UUyA9IChcbiAgICAweDAwMDksIDB4MDAwQSwgMHgwMDBCLCAweDAwMEMsIDB4MDAwRCxcbiAgICAweDAwMUMsIDB4MDAxRCwgMHgwMDFFLCAweDAwMUYsIDB4MDAyMCwgMHgwMDg1LCAweDAwQTAsIDB4MTY4MCxcbiAgICAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNyxcbiAgICAweDIwMDgsIDB4MjAwOSwgMHgyMDBBLCAweDIwMjgsIDB4MjAyOSwgMHgyMDJGLCAweDIwNUYsIDB4MzAwMCxcbilcbl9TRVBBUkFUT1JTID0gcmUuY29tcGlsZShcIltcIiArIFwiXCIuam9pbihjaHIobikgZm9yIG4gaW4gV0hJVEVTUEFDRV9DT0RFUE9JTlRTKSArIFwiXStcIilcbl9EQVRFID0gcmUuY29tcGlsZShyXCJbMC05XXs0fS1bMC05XXsyfS1bMC05XXsyfVxcWlwiKVxuX0hFWCA9IHJlLmNvbXBpbGUoclwiWzAtOWEtZl17NjR9XFxaXCIpXG5fSU5TVEFOVCA9IHJlLmNvbXBpbGUoclwiWzAtOV17NH0tWzAtOV17Mn0tWzAtOV17Mn1UWzAtOV17Mn06WzAtOV17Mn06WzAtOV17Mn0oPzpcXC5bMC05XXsxLDZ9KT8oPzpafFsrLV1bMC05XXsyfTpbMC05XXsyfSlcXFpcIilcbmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKFwiQm9kdWxNYXRyaXhDb3JlXCIpXG5sb2dnZXIuYWRkSGFuZGxlcihsb2dnaW5nLk51bGxIYW5kbGVyKCkpXG5cblxuZGVmIHBhcnNlX2luc3RhbnQodmFsdWU6IHN0cikgLT4gZGF0ZXRpbWU6XG4gICAgXCJcIlwiU3RhYmxlIEFTQ0lJIHRpbWVzdGFtcCBncmFtbWFyIHdpdGggd2hvbGUtbWludXRlIG9mZnNldHM7IHJldHVybiBVVEMuXCJcIlwiXG4gICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHN0cikgb3Igbm90IF9JTlNUQU5ULmZ1bGxtYXRjaCh2YWx1ZSk6XG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXCJVc2UgWVlZWS1NTS1ERFRISDpNTTpTU1suZmZmZmZmXVogb3IgYW4gZXhwbGljaXQgKy8tSEg6TU0gb2Zmc2V0XCIpXG4gICAgIyBSRkMgMzMzOSAtMDA6MDAgbWVhbnMgdW5rbm93biBsb2NhbCBvZmZzZXQsIG5vdCBjb25maXJtZWQgVVRDLlxuICAgIGlmIHZhbHVlLmVuZHN3aXRoKFwiLTAwOjAwXCIpOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiVW5rbm93biBVVEMgb2Zmc2V0IC0wMDowMCBpcyBub3QgYWNjZXB0ZWQ7IHVzZSBaIG9yICswMDowMFwiKVxuICAgIGlmIG5vdCB2YWx1ZS5lbmRzd2l0aChcIlpcIikgYW5kIChpbnQodmFsdWVbLTU6LTNdKSA+IDIzIG9yIGludCh2YWx1ZVstMjpdKSA+IDU5KTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIlVUQyBvZmZzZXQgaG91cnMgbXVzdCBiZSAwMC4uMjMgYW5kIG1pbnV0ZXMgMDAuLjU5XCIpXG4gICAgdHJ5OlxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZnJvbWlzb2Zvcm1hdCh2YWx1ZVs6LTFdICsgXCIrMDA6MDBcIiBpZiB2YWx1ZS5lbmRzd2l0aChcIlpcIikgZWxzZSB2YWx1ZSkuYXN0aW1lem9uZSh0aW1lem9uZS51dGMpXG4gICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKSBhcyBleGM6XG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXCJUaW1lc3RhbXAgaXMgb3V0c2lkZSB0aGUgc3VwcG9ydGVkIEdyZWdvcmlhbiByYW5nZSAwMDAxLi45OTk5XCIpIGZyb20gZXhjXG5cblxuZGVmIF9kYXRlKHZhbHVlOiBBbnkpIC0+IHN0cjpcbiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSBvciBub3QgX0RBVEUuZnVsbG1hdGNoKHZhbHVlKTpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIkRhdGUgbXVzdCBiZSBZWVlZLU1NLUREXCIpXG4gICAgZGF0ZXRpbWUoaW50KHZhbHVlWzo0XSksIGludCh2YWx1ZVs1OjddKSwgaW50KHZhbHVlWzg6MTBdKSlcbiAgICByZXR1cm4gdmFsdWVcblxuXG5kZWYgX2lucHV0X2Vycm9yKHBheWxvYWQ6IEFueSkgLT4gT3B0aW9uYWxbc3RyXTpcbiAgICBpZiBub3QgaXNpbnN0YW5jZShwYXlsb2FkLCBzdHIpOlxuICAgICAgICByZXR1cm4gXCJFTVBUWV9PUl9JTlZBTElEX1BBWUxPQURcIlxuICAgIGlmIGxlbihwYXlsb2FkKSA+IE1BWF9QQVlMT0FEX0JZVEVTOlxuICAgICAgICByZXR1cm4gXCJQQVlMT0FEX1RPT19MQVJHRVwiXG4gICAgdHJ5OlxuICAgICAgICBpZiBsZW4ocGF5bG9hZC5lbmNvZGUoXCJ1dGYtOFwiLCBlcnJvcnM9XCJzdHJpY3RcIikpID4gTUFYX1BBWUxPQURfQllURVM6XG4gICAgICAgICAgICByZXR1cm4gXCJQQVlMT0FEX1RPT19MQVJHRVwiXG4gICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjpcbiAgICAgICAgcmV0dXJuIFwiSU5WQUxJRF9VTklDT0RFXCJcbiAgICByZXR1cm4gTm9uZVxuXG5cbmRlZiBub3JtYWxpemVfcGF5bG9hZChwYXlsb2FkOiBzdHIpIC0+IHN0cjpcbiAgICBcIlwiXCJDb2xsYXBzZSB0aGUgZnJvemVuIHdoaXRlc3BhY2UgdGFibGU7IG5vIFVuaWNvZGUgbm9ybWFsaXphdGlvbi9jYXNlZm9sZC5cIlwiXCJcbiAgICBlcnJvciA9IF9pbnB1dF9lcnJvcihwYXlsb2FkKVxuICAgIGlmIGVycm9yOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm9yKVxuICAgICMgdHJpbSBvbmx5IHRoZSBleHBsaWNpdCB0YWJsZTsgb3JkaW5hcnkgc3RyLnN0cmlwKCkgaXMgVW5pY29kZS1kZXBlbmRlbnQuXG4gICAgcmV0dXJuIF9TRVBBUkFUT1JTLnN1YihcIiBcIiwgcGF5bG9hZCkuc3RyaXAoXCIgXCIpXG5cblxuZGVmIGNoZWNrc3VtX2Zvcl9kYXRlKHBheWxvYWQ6IHN0ciwgc2VhbF9kYXRlOiBzdHIpIC0+IHN0cjpcbiAgICBcIlwiXCJObyBjbG9jayBvciBuZXR3b3JrOiBjaGVja3N1bSBvZiBub24tZW1wdHkgbm9ybWFsaXplZCB0ZXh0IGFuZCBVVEMgZGF0ZS5cIlwiXCJcbiAgICBjbGVhbiA9IG5vcm1hbGl6ZV9wYXlsb2FkKHBheWxvYWQpXG4gICAgaWYgbm90IGNsZWFuOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiRU1QVFlfT1JfSU5WQUxJRF9QQVlMT0FEXCIpXG4gICAgcmF3ID0gXCJCT0RVTF9NQVRSSVg6OlwiICsgY2xlYW4gKyBcIjo6XCIgKyBfZGF0ZShzZWFsX2RhdGUpICsgXCI6Ok9NRUdBX0ZMT1dcIlxuICAgIHJldHVybiBoYXNobGliLnNoYTI1NihyYXcuZW5jb2RlKFwidXRmLThcIiwgZXJyb3JzPVwic3RyaWN0XCIpKS5oZXhkaWdlc3QoKVxuXG5cbmNsYXNzIERldGVybWluaXN0aWNNYXRyaXhDb3JlOlxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmdpbmVfdmVyc2lvbjogc3RyID0gRU5HSU5FX1ZFUlNJT04pOlxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlbmdpbmVfdmVyc2lvbiwgc3RyKSBvciBub3QgZW5naW5lX3ZlcnNpb24uc3RyaXAoKSBvciBsZW4oZW5naW5lX3ZlcnNpb24pID4gMTI4OlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcImVuZ2luZV92ZXJzaW9uIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIG9mIGF0IG1vc3QgMTI4IGNoYXJhY3RlcnNcIilcbiAgICAgICAgc2VsZi5lbmdpbmVfdmVyc2lvbiA9IGVuZ2luZV92ZXJzaW9uXG5cbiAgICBAc3RhdGljbWV0aG9kXG4gICAgZGVmIF9zYW5pdGl6ZV9wYXlsb2FkKHBheWxvYWQ6IEFueSkgLT4gT3B0aW9uYWxbc3RyXTpcbiAgICAgICAgaWYgX2lucHV0X2Vycm9yKHBheWxvYWQpOlxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9wYXlsb2FkKHBheWxvYWQpIG9yIE5vbmVcblxuICAgIEBzdGF0aWNtZXRob2RcbiAgICBkZWYgX3V0Y19ub3cobm93OiBPcHRpb25hbFtkYXRldGltZV0pIC0+IGRhdGV0aW1lOlxuICAgICAgICBpZiBub3cgaXMgTm9uZTpcbiAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5ub3codGltZXpvbmUudXRjKVxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub3csIGRhdGV0aW1lKTpcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcIm5vdyBtdXN0IGJlIGEgdGltZXpvbmUtYXdhcmUgZGF0ZXRpbWUgb3IgTm9uZVwiKVxuICAgICAgICBpZiBub3cudHppbmZvIGlzIE5vbmUgb3Igbm93LnV0Y29mZnNldCgpIGlzIE5vbmU6XG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwibm93IG11c3QgaW5jbHVkZSBhIFVUQyBvZmZzZXQgb3IgdGltZXpvbmVcIilcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgcmV0dXJuIG5vdy5hc3RpbWV6b25lKHRpbWV6b25lLnV0YylcbiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKSBhcyBleGM6XG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiVVRDIGluc3RhbnQgaXMgb3V0c2lkZSBzdXBwb3J0ZWQgeWVhcnMgMDAwMS4uOTk5OVwiKSBmcm9tIGV4Y1xuXG4gICAgZGVmIGVuZm9yY2VfemVyb190b2xlcmFuY2VfbWF0cml4KHNlbGYsIHBheWxvYWQ6IEFueSwgbm93OiBPcHRpb25hbFtkYXRldGltZV0gPSBOb25lKSAtPiBEaWN0W3N0ciwgQW55XTpcbiAgICAgICAgaW5zdGFudCA9IHNlbGYuX3V0Y19ub3cobm93KVxuICAgICAgICBtZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIFwidGltZXN0YW1wXCI6IGluc3RhbnQuaXNvZm9ybWF0KCksIFwiZW5naW5lX3ZlcnNpb25cIjogc2VsZi5lbmdpbmVfdmVyc2lvbixcbiAgICAgICAgICAgIFwiY2hlY2tzdW1fZm9ybWF0XCI6IENIRUNLU1VNX0ZPUk1BVCwgXCJub3JtYWxpemF0aW9uX3Byb2ZpbGVcIjogTk9STUFMSVpBVElPTl9QUk9GSUxFLFxuICAgICAgICAgICAgXCJoYXNoX2FsZ29yaXRobVwiOiBIQVNIX0FMR09SSVRITSxcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IF9pbnB1dF9lcnJvcihwYXlsb2FkKVxuICAgICAgICBjbGVhbiA9IE5vbmUgaWYgZXJyb3IgZWxzZSBub3JtYWxpemVfcGF5bG9hZChwYXlsb2FkKVxuICAgICAgICBpZiBub3QgY2xlYW46XG4gICAgICAgICAgICByZXR1cm4ge1widmFsaWRcIjogRmFsc2UsIFwiZXJyb3JcIjogZXJyb3Igb3IgXCJFTVBUWV9PUl9JTlZBTElEX1BBWUxPQURcIiwgKiptZXRhZGF0YX1cbiAgICAgICAgc2VhbF9kYXRlID0gaW5zdGFudC5kYXRlKCkuaXNvZm9ybWF0KClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwidmFsaWRcIjogVHJ1ZSwgXCJpbnB1dF9wYXlsb2FkXCI6IGNsZWFuLCBcInNlYWxfZGF0ZVwiOiBzZWFsX2RhdGUsXG4gICAgICAgICAgICBcIm1hdHJpeF92ZXJpZmljYXRpb25fc2VhbFwiOiBjaGVja3N1bV9mb3JfZGF0ZShjbGVhbiwgc2VhbF9kYXRlKSwgKiptZXRhZGF0YSxcbiAgICAgICAgfVxuXG5cbmRlZiB2ZXJpZnlfcmVzdWx0KHJlc3VsdDogQW55KSAtPiBEaWN0W3N0ciwgQW55XTpcbiAgICBcIlwiXCJDaGVjayBjaGVja3N1bSBjb25zaXN0ZW5jeSBvZiBhbiBleHBvcnRlZCByZXN1bHQsIG5ldmVyIHNvdXJjZSBpZGVudGl0eS5cblxuICAgIFJlYWRzIG9yaWdpbmFsIDMuNS4xIHJlY29yZHMgYW5kIGV4cGxpY2l0IHYxIHJlY29yZHMuIFVua25vd24gZm9ybWF0cyBhbmRcbiAgICBwYXJ0aWFsbHkgbGFiZWxlZCByZWNvcmRzIGZhaWwgY2xvc2VkLiBNZXRhZGF0YSBpcyBub3QgYXV0aGVudGljYXRlZC5cbiAgICBcIlwiXCJcbiAgICBkZWYgcmVqZWN0KHJlYXNvbik6XG4gICAgICAgIHJldHVybiB7XCJ2ZXJpZmllZFwiOiBGYWxzZSwgXCJzY29wZVwiOiBcImNoZWNrc3VtX2NvbnNpc3RlbmN5XCIsIFwiZXJyb3JcIjogcmVhc29ufVxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHJlc3VsdCwgZGljdCkgb3IgcmVzdWx0LmdldChcInZhbGlkXCIpIGlzIG5vdCBUcnVlOlxuICAgICAgICByZXR1cm4gcmVqZWN0KFwiSU5WQUxJRF9SRVNVTFRcIilcbiAgICBiYXNlID0ge1widmFsaWRcIiwgXCJpbnB1dF9wYXlsb2FkXCIsIFwic2VhbF9kYXRlXCIsIFwibWF0cml4X3ZlcmlmaWNhdGlvbl9zZWFsXCIsIFwidGltZXN0YW1wXCIsIFwiZW5naW5lX3ZlcnNpb25cIn1cbiAgICBpZGVudGlmaWVycyA9IHtcImNoZWNrc3VtX2Zvcm1hdFwiLCBcIm5vcm1hbGl6YXRpb25fcHJvZmlsZVwiLCBcImhhc2hfYWxnb3JpdGhtXCJ9XG4gICAgaWYgc2V0KHJlc3VsdCkgPT0gYmFzZTpcbiAgICAgICAgaWYgcmVzdWx0LmdldChcImVuZ2luZV92ZXJzaW9uXCIpICE9IFwiMy41LjEtT01FR0FcIjpcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoXCJVTkxBQkVMRURfRk9STUFUXCIpXG4gICAgZWxpZiBzZXQocmVzdWx0KSA9PSBiYXNlIHwgaWRlbnRpZmllcnM6XG4gICAgICAgIGlmIHJlc3VsdC5nZXQoXCJjaGVja3N1bV9mb3JtYXRcIikgIT0gQ0hFQ0tTVU1fRk9STUFUIG9yIHJlc3VsdC5nZXQoXCJub3JtYWxpemF0aW9uX3Byb2ZpbGVcIikgIT0gTk9STUFMSVpBVElPTl9QUk9GSUxFIG9yIHJlc3VsdC5nZXQoXCJoYXNoX2FsZ29yaXRobVwiKSAhPSBIQVNIX0FMR09SSVRITTpcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoXCJVTlNVUFBPUlRFRF9GT1JNQVRcIilcbiAgICBlbHNlOlxuICAgICAgICByZXR1cm4gcmVqZWN0KFwiVU5FWFBFQ1RFRF9GSUVMRFNcIilcbiAgICB0cnk6XG4gICAgICAgIHZlcnNpb24gPSByZXN1bHRbXCJlbmdpbmVfdmVyc2lvblwiXVxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBzdHIpIG9yIG5vdCB2ZXJzaW9uLnN0cmlwKCkgb3IgbGVuKHZlcnNpb24pID4gMTI4OlxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChcIklOVkFMSURfTUVUQURBVEFcIilcbiAgICAgICAgcGF5bG9hZCA9IHJlc3VsdFtcImlucHV0X3BheWxvYWRcIl1cbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGF5bG9hZCwgc3RyKSBvciBub3QgcGF5bG9hZCBvciBub3JtYWxpemVfcGF5bG9hZChwYXlsb2FkKSAhPSBwYXlsb2FkOlxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChcIk5PTl9DQU5PTklDQUxfUEFZTE9BRFwiKVxuICAgICAgICBpbnN0YW50ID0gcGFyc2VfaW5zdGFudChyZXN1bHRbXCJ0aW1lc3RhbXBcIl0pXG4gICAgICAgIGlmIGluc3RhbnQuZGF0ZSgpLmlzb2Zvcm1hdCgpICE9IF9kYXRlKHJlc3VsdFtcInNlYWxfZGF0ZVwiXSk6XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KFwiREFURV9NSVNNQVRDSFwiKVxuICAgICAgICBleHBlY3RlZCA9IGNoZWNrc3VtX2Zvcl9kYXRlKHBheWxvYWQsIHJlc3VsdFtcInNlYWxfZGF0ZVwiXSlcbiAgICAgICAgcHJvdmlkZWQgPSByZXN1bHRbXCJtYXRyaXhfdmVyaWZpY2F0aW9uX3NlYWxcIl1cbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvdmlkZWQsIHN0cikgb3Igbm90IF9IRVguZnVsbG1hdGNoKHByb3ZpZGVkKSBvciBub3QgaG1hYy5jb21wYXJlX2RpZ2VzdChleHBlY3RlZCwgcHJvdmlkZWQpOlxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChcIkNIRUNLU1VNX01JU01BVENIXCIpXG4gICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IsIE92ZXJmbG93RXJyb3IpOlxuICAgICAgICByZXR1cm4gcmVqZWN0KFwiSU5WQUxJRF9SRVNVTFRcIilcbiAgICByZXR1cm4ge1widmVyaWZpZWRcIjogVHJ1ZSwgXCJzY29wZVwiOiBcImNoZWNrc3VtX2NvbnNpc3RlbmN5XCIsIFwiY2hlY2tzdW1fZm9ybWF0XCI6IENIRUNLU1VNX0ZPUk1BVCwgXCJtZXRhZGF0YV9hdXRoZW50aWNhdGVkXCI6IEZhbHNlfVxuXG5cbmRlZiBtYWluKGFyZ3Y9Tm9uZSkgLT4gaW50OlxuICAgIFwiXCJcIkpTT04tb25seSBDTEkuIEV4aXQgMCB2YWxpZDsgMiBpbnZhbGlkIGlucHV0OyAxIHVuZXhwZWN0ZWQgZmFpbHVyZS5cIlwiXCJcbiAgICBpbXBvcnQgYXJncGFyc2VcbiAgICBmb3Igc3RyZWFtIGluIChzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyKTpcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgc3RyZWFtLnJlY29uZmlndXJlKGVuY29kaW5nPVwidXRmLThcIilcbiAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcik6XG4gICAgICAgICAgICBwYXNzXG4gICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249X19kb2NfXylcbiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KFwicGF5bG9hZFwiLCBuYXJncz1cIipcIilcbiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KFwiLS1hdFwiLCBoZWxwPVwiRXhwbGljaXQgdGltZXpvbmUgcmVxdWlyZWQ7IHNlZSBNQVRSSVhfRk9STUFULm1kXCIpXG4gICAgcGFyc2VyLmFkZF9hcmd1bWVudChcIi0tdmVyYm9zZVwiLCBhY3Rpb249XCJzdG9yZV90cnVlXCIpXG4gICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpXG4gICAgaWYgYXJncy52ZXJib3NlOlxuICAgICAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgc3RyZWFtPXN5cy5zdGRlcnIpXG4gICAgdHJ5OlxuICAgICAgICBpbnN0YW50ID0gcGFyc2VfaW5zdGFudChhcmdzLmF0KSBpZiBhcmdzLmF0IGlzIG5vdCBOb25lIGVsc2UgTm9uZVxuICAgICAgICByZXN1bHQgPSBEZXRlcm1pbmlzdGljTWF0cml4Q29yZSgpLmVuZm9yY2VfemVyb190b2xlcmFuY2VfbWF0cml4KFwiIFwiLmpvaW4oYXJncy5wYXlsb2FkKSwgaW5zdGFudClcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcikgYXMgZXhjOlxuICAgICAgICBwcmludChqc29uLmR1bXBzKHtcInZhbGlkXCI6IEZhbHNlLCBcImVycm9yXCI6IFwiSU5WQUxJRF9USU1FU1RBTVBcIiwgXCJkZXRhaWxcIjogc3RyKGV4Yyl9LCBlbnN1cmVfYXNjaWk9VHJ1ZSkpXG4gICAgICAgIHJldHVybiAyXG4gICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQsIGVuc3VyZV9hc2NpaT1UcnVlLCBzb3J0X2tleXM9VHJ1ZSwgaW5kZW50PTIsIGFsbG93X25hbj1GYWxzZSkpXG4gICAgcmV0dXJuIDAgaWYgcmVzdWx0W1widmFsaWRcIl0gZWxzZSAyXG5cblxuaWYgX19uYW1lX18gPT0gXCJfX21haW5fX1wiOlxuICAgIHN5cy5leGl0KG1haW4oKSlcbiIsICJzYWZlX2pzb24iOiAiXCJcIlwiQm91bmRlZCBVVEYtOCBKU09OIGJvdW5kYXJ5LCByZWplY3RpbmcgZHVwbGljYXRlIGtleXMgYW5kIG5vbi1maW5pdGUgdmFsdWVzLlwiXCJcIlxuaW1wb3J0IGpzb25cblxuTUFYX0pTT05fQllURVMgPSAxXzA0OF81NzZcbk1BWF9KU09OX0RFUFRIID0gMzJcblxuXG5kZWYgX3BhaXJzKHBhaXJzKTpcbiAgICByZXN1bHQgPSB7fVxuICAgIGZvciBrZXksIHZhbHVlIGluIHBhaXJzOlxuICAgICAgICBpZiBrZXkgaW4gcmVzdWx0OlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIkR1cGxpY2F0ZSBKU09OIGtleVwiKVxuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgcmV0dXJuIHJlc3VsdFxuXG5cbmRlZiBfY29uc3RhbnQodmFsdWUpOlxuICAgIHJhaXNlIFZhbHVlRXJyb3IoXCJOb24tZmluaXRlIEpTT04gbnVtYmVyXCIpXG5cblxuZGVmIF9mbG9hdCh2YWx1ZSk6XG4gICAgaW1wb3J0IG1hdGhcbiAgICBwYXJzZWQgPSBmbG9hdCh2YWx1ZSlcbiAgICBpZiBub3QgbWF0aC5pc2Zpbml0ZShwYXJzZWQpOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiTm9uLWZpbml0ZSBKU09OIG51bWJlclwiKVxuICAgIHJldHVybiBwYXJzZWRcblxuXG5kZWYgX2ludGVnZXIodmFsdWUpOlxuICAgICMgQ3Jvc3MtcnVudGltZSBib3VuZCwgaW5kZXBlbmRlbnQgb2YgUHl0aG9uJ3MgY2hhbmdpbmcgaW50IGNvbnZlcnNpb24gY2FwLlxuICAgIGlmIGxlbih2YWx1ZS5sc3RyaXAoXCItXCIpKSA+IDEyODpcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIkpTT04gaW50ZWdlciBleGNlZWRzIDEyOCBkaWdpdHNcIilcbiAgICByZXR1cm4gaW50KHZhbHVlKVxuXG5cbmRlZiBfY2hlY2tfdGV4dCh0ZXh0KTpcbiAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXh0LCBzdHIpIG9yIGxlbih0ZXh0KSA+IE1BWF9KU09OX0JZVEVTOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiSlNPTiBpbnB1dCBtdXN0IGJlIGJvdW5kZWQgVVRGLTggdGV4dFwiKVxuICAgIHRyeTpcbiAgICAgICAgaWYgbGVuKHRleHQuZW5jb2RlKFwidXRmLThcIiwgZXJyb3JzPVwic3RyaWN0XCIpKSA+IE1BWF9KU09OX0JZVEVTOlxuICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIkpTT04gaW5wdXQgdG9vIGxhcmdlXCIpXG4gICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvciBhcyBleGM6XG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXCJJbnZhbGlkIFVuaWNvZGUgc2NhbGFyIHZhbHVlXCIpIGZyb20gZXhjXG4gICAgIyBMaW1pdCBuZXN0aW5nIGJlZm9yZSBhc2tpbmcgYSByZWN1cnNpdmUgSlNPTiBkZWNvZGVyIHRvIGFsbG9jYXRlIG9iamVjdHMuXG4gICAgZGVwdGggPSAwXG4gICAgcXVvdGVkID0gZXNjYXBlZCA9IEZhbHNlXG4gICAgZm9yIGNoIGluIHRleHQ6XG4gICAgICAgIGlmIHF1b3RlZDpcbiAgICAgICAgICAgIGlmIGVzY2FwZWQ6XG4gICAgICAgICAgICAgICAgZXNjYXBlZCA9IEZhbHNlXG4gICAgICAgICAgICBlbGlmIGNoID09IFwiXFxcXFwiOlxuICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBUcnVlXG4gICAgICAgICAgICBlbGlmIGNoID09ICdcIic6XG4gICAgICAgICAgICAgICAgcXVvdGVkID0gRmFsc2VcbiAgICAgICAgZWxpZiBjaCA9PSAnXCInOlxuICAgICAgICAgICAgcXVvdGVkID0gVHJ1ZVxuICAgICAgICBlbGlmIGNoIGluIFwiW3tcIjpcbiAgICAgICAgICAgIGRlcHRoICs9IDFcbiAgICAgICAgICAgIGlmIGRlcHRoID4gTUFYX0pTT05fREVQVEg6XG4gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcIkpTT04gbmVzdGluZyB0b28gZGVlcFwiKVxuICAgICAgICBlbGlmIGNoIGluIFwiXX1cIjpcbiAgICAgICAgICAgIGRlcHRoIC09IDFcblxuXG5kZWYgc3RyaWN0X2xvYWRzKHRleHQpOlxuICAgIF9jaGVja190ZXh0KHRleHQpXG4gICAgdHJ5OlxuICAgICAgICB2YWx1ZSA9IGpzb24ubG9hZHModGV4dCwgb2JqZWN0X3BhaXJzX2hvb2s9X3BhaXJzLCBwYXJzZV9jb25zdGFudD1fY29uc3RhbnQsIHBhcnNlX2Zsb2F0PV9mbG9hdCwgcGFyc2VfaW50PV9pbnRlZ2VyKVxuICAgICAgICAjIEVzY2FwZWQgc3Vycm9nYXRlIHBhaXJzIGFyZSBkZWNvZGVkIG5vcm1hbGx5OyBsb25lIHN1cnJvZ2F0ZXMgZmFpbC5cbiAgICAgICAgc3RhY2sgPSBbdmFsdWVdXG4gICAgICAgIHdoaWxlIHN0YWNrOlxuICAgICAgICAgICAgaXRlbSA9IHN0YWNrLnBvcCgpXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHN0cik6XG4gICAgICAgICAgICAgICAgaXRlbS5lbmNvZGUoXCJ1dGYtOFwiLCBlcnJvcnM9XCJzdHJpY3RcIilcbiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpdGVtLCBkaWN0KTpcbiAgICAgICAgICAgICAgICBzdGFjay5leHRlbmQoaXRlbS5rZXlzKCkpXG4gICAgICAgICAgICAgICAgc3RhY2suZXh0ZW5kKGl0ZW0udmFsdWVzKCkpXG4gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaXRlbSwgbGlzdCk6XG4gICAgICAgICAgICAgICAgc3RhY2suZXh0ZW5kKGl0ZW0pXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIGV4Y2VwdCAoVW5pY29kZUVycm9yLCBSZWN1cnNpb25FcnJvcikgYXMgZXhjOlxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFwiSW52YWxpZCBKU09OIFVuaWNvZGUgb3IgbmVzdGluZ1wiKSBmcm9tIGV4Y1xuXG5cbmRlZiBzdHJpY3RfZHVtcHModmFsdWUpOlxuICAgIHJldHVybiBqc29uLmR1bXBzKHZhbHVlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgc29ydF9rZXlzPVRydWUsIGluZGVudD0yLCBhbGxvd19uYW49RmFsc2UpXG4ifQ=="))
package=types.ModuleType('bodulskihal_core');package.__path__=[]
sys.modules['bodulskihal_core']=package
for name in ('runtime_provenance','engine','adapter'):
module=types.ModuleType('bodulskihal_core.'+name)
module.__package__='bodulskihal_core'
sys.modules[module.__name__]=module
exec(compile(sources[name],name+'.py','exec'),module.__dict__)
package.verify_payload=sys.modules['bodulskihal_core.adapter'].verify_payload
package.verify_compound_payload=sys.modules['bodulskihal_core.adapter'].verify_compound_payload
module=types.ModuleType('safe_json');sys.modules['safe_json']=module
exec(compile(sources['safe_json'],'safe_json.py','exec'),module.__dict__)
module=types.ModuleType('matrix_core');sys.modules['matrix_core']=module
exec(compile(sources['matrix_core'],'matrix_core.py','exec'),module.__dict__)
module=types.ModuleType('demo');sys.modules['demo']=module
exec(compile(sources['demo'],'demo.py','exec'),module.__dict__)
import json
import gradio as gr
from demo import evaluate, evaluate_json, example
def verify_claim(payload_json: str) -> dict:
if not isinstance(payload_json, str):
return {'classification':'UNKNOWN','verdict':'BLOCK','reason':'invalid_json'}
try:
if len(payload_json.encode('utf-8', errors='strict')) > 65536:
return {'classification':'UNKNOWN','verdict':'BLOCK','reason':'payload_too_large'}
except UnicodeError:
return {'classification':'UNKNOWN','verdict':'BLOCK','reason':'invalid_unicode'}
return evaluate_json(payload_json)
def preset(scenario):
payload = json.dumps(example(scenario), indent=2)
return payload, verify_claim(payload)
from datetime import datetime, timezone
from matrix_core import DeterministicMatrixCore, ENGINE_VERSION, parse_instant, verify_result
from safe_json import strict_loads
def matrix_checksum(text: str, at: str = "") -> dict:
"""Normalize text and return a UTC-date checksum, not a signature or truth verdict."""
try:
if not isinstance(at, str):
raise TypeError("Timestamp must be an ISO 8601 string with a timezone")
instant = parse_instant(at) if at else None
return DeterministicMatrixCore().enforce_zero_tolerance_matrix(text, now=instant)
except (TypeError, ValueError) as exc:
return {"valid": False, "error": "INVALID_TIMESTAMP", "detail": str(exc), "engine_version": ENGINE_VERSION}
def matrix_repeatability(text: str, at: str = "") -> dict:
instant = at.strip() if isinstance(at, str) else at
if instant == "":
instant = datetime.now(timezone.utc).isoformat()
first = matrix_checksum(text, instant)
return {
"iterations": 25,
"identical_results": all(matrix_checksum(text, instant) == first for _ in range(24)),
"result": first,
}
def matrix_fixture(kind: str):
text = " Evidence\tbefore\nconfidence. "
at = "2026-11-03T12:00:00+00:00"
if kind == "empty":
text = " \t\n"
elif kind == "boundary":
at = "2026-11-04T00:30:00+02:00"
return text, at, matrix_checksum(text, at)
def verify_saved_matrix(text):
try:
return verify_result(strict_loads(text))
except (ValueError, TypeError) as exc:
return {"verified": False, "scope": "checksum_consistency", "error": "INVALID_JSON", "detail": str(exc)}
def add_matrix_ui(gr):
gr.Markdown("## Matrix Core - text checksum\nVersion **3.6.0-OMEGA**. Whitespace normalization and a SHA-256 checksum over text plus UTC date. **This is not a signature, a truth verdict or permission to execute a command.** `valid: true` means only that the input is non-empty text. A fixed timestamp makes the complete response repeatable.")
with gr.Row():
with gr.Column():
matrix_text = gr.Textbox(label="Matrix input text", value="Evidence before confidence.", lines=3)
matrix_at = gr.Textbox(label="UTC instant (optional; timezone required)", placeholder="2026-11-03T12:00:00+00:00")
matrix_compute = gr.Button("Compute Matrix checksum", variant="primary")
with gr.Row():
matrix_sample = gr.Button("Matrix sample")
matrix_empty = gr.Button("Empty Matrix input")
matrix_boundary = gr.Button("UTC boundary sample")
matrix_repeat = gr.Button("Repeat Matrix checksum (25)")
with gr.Column():
matrix_output = gr.JSON(label="Matrix checksum result (not a signature)")
matrix_compute.click(matrix_checksum, [matrix_text, matrix_at], matrix_output, api_name=False)
matrix_sample.click(lambda: matrix_fixture("valid"), None, [matrix_text, matrix_at, matrix_output], api_name=False)
matrix_empty.click(lambda: matrix_fixture("empty"), None, [matrix_text, matrix_at, matrix_output], api_name=False)
matrix_boundary.click(lambda: matrix_fixture("boundary"), None, [matrix_text, matrix_at, matrix_output], api_name=False)
matrix_repeat.click(matrix_repeatability, [matrix_text, matrix_at], matrix_output, api_name=False)
gr.Markdown("[Open the standalone offline checksum tool](./offline.html) · [Download the complete offline source archive](./bodul-offline-1.1.0.zip)")
saved_matrix = gr.Code(label="Saved Matrix result JSON", language="json", lines=5)
verify_saved = gr.Button("Verify saved checksum")
verify_saved.click(verify_saved_matrix, saved_matrix, matrix_output, api_name=False)
with gr.Blocks(title='Bodulski HAL | Evidence Playground', analytics_enabled=False) as app:
gr.Markdown('# Bodulski HAL\n### Evidence before confidence. Free browser execution.\nDeterministic verification of structured claims. No sampling, no model weights, no API keys. Python runs inside your browser.')
gr.Markdown('**Public demo:** examples use synthetic evidence. Do not submit secrets. Caller-supplied human approval flags are ignored. A receipt does not prove that evidence is true.')
with gr.Row():
with gr.Column():
payload = gr.Code(value=json.dumps(example(),indent=2), language='json', label='Claim, evidence and policy', lines=20)
verify = gr.Button('Verify claim', variant='primary')
with gr.Row():
supported = gr.Button('Supported sample')
missing = gr.Button('No evidence')
contradiction = gr.Button('Counterevidence')
with gr.Column():
result = gr.JSON(label='Classification · Verdict · SHA-256 receipt')
verify.click(verify_claim, payload, result, api_name='verify_claim')
supported.click(lambda: preset('supported'), None, [payload,result], api_name=False)
missing.click(lambda: preset('unsupported'), None, [payload,result], api_name=False)
contradiction.click(lambda: preset('contradiction'), None, [payload,result], api_name=False)
repeat=gr.Button('Check repeatability (25 identical inputs)')
def repeatability(text):
first=verify_claim(text)
return {'iterations':25,'identical_outputs':all(verify_claim(text)==first for _ in range(24)),'result':first}
repeat.click(repeatability,payload,result,api_name=False)
add_matrix_ui(gr)
gr.Markdown('### Decision contract\n`APPROVE`: evaluated gates pass. `BLOCK`: address the returned reason. `ESCALATE`: obtain clarification, additional evidence or authenticated human review.\n\nThe engine evaluates supplied evidence. It does not fetch or authenticate sources and cannot guarantee zero real-world hallucinations.\n\n[GitHub](https://github.com/mirdax25-ux) · [X](https://x.com/ddddddd97424402) · [LinkedIn](https://www.linkedin.com/in/damir-balenovic-594015429/) · [Apify Actor](https://apify.com/bodul/bodulskihal-claim-verifier)')
app.launch()