api.js 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var Api = (function () {
  4. function Api() {
  5. this.configOption = { ver: 1, versionName: 'v1.0.0', baseUrl: 'http://192.168.10.41:8003' };
  6. this.key = '';
  7. this.token = '';
  8. this.tokenValidCallback = function () { };
  9. }
  10. Api.prototype.version = function () {
  11. return this.configOption.versionName;
  12. };
  13. Api.prototype.init = function (config) {
  14. this.configOption = config;
  15. };
  16. Api.prototype.initBaseUrl = function (baseUrl) {
  17. this.configOption.baseUrl = baseUrl.replace(':443', '');
  18. console.log("initBaseUri:" + this.configOption.baseUrl);
  19. };
  20. Api.prototype.configAuthorize = function (key, token) {
  21. this.key = key;
  22. this.token = token;
  23. };
  24. Api.prototype.setTokenValidCallback = function (callback) {
  25. this.tokenValidCallback = callback;
  26. };
  27. Api.prototype.checkQrcode = function (secret) {
  28. var _this = this;
  29. var that = this;
  30. return new Promise(function (resolve, reject) {
  31. return _this.postRequest({
  32. url: '/api/ecs_oe_student/examControl/checkQrCode',
  33. parameter: {
  34. qrCode: secret
  35. }
  36. }, false).then(function (res) {
  37. console.log('then');
  38. if (res.key && res.token) {
  39. that.configAuthorize(res.key, res.token);
  40. var result = {
  41. courseId: res.courseId,
  42. courseName: res.courseName,
  43. examRecordDataId: res.examRecordDataId,
  44. examStudentId: res.examStudentId,
  45. questionMainNumber: res.questionMainNumber,
  46. questionOrder: res.questionOrder,
  47. subNumber: res.subNumber
  48. };
  49. resolve(result);
  50. }
  51. else {
  52. reject('二维码已失效');
  53. }
  54. }, function (error) {
  55. reject(error);
  56. }).catch(function (exceptions) {
  57. reject(exceptions);
  58. });
  59. });
  60. };
  61. Api.prototype.getPaperStruct = function (examRecordDataId) {
  62. var _this = this;
  63. return new Promise(function (resovle, reject) {
  64. return _this.getRequest({
  65. url: '/api/ecs_oe_student/examRecordPaperStruct/getExamRecordPaperStruct',
  66. parameter: {
  67. examRecordDataId: examRecordDataId
  68. }
  69. }).then(function (res) {
  70. resovle(res);
  71. }, function (error) {
  72. reject(error);
  73. }).catch(function (exceptions) {
  74. reject(exceptions);
  75. });
  76. });
  77. };
  78. Api.prototype.getSign = function (examRecordDataId, examStudentId, order, fileMd5, suffix) {
  79. var _this = this;
  80. return new Promise(function (resolve, reject) {
  81. return _this.postRequest({
  82. url: '/api/ecs_oe_student/examControl/yunSignature',
  83. parameter: {
  84. examRecordDataId: examRecordDataId,
  85. examStudentId: examStudentId,
  86. order: order,
  87. fileMd5: fileMd5,
  88. fileSuffix: suffix
  89. }
  90. }).then(function (res) {
  91. var result = {
  92. accessUrl: res.accessUrl,
  93. formUrl: res.formUrl,
  94. fsType: res.fsType,
  95. uploadUrl: res.uploadUrl,
  96. formParams: res.formParams,
  97. signIdentifier: res.signIdentifier,
  98. };
  99. resolve(result);
  100. }, function (error) {
  101. reject(error);
  102. });
  103. });
  104. };
  105. Api.prototype.uploadFile = function (filePath, formParams, uploadUrl) {
  106. return new Promise(function (resolve, reject) {
  107. wx.uploadFile({
  108. url: uploadUrl,
  109. filePath: filePath,
  110. name: 'file',
  111. formData: formParams,
  112. success: function (res) {
  113. resolve(res);
  114. },
  115. fail: function (error) {
  116. if (error.errMsg == 'uploadFile:fail url not in domain list') {
  117. reject('请点击右上角"•••"按钮开启调试模式');
  118. }
  119. else {
  120. reject(error.errMsg);
  121. }
  122. }
  123. });
  124. });
  125. };
  126. Api.prototype.notifyServer = function (examRecordDataId, examStudentId, order, filePath, transferFileType) {
  127. var _this = this;
  128. return new Promise(function (resovle, reject) {
  129. return _this.postRequest({
  130. url: '/api/ecs_oe_student/examControl/saveUploadedFile',
  131. parameter: {
  132. examRecordDataId: examRecordDataId,
  133. examStudentId: examStudentId,
  134. order: order,
  135. filePath: filePath,
  136. transferFileType: transferFileType
  137. }
  138. }).then(function (res) {
  139. resovle(res);
  140. }, function (error) {
  141. console.log('===================');
  142. reject(error);
  143. }).catch(function (exceptions) {
  144. console.log('===================');
  145. reject(exceptions);
  146. });
  147. });
  148. };
  149. Api.prototype.getNotifyResult = function (acknowledgeId) {
  150. var _this = this;
  151. return new Promise(function (resovle, reject) {
  152. return _this.postRequest({
  153. url: '/api/ecs_oe_student/examControl/getUploadedFileAcknowledgeStatus',
  154. parameter: {
  155. acknowledgeId: acknowledgeId
  156. }
  157. }).then(function (res) {
  158. resovle(res);
  159. }, function (error) {
  160. reject(error);
  161. }).catch(function (exceptions) {
  162. reject(exceptions);
  163. });
  164. });
  165. };
  166. Api.prototype.getUploadedAudioAnswerList = function (examRecordDataId) {
  167. var _this = this;
  168. return new Promise(function (resolve, reject) {
  169. return _this.postRequest({
  170. url: '/api/ecs_oe_student/examControl/getUploadedAudioAnswerList',
  171. parameter: {
  172. examRecordDataId: examRecordDataId
  173. }
  174. }).then(function (res) {
  175. resolve(res);
  176. }, function (error) {
  177. reject(error);
  178. }).catch(function (e) {
  179. reject(e);
  180. });
  181. });
  182. };
  183. Api.prototype.getRequest = function (option, auth) {
  184. if (auth === void 0) { auth = true; }
  185. var that = this;
  186. var header = auth ? {
  187. 'Content-Type': 'application/x-www-form-urlencoded',
  188. key: that.key,
  189. token: that.token
  190. } : {
  191. 'Content-Type': 'application/x-www-form-urlencoded',
  192. };
  193. return new Promise(function (resolve, reject) {
  194. wx.request({
  195. url: that.configOption.baseUrl + option.url,
  196. method: 'GET',
  197. header: header,
  198. data: option.parameter,
  199. success: function (res) {
  200. console.log("request success", res);
  201. if (that.isTokenInValidCode(res.statusCode)) {
  202. reject('token失效');
  203. if (that.tokenValidCallback) {
  204. that.tokenValidCallback();
  205. }
  206. }
  207. else if (res.statusCode !== 200) {
  208. reject(res.data.desc);
  209. }
  210. else {
  211. resolve(res.data);
  212. }
  213. },
  214. fail: function (res) {
  215. console.log("request fail", res);
  216. if (res.errMsg == 'request:fail url not in domain list') {
  217. reject('请点击右上角"•••"按钮开启调试模式');
  218. }
  219. else if (res.errMsg == 'request:fail ') {
  220. reject("网络请求失败");
  221. }
  222. else {
  223. reject(res.errMsg);
  224. }
  225. }
  226. });
  227. });
  228. };
  229. Api.prototype.postRequest = function (option, auth) {
  230. if (auth === void 0) { auth = true; }
  231. var that = this;
  232. var header = auth ? {
  233. 'Content-Type': 'application/x-www-form-urlencoded',
  234. key: that.key,
  235. token: that.token
  236. } : {
  237. 'Content-Type': 'application/x-www-form-urlencoded',
  238. };
  239. console.log(that.configOption.baseUrl + option.url);
  240. console.log(option);
  241. return new Promise(function (resolve, reject) {
  242. wx.request({
  243. url: that.configOption.baseUrl + option.url,
  244. method: 'POST',
  245. header: header,
  246. data: option.parameter,
  247. success: function (res) {
  248. console.log("request success", res);
  249. if (that.isTokenInValidCode(res.statusCode)) {
  250. reject('token失效');
  251. if (that.tokenValidCallback) {
  252. that.tokenValidCallback();
  253. }
  254. }
  255. else if (res.statusCode == 503) {
  256. that._postRequest(option, auth, 0, resolve, reject);
  257. }
  258. else if (res.statusCode !== 200) {
  259. reject(res.data.desc);
  260. }
  261. else {
  262. resolve(res.data);
  263. }
  264. },
  265. fail: function (res) {
  266. console.log("request fail", res);
  267. if (res.errMsg == 'request:fail url not in domain list') {
  268. reject('请点击右上角"•••"按钮开启调试模式');
  269. }
  270. else if (res.errMsg == 'request:fail ') {
  271. reject("网络请求失败");
  272. }
  273. else {
  274. reject(res.errMsg);
  275. }
  276. }
  277. });
  278. });
  279. };
  280. Api.prototype._postRequest = function (option, auth, retry, resolve, reject) {
  281. if (auth === void 0) { auth = true; }
  282. if (retry === void 0) { retry = 0; }
  283. var that = this;
  284. var header = auth ? {
  285. 'Content-Type': 'application/x-www-form-urlencoded',
  286. key: that.key,
  287. token: that.token
  288. } : {
  289. 'Content-Type': 'application/x-www-form-urlencoded',
  290. };
  291. console.log(option);
  292. if (retry > 0) {
  293. console.log('正在重试' + retry);
  294. }
  295. wx.request({
  296. url: that.configOption.baseUrl + option.url,
  297. method: 'POST',
  298. header: header,
  299. data: option.parameter,
  300. success: function (res) {
  301. console.log("request success", res);
  302. if (that.isTokenInValidCode(res.statusCode)) {
  303. reject('token失效');
  304. if (that.tokenValidCallback) {
  305. that.tokenValidCallback();
  306. }
  307. }
  308. else if (res.statusCode == 503) {
  309. if (retry < 10) {
  310. console.log('200ms重试');
  311. setTimeout(function () {
  312. that._postRequest(option, auth, retry + 1, resolve, reject);
  313. }, 200);
  314. }
  315. else {
  316. reject('服务器繁忙,请稍后重试!');
  317. }
  318. }
  319. else if (res.statusCode !== 200) {
  320. reject(res.data.desc);
  321. }
  322. else {
  323. resolve(res.data);
  324. }
  325. },
  326. fail: function (res) {
  327. console.log("request fail", res);
  328. if (res.errMsg == 'request:fail url not in domain list') {
  329. reject('请点击右上角"•••"按钮开启调试模式');
  330. }
  331. else if (res.errMsg == 'request:fail ') {
  332. reject("网络请求失败");
  333. }
  334. else {
  335. reject(res.errMsg);
  336. }
  337. }
  338. });
  339. };
  340. Api.prototype.isTokenInValidCode = function (code) {
  341. return code === 401 || code === 403;
  342. };
  343. return Api;
  344. }());
  345. exports.Api = Api;
  346. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcUhBO0lBQUE7UUFRRSxpQkFBWSxHQUFvQixFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQTtRQUM3RixRQUFHLEdBQVcsRUFBRSxDQUFBO1FBQ2hCLFVBQUssR0FBVyxFQUFFLENBQUE7UUFDbEIsdUJBQWtCLEdBQXVCLGNBQU8sQ0FBQyxDQUFBO0lBZ1Y3RCxDQUFDO0lBOVVHLHFCQUFPLEdBQVA7UUFDSSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFBO0lBQ3hDLENBQUM7SUFFRCxrQkFBSSxHQUFKLFVBQUssTUFBdUI7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUE7SUFDOUIsQ0FBQztJQUVELHlCQUFXLEdBQVgsVUFBWSxPQUFlO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQVFELDZCQUFlLEdBQWYsVUFBZ0IsR0FBVyxFQUFFLEtBQWE7UUFDdEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN0QixDQUFDO0lBRUQsbUNBQXFCLEdBQXJCLFVBQXNCLFFBQTRCO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUE7SUFDdEMsQ0FBQztJQUVELHlCQUFXLEdBQVgsVUFBWSxNQUFjO1FBQTFCLGlCQWlDQztRQWhDRyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7UUFDakIsT0FBTyxJ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QUFDLElBQUksQ0FBQyxDQUFBO2lCQUNwQjtZQUNMLENBQUM7WUFDRCxJQUFJLEVBQUUsVUFBVSxHQUFHO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUkscUNBQXFDLEVBQUU7b0JBQ3JELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO2lCQUNoQztxQkFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksZUFBZSxFQUFFO29CQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ3RCO1lBQ0wsQ0FBQztTQUNKLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFTyxnQ0FBa0IsR0FBMUIsVUFBMkIsSUFBWTtRQUNuQyxPQUFPLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQTtJQUN2QyxDQUFDO0lBQ0wsVUFBQztBQUFELENBQUMsQUEzVkQsSUEyVkM7QUEzVlksa0JBQUciLCJzb3VyY2VzQ29udGVudCI6WyIvLy88cmVmZXJlbmNlIHBhdGg9XCIuLi90eXBpbmdzL3d4L2xpYi53eC5hcGkuZC50c1wiLz5cclxuXHJcbmRlY2xhcmUgbmFtZXNwYWNlIHRvb2xzIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRW50aXR5IHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBSZXN1bHQ8VCBleHRlbmRzIEVudGl0eT4ge1xyXG4gICAgICAgIGNvZGU/OiBudW1iZXIgfCBzdHJpbmcsXHJcbiAgICAgICAgZGVzYz86IHN0cmluZyxcclxuICAgICAgICBkYXRhPzogVCB8IFRbXVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVXB5dW5SZXN1bHQge1xyXG4gICAgICAgIGNvZGU6IG51bWJlcixcclxuICAgICAgICBtZXNzYWdlPzogc3RyaW5nLFxyXG4gICAgICAgIHRpbWU6IG51bWJlcixcclxuICAgICAgICB1cmw6IHN0cmluZ1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tRclJlc3VsdCBleHRlbmRzIEVudGl0eSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6K++56iLSURcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb3Vyc2VJZDogbnVtYmVyLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOivvueoi+WQjeensFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvdXJzZU5hbWU6IHN0cmluZyxcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiDogIPor5XorrDlvZVEYXRhSURcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ICD55SfSURcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGFtU3R1ZGVudElkOiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ICD6K+V6K+V6aKY5aSn6aKY5Y+3XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcXVlc3Rpb25NYWluTnVtYmVyOiBudW1iZXIsXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICog6ICD6K+V6K+V6aKY6aKY5bqPXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcXVlc3Rpb25PcmRlcjogbnVtYmVyLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOeZu+W9leS/oeaBr2tleVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGtleTogc3RyaW5nLFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIOeZu+W9leS/oeaBr3Rva2VuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9rZW46IHN0cmluZyxcclxuXHJcbiAgICAgICAgc3ViTnVtYmVyOiBudW1iZXIsXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBTaWduUmVzdWx0IGV4dGVuZHMgRW50aXR5IHtcclxuICAgICAgICBhY2Nlc3NVcmw6IHN0cmluZyxcclxuICAgICAgICBmb3JtVXJsOiBzdHJpbmcsXHJcbiAgICAgICAgZnNUeXBlOiBzdHJpbmcsXHJcbiAgICAgICAgdXBsb2FkVXJsOiBzdHJpbmcsXHJcbiAgICAgICAgZm9ybVBhcmFtczogb2JqZWN0LFxyXG4gICAgICAgIHNpZ25JZGVudGlmaWVyOiBzdHJpbmdcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIE5vdGlmeVJlc3VsdCBleHRlbmRzIEVudGl0eSB7XHJcbiAgICAgICAgZmlsZVBhdGg6IHN0cmluZyxcclxuICAgICAgICByZXN1bHQ6IGJvb2xlYW5cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF1ZGlvQW5zd2VyIGV4dGVuZHMgRW50aXR5IHtcclxuICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIsXHJcbiAgICAgICAgbWFpbk51bWJlcjogbnVtYmVyLFxyXG4gICAgICAgIG9yZGVyOiBudW1iZXIsXHJcbiAgICAgICAgc3R1ZGVudEFuc3dlcjogc3RyaW5nLFxyXG4gICAgICAgIHN1Yk51bWJlcjogc3RyaW5nXHJcbiAgICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBBcGlDb25maWdPcHRpb24ge1xyXG4gICAgdmVyOiBudW1iZXIsXHJcbiAgICB2ZXJzaW9uTmFtZTogc3RyaW5nLFxyXG4gICAgYmFzZVVybDogc3RyaW5nXHJcbn1cclxuXHJcbmludGVyZmFjZSBSZXF1ZXN0T3B0aW9uIHtcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgcGFyYW1ldGVyOiBhbnlcclxufVxyXG5cclxudHlwZSBUb2tlblZhbGlkQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xyXG5cclxuaW50ZXJmYWNlIEFQSSB7XHJcbiAgICBjb25maWdPcHRpb246IEFwaUNvbmZpZ09wdGlvblxyXG4gICAgdmVyc2lvbigpOiBzdHJpbmdcclxuICAgIHNldFRva2VuVmFsaWRDYWxsYmFjayhjYWxsYmFjazogVG9rZW5WYWxpZENhbGxiYWNrKTogdm9pZFxyXG5cclxuICAgIGNoZWNrUXJjb2RlKHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTx0b29scy5DaGVja1FyUmVzdWx0PlxyXG5cclxuICAgIGdldFBhcGVyU3RydWN0KGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlcikgOiBQcm9taXNlPGFueT5cclxuXHJcbiAgICBnZXRTaWduKGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlciwgZXhhbVN0dWRlbnRJZDogbnVtYmVyLCBvcmRlcjogbnVtYmVyLCBmaWxlTWQ1OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSA6IFByb21pc2U8dG9vbHMuU2lnblJlc3VsdD5cclxuXHJcbiAgICB1cGxvYWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZvcm1QYXJhbXM6IG9iamVjdCwgdXBsb2FkVXJsOiBzdHJpbmcpIDogUHJvbWlzZTx0b29scy5VcHl1blJlc3VsdD5cclxuXHJcbiAgICBub3RpZnlTZXJ2ZXIoZXhhbVJlY29yZERhdGFJZDogbnVtYmVyLCBleGFtU3R1ZGVudElkOiBudW1iZXIsIG9yZGVyOiBudW1iZXIsIGZpbGVQYXRoOiBzdHJpbmcsIHRyYW5zZmVyRmlsZVR5cGU6IHN0cmluZykgOiBQcm9taXNlPHN0cmluZz5cclxuXHJcbiAgICBnZXROb3RpZnlSZXN1bHQoYWNrbm93bGVkZ2VJZDogc3RyaW5nKSA6IFByb21pc2U8Ym9vbGVhbj5cclxuXHJcbiAgICBnZXRVcGxvYWRlZEF1ZGlvQW5zd2VyTGlzdChleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIpIDogUHJvbWlzZTx0b29scy5BdWRpb0Fuc3dlcltdPlxyXG5cclxuICAgIGdldFJlcXVlc3Qob3B0aW9uOiBSZXF1ZXN0T3B0aW9uLCBhdXRoOiBib29sZWFuKTogUHJvbWlzZTxhbnk+XHJcblxyXG4gICAgcG9zdFJlcXVlc3Qob3B0aW9uOiBSZXF1ZXN0T3B0aW9uLCBhdXRoOiBib29sZWFuKTogUHJvbWlzZTxhbnk+XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBcGkgaW1wbGVtZW50cyBBUEkge1xyXG4gICAgLy9lY3MucW10aC5jb20uY246ODg3OFxyXG4gICAgLy9odHRwOi8vMTkyLjE2OC4xMC4zOTo4MDAzXHJcbiAgICAvL2h0dHBzOi8vZWNzLnFtdGguY29tLmNuOjg4NzhcclxuICAgIC8vZWNzLXRlc3QucW10aC5jb20uY25cclxuICAgIC8vaHR0cDovL2Vjcy1kZXYucW10aC5jb20uY25cclxuICAgIC8vJ2h0dHBzOi8vb3JnMC5lYTEwMC5jb20uY24nXHJcbiAgICAvL2h0dHBzOi8vZWNzLXRlc3QuZWExMDAuY29tLmNuICBodHRwczovL2Vjcy10ZXN0LmVhMTAwLmNvbS5jblxyXG4gIGNvbmZpZ09wdGlvbjogQXBpQ29uZmlnT3B0aW9uID0geyB2ZXI6IDEsIHZlcnNpb25OYW1lOiAndjEuMC4wJywgYmFzZVVybDogJ2h0dHA6Ly8xOTIuMTY4LjEwLjQxOjgwMDMnIH1cclxuICAgIHByaXZhdGUga2V5OiBzdHJpbmcgPSAnJ1xyXG4gICAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nID0gJydcclxuICAgIHByaXZhdGUgdG9rZW5WYWxpZENhbGxiYWNrOiBUb2tlblZhbGlkQ2FsbGJhY2sgPSAoKSA9PiB7fVxyXG5cclxuICAgIHZlcnNpb24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdPcHRpb24udmVyc2lvbk5hbWVcclxuICAgIH1cclxuXHJcbiAgICBpbml0KGNvbmZpZzogQXBpQ29uZmlnT3B0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWdPcHRpb24gPSBjb25maWdcclxuICAgIH1cclxuXHJcbiAgICBpbml0QmFzZVVybChiYXNlVXJsOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ09wdGlvbi5iYXNlVXJsID0gYmFzZVVybC5yZXBsYWNlKCc6NDQzJywgJycpXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJpbml0QmFzZVVyaTpcIiArIHRoaXMuY29uZmlnT3B0aW9uLmJhc2VVcmwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjojmnYPmiJDlip/lkI7phY3nva5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1aWRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhcnRpdGlvbklkXHJcbiAgICAgKi9cclxuICAgIGNvbmZpZ0F1dGhvcml6ZShrZXk6IHN0cmluZywgdG9rZW46IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMua2V5ID0ga2V5XHJcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VG9rZW5WYWxpZENhbGxiYWNrKGNhbGxiYWNrOiBUb2tlblZhbGlkQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRva2VuVmFsaWRDYWxsYmFjayA9IGNhbGxiYWNrXHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tRcmNvZGUoc2VjcmV0OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHRvb2xzLkNoZWNrUXJSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FwaS9lY3Nfb2Vfc3R1ZGVudC9leGFtQ29udHJvbC9jaGVja1FyQ29kZScsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBxckNvZGU6IHNlY3JldFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBmYWxzZSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoZW4nKVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5rZXkgJiYgcmVzLnRva2VuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5jb25maWdBdXRob3JpemUocmVzLmtleSwgcmVzLnRva2VuKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBtb2RlbCB0cmFuc2Zvcm1lclxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZUlkOiByZXMuY291cnNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZU5hbWU6IHJlcy5jb3Vyc2VOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiByZXMuZXhhbVJlY29yZERhdGFJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbVN0dWRlbnRJZDogcmVzLmV4YW1TdHVkZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uTWFpbk51bWJlcjogcmVzLnF1ZXN0aW9uTWFpbk51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25PcmRlcjogcmVzLnF1ZXN0aW9uT3JkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yk51bWJlcjogcmVzLnN1Yk51bWJlclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKChyZXN1bHQgYXMgdG9vbHMuQ2hlY2tRclJlc3VsdCkpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgn5LqM57u056CB5bey5aSx5pWIJylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICAgICAgICB9KS5jYXRjaCggZXhjZXB0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXhjZXB0aW9ucylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFBhcGVyU3RydWN0KGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlcikgOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb3ZsZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FwaS9lY3Nfb2Vfc3R1ZGVudC9leGFtUmVjb3JkUGFwZXJTdHJ1Y3QvZ2V0RXhhbVJlY29yZFBhcGVyU3RydWN0JyxcclxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4YW1SZWNvcmREYXRhSWQ6IGV4YW1SZWNvcmREYXRhSWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkudGhlbiggcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc292bGUocmVzKVxyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgICAgICAgIH0pLmNhdGNoKCBleGNlcHRpb25zID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChleGNlcHRpb25zKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2lnbihleGFtUmVjb3JkRGF0YUlkOiBudW1iZXIsIGV4YW1TdHVkZW50SWQ6IG51bWJlciwgb3JkZXI6IG51bWJlciwgZmlsZU1kNTogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykgOiBQcm9taXNlPHRvb2xzLlNpZ25SZXN1bHQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dG9vbHMuU2lnblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL2Vjc19vZV9zdHVkZW50L2V4YW1Db250cm9sL3l1blNpZ25hdHVyZScsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBleGFtUmVjb3JkRGF0YUlkOiBleGFtUmVjb3JkRGF0YUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4YW1TdHVkZW50SWQ6IGV4YW1TdHVkZW50SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IG9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVNZDU6IGZpbGVNZDUsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZVN1ZmZpeDogc3VmZml4XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzVXJsOiByZXMuYWNjZXNzVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Vcmw6IHJlcy5mb3JtVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgIGZzVHlwZTogcmVzLmZzVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRVcmw6IHJlcy51cGxvYWRVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybVBhcmFtczogcmVzLmZvcm1QYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgICAgc2lnbklkZW50aWZpZXI6IHJlcy5zaWduSWRlbnRpZmllcixcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxyXG4gICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGxvYWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZvcm1QYXJhbXM6IG9iamVjdCwgdXBsb2FkVXJsOiBzdHJpbmcpIDogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB3eC51cGxvYWRGaWxlKHtcclxuICAgICAgICAgICAgICAgIHVybDogdXBsb2FkVXJsLFxyXG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgZm9ybURhdGE6IGZvcm1QYXJhbXMsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWw6IGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuZXJyTXNnID09ICd1cGxvYWRGaWxlOmZhaWwgdXJsIG5vdCBpbiBkb21haW4gbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCfor7fngrnlh7vlj7PkuIrop5JcIuKAouKAouKAolwi5oyJ6ZKu5byA5ZCv6LCD6K+V5qih5byPJylcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IuZXJyTXNnKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbm90aWZ5U2VydmVyKGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlciwgZXhhbVN0dWRlbnRJZDogbnVtYmVyLCBcclxuICAgICAgICBvcmRlcjogbnVtYmVyLCBmaWxlUGF0aDogc3RyaW5nLCB0cmFuc2ZlckZpbGVUeXBlOiBzdHJpbmcpIDogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc292bGUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL2Vjc19vZV9zdHVkZW50L2V4YW1Db250cm9sL3NhdmVVcGxvYWRlZEZpbGUnLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhhbVJlY29yZERhdGFJZDogZXhhbVJlY29yZERhdGFJZCxcclxuICAgICAgICAgICAgICAgICAgICBleGFtU3R1ZGVudElkOiBleGFtU3R1ZGVudElkLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiBvcmRlcixcclxuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogZmlsZVBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlVHlwZTogdHJhbnNmZXJGaWxlVHlwZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS50aGVuKCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb3ZsZShyZXMpXHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09JylcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcclxuICAgICAgICAgICAgfSkuY2F0Y2goIGV4Y2VwdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT0nKVxyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGV4Y2VwdGlvbnMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXROb3RpZnlSZXN1bHQoYWNrbm93bGVkZ2VJZDogc3RyaW5nKSA6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvdmxlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdFJlcXVlc3Qoe1xyXG4gICAgICAgICAgICAgICAgdXJsOiAnL2FwaS9lY3Nfb2Vfc3R1ZGVudC9leGFtQ29udHJvbC9nZXRVcGxvYWRlZEZpbGVBY2tub3dsZWRnZVN0YXR1cycsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBhY2tub3dsZWRnZUlkOiBhY2tub3dsZWRnZUlkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLnRoZW4oIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvdmxlKHJlcylcclxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICAgICAgICB9KS5jYXRjaCggZXhjZXB0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXhjZXB0aW9ucylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFVwbG9hZGVkQXVkaW9BbnN3ZXJMaXN0KGV4YW1SZWNvcmREYXRhSWQ6IG51bWJlcikgOiBQcm9taXNlPHRvb2xzLkF1ZGlvQW5zd2VyW10+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0UmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6ICcvYXBpL2Vjc19vZV9zdHVkZW50L2V4YW1Db250cm9sL2dldFVwbG9hZGVkQXVkaW9BbnN3ZXJMaXN0JyxcclxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4YW1SZWNvcmREYXRhSWQ6IGV4YW1SZWNvcmREYXRhSWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkudGhlbiggcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzIGFzIHRvb2xzLkF1ZGlvQW5zd2VyW10pXHJcbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcclxuICAgICAgICAgICAgfSkuY2F0Y2goZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFJlcXVlc3Qob3B0aW9uOiBSZXF1ZXN0T3B0aW9uLCBhdXRoOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXNcclxuICAgICAgICBjb25zdCBoZWFkZXIgPSBhdXRoID8ge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgICAgICAgIGtleTogdGhhdC5rZXksXHJcbiAgICAgICAgICAgIHRva2VuOiB0aGF0LnRva2VuXHJcbiAgICAgICAgfSA6IHtcclxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICB3eC5yZXF1ZXN0KHtcclxuICAgICAgICAgICAgICAgIHVybDogdGhhdC5jb25maWdPcHRpb24uYmFzZVVybCArIG9wdGlvbi51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiBoZWFkZXIsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24ucGFyYW1ldGVyLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlcXVlc3Qgc3VjY2Vzc1wiLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LmlzVG9rZW5JblZhbGlkQ29kZShyZXMuc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCd0b2tlbuWkseaViCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2Vu5aSx5pWIXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LnRva2VuVmFsaWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC50b2tlblZhbGlkQ2FsbGJhY2soKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgocmVzLmRhdGEgYXMgdG9vbHMuUmVzdWx0PGFueT4pLmRlc2MpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVxdWVzdCBmYWlsXCIsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5lcnJNc2cgPT0gJ3JlcXVlc3Q6ZmFpbCB1cmwgbm90IGluIGRvbWFpbiBsaXN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+ivt+eCueWHu+WPs+S4iuinklwi4oCi4oCi4oCiXCLmjInpkq7lvIDlkK/osIPor5XmqKHlvI8nKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmVyck1zZyA9PSAncmVxdWVzdDpmYWlsICcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KFwi572R57uc6K+35rGC5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXMuZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwb3N0UmVxdWVzdChvcHRpb246IFJlcXVlc3RPcHRpb24sIGF1dGg6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpc1xyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGF1dGggPyB7XHJcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcclxuICAgICAgICAgICAga2V5OiB0aGF0LmtleSxcclxuICAgICAgICAgICAgdG9rZW46IHRoYXQudG9rZW5cclxuICAgICAgICB9IDoge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoYXQuY29uZmlnT3B0aW9uLmJhc2VVcmwgKyBvcHRpb24udXJsKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhvcHRpb24pXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IHRoYXQuY29uZmlnT3B0aW9uLmJhc2VVcmwgKyBvcHRpb24udXJsLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IGhlYWRlcixcclxuICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbi5wYXJhbWV0ZXIsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVxdWVzdCBzdWNjZXNzXCIsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuaXNUb2tlbkluVmFsaWRDb2RlKHJlcy5zdGF0dXNDb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3Rva2Vu5aSx5pWIJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW7lpLHmlYhcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQudG9rZW5WYWxpZENhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnRva2VuVmFsaWRDYWxsYmFjaygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXNDb2RlID09IDUwMykgeyAvL+aOpeWPo+mZkOa1ge+8jOiHquWKqOmHjeivlVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wb3N0UmVxdWVzdChvcHRpb24sIGF1dGgsIDAsIHJlc29sdmUsIHJlamVjdClcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5zdGF0dXNDb2RlICE9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KChyZXMuZGF0YSBhcyB0b29scy5SZXN1bHQ8YW55PikuZGVzYylcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXF1ZXN0IGZhaWxcIiwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PSAncmVxdWVzdDpmYWlsIHVybCBub3QgaW4gZG9tYWluIGxpc3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgn6K+354K55Ye75Y+z5LiK6KeSXCLigKLigKLigKJcIuaMiemSruW8gOWQr+iwg+ivleaooeW8jycpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJyTXNnID09ICdyZXF1ZXN0OmZhaWwgJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoXCLnvZHnu5zor7fmsYLlpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIF9wb3N0UmVxdWVzdChvcHRpb246IFJlcXVlc3RPcHRpb24sIGF1dGg6IGJvb2xlYW4gPSB0cnVlLCByZXRyeTogbnVtYmVyID0gMCwgcmVzb2x2ZTogKHZhbHVlPzogYW55IHwgUHJvbWlzZUxpa2U8YW55PikgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXNcclxuICAgICAgICBjb25zdCBoZWFkZXIgPSBhdXRoID8ge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXHJcbiAgICAgICAgICAgIGtleTogdGhhdC5rZXksXHJcbiAgICAgICAgICAgIHRva2VuOiB0aGF0LnRva2VuXHJcbiAgICAgICAgfSA6IHtcclxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhvcHRpb24pXHJcbiAgICAgICAgaWYgKHJldHJ5ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygn5q2j5Zyo6YeN6K+VJytyZXRyeSlcclxuICAgICAgICB9XHJcbiAgICAgICAgd3gucmVxdWVzdCh7XHJcbiAgICAgICAgICAgIHVybDogdGhhdC5jb25maWdPcHRpb24uYmFzZVVybCArIG9wdGlvbi51cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGhlYWRlcixcclxuICAgICAgICAgICAgZGF0YTogb3B0aW9uLnBhcmFtZXRlcixcclxuICAgICAgICAgICAgc3VjY2VzczogcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicmVxdWVzdCBzdWNjZXNzXCIsIHJlcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5pc1Rva2VuSW5WYWxpZENvZGUocmVzLnN0YXR1c0NvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCd0b2tlbuWkseaViCcpXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9rZW7lpLHmlYhcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC50b2tlblZhbGlkQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC50b2tlblZhbGlkQ2FsbGJhY2soKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLnN0YXR1c0NvZGUgPT0gNTAzKSB7IC8v5o6l5Y+j6ZmQ5rWB77yM6Ieq5Yqo6YeN6K+VXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5IDwgMTApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJzIwMG1z6YeN6K+VJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wb3N0UmVxdWVzdChvcHRpb24sIGF1dGgsIHJldHJ5KzEsIHJlc29sdmUsIHJlamVjdClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+acjeWKoeWZqOe5geW/me+8jOivt+eojeWQjumHjeivle+8gScpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KChyZXMuZGF0YSBhcyB0b29scy5SZXN1bHQ8YW55PikuZGVzYylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMuZGF0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZXF1ZXN0IGZhaWxcIiwgcmVzKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuZXJyTXNnID09ICdyZXF1ZXN0OmZhaWwgdXJsIG5vdCBpbiBkb21haW4gbGlzdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+ivt+eCueWHu+WPs+S4iuinklwi4oCi4oCi4oCiXCLmjInpkq7lvIDlkK/osIPor5XmqKHlvI8nKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXMuZXJyTXNnID09ICdyZXF1ZXN0OmZhaWwgJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChcIue9kee7nOivt+axguWksei0pVwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVG9rZW5JblZhbGlkQ29kZShjb2RlOiBudW1iZXIpIDogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGNvZGUgPT09IDQwMSB8fCBjb2RlID09PSA0MDNcclxuICAgIH1cclxufSAiXX0=