"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Api = (function () { function Api() { this.configOption = { ver: 1, versionName: 'v1.0.0', baseUrl: 'http://192.168.10.41:8003' }; this.key = ''; this.token = ''; this.tokenValidCallback = function () { }; } Api.prototype.version = function () { return this.configOption.versionName; }; Api.prototype.init = function (config) { this.configOption = config; }; Api.prototype.initBaseUrl = function (baseUrl) { this.configOption.baseUrl = baseUrl.replace(':443', ''); console.log("initBaseUri:" + this.configOption.baseUrl); }; Api.prototype.configAuthorize = function (key, token) { this.key = key; this.token = token; }; Api.prototype.setTokenValidCallback = function (callback) { this.tokenValidCallback = callback; }; Api.prototype.checkQrcode = function (secret) { var _this = this; var that = this; return new Promise(function (resolve, reject) { return _this.postRequest({ url: '/api/ecs_oe_student/examControl/checkQrCode', parameter: { qrCode: secret } }, false).then(function (res) { console.log('then'); if (res.key && res.token) { that.configAuthorize(res.key, res.token); var result = { courseId: res.courseId, courseName: res.courseName, examRecordDataId: res.examRecordDataId, examStudentId: res.examStudentId, questionMainNumber: res.questionMainNumber, questionOrder: res.questionOrder, subNumber: res.subNumber }; resolve(result); } else { reject('二维码已失效'); } }, function (error) { reject(error); }).catch(function (exceptions) { reject(exceptions); }); }); }; Api.prototype.getPaperStruct = function (examRecordDataId) { var _this = this; return new Promise(function (resovle, reject) { return _this.getRequest({ url: '/api/ecs_oe_student/examRecordPaperStruct/getExamRecordPaperStruct', parameter: { examRecordDataId: examRecordDataId } }).then(function (res) { resovle(res); }, function (error) { reject(error); }).catch(function (exceptions) { reject(exceptions); }); }); }; Api.prototype.getSign = function (examRecordDataId, examStudentId, order, fileMd5, suffix) { var _this = this; return new Promise(function (resolve, reject) { return _this.postRequest({ url: '/api/ecs_oe_student/examControl/yunSignature', parameter: { examRecordDataId: examRecordDataId, examStudentId: examStudentId, order: order, fileMd5: fileMd5, fileSuffix: suffix } }).then(function (res) { var result = { accessUrl: res.accessUrl, formUrl: res.formUrl, fsType: res.fsType, uploadUrl: res.uploadUrl, formParams: res.formParams, signIdentifier: res.signIdentifier, }; resolve(result); }, function (error) { reject(error); }); }); }; Api.prototype.uploadFile = function (filePath, formParams, uploadUrl) { return new Promise(function (resolve, reject) { wx.uploadFile({ url: uploadUrl, filePath: filePath, name: 'file', formData: formParams, success: function (res) { resolve(res); }, fail: function (error) { if (error.errMsg == 'uploadFile:fail url not in domain list') { reject('请点击右上角"•••"按钮开启调试模式'); } else { reject(error.errMsg); } } }); }); }; Api.prototype.notifyServer = function (examRecordDataId, examStudentId, order, filePath, transferFileType) { var _this = this; return new Promise(function (resovle, reject) { return _this.postRequest({ url: '/api/ecs_oe_student/examControl/saveUploadedFile', parameter: { examRecordDataId: examRecordDataId, examStudentId: examStudentId, order: order, filePath: filePath, transferFileType: transferFileType } }).then(function (res) { resovle(res); }, function (error) { console.log('==================='); reject(error); }).catch(function (exceptions) { console.log('==================='); reject(exceptions); }); }); }; Api.prototype.getNotifyResult = function (acknowledgeId) { var _this = this; return new Promise(function (resovle, reject) { return _this.postRequest({ url: '/api/ecs_oe_student/examControl/getUploadedFileAcknowledgeStatus', parameter: { acknowledgeId: acknowledgeId } }).then(function (res) { resovle(res); }, function (error) { reject(error); }).catch(function (exceptions) { reject(exceptions); }); }); }; Api.prototype.getUploadedAudioAnswerList = function (examRecordDataId) { var _this = this; return new Promise(function (resolve, reject) { return _this.postRequest({ url: '/api/ecs_oe_student/examControl/getUploadedAudioAnswerList', parameter: { examRecordDataId: examRecordDataId } }).then(function (res) { resolve(res); }, function (error) { reject(error); }).catch(function (e) { reject(e); }); }); }; Api.prototype.getRequest = function (option, auth) { if (auth === void 0) { auth = true; } var that = this; var header = auth ? { 'Content-Type': 'application/x-www-form-urlencoded', key: that.key, token: that.token } : { 'Content-Type': 'application/x-www-form-urlencoded', }; return new Promise(function (resolve, reject) { wx.request({ url: that.configOption.baseUrl + option.url, method: 'GET', header: header, data: option.parameter, success: function (res) { console.log("request success", res); if (that.isTokenInValidCode(res.statusCode)) { reject('token失效'); if (that.tokenValidCallback) { that.tokenValidCallback(); } } else if (res.statusCode !== 200) { reject(res.data.desc); } else { resolve(res.data); } }, fail: function (res) { console.log("request fail", res); if (res.errMsg == 'request:fail url not in domain list') { reject('请点击右上角"•••"按钮开启调试模式'); } else if (res.errMsg == 'request:fail ') { reject("网络请求失败"); } else { reject(res.errMsg); } } }); }); }; Api.prototype.postRequest = function (option, auth) { if (auth === void 0) { auth = true; } var that = this; var header = auth ? { 'Content-Type': 'application/x-www-form-urlencoded', key: that.key, token: that.token } : { 'Content-Type': 'application/x-www-form-urlencoded', }; console.log(that.configOption.baseUrl + option.url); console.log(option); return new Promise(function (resolve, reject) { wx.request({ url: that.configOption.baseUrl + option.url, method: 'POST', header: header, data: option.parameter, success: function (res) { console.log("request success", res); if (that.isTokenInValidCode(res.statusCode)) { reject('token失效'); if (that.tokenValidCallback) { that.tokenValidCallback(); } } else if (res.statusCode == 503) { that._postRequest(option, auth, 0, resolve, reject); } else if (res.statusCode !== 200) { reject(res.data.desc); } else { resolve(res.data); } }, fail: function (res) { console.log("request fail", res); if (res.errMsg == 'request:fail url not in domain list') { reject('请点击右上角"•••"按钮开启调试模式'); } else if (res.errMsg == 'request:fail ') { reject("网络请求失败"); } else { reject(res.errMsg); } } }); }); }; Api.prototype._postRequest = function (option, auth, retry, resolve, reject) { if (auth === void 0) { auth = true; } if (retry === void 0) { retry = 0; } var that = this; var header = auth ? { 'Content-Type': 'application/x-www-form-urlencoded', key: that.key, token: that.token } : { 'Content-Type': 'application/x-www-form-urlencoded', }; console.log(option); if (retry > 0) { console.log('正在重试' + retry); } wx.request({ url: that.configOption.baseUrl + option.url, method: 'POST', header: header, data: option.parameter, success: function (res) { console.log("request success", res); if (that.isTokenInValidCode(res.statusCode)) { reject('token失效'); if (that.tokenValidCallback) { that.tokenValidCallback(); } } else if (res.statusCode == 503) { if (retry < 10) { console.log('200ms重试'); setTimeout(function () { that._postRequest(option, auth, retry + 1, resolve, reject); }, 200); } else { reject('服务器繁忙,请稍后重试!'); } } else if (res.statusCode !== 200) { reject(res.data.desc); } else { resolve(res.data); } }, fail: function (res) { console.log("request fail", res); if (res.errMsg == 'request:fail url not in domain list') { reject('请点击右上角"•••"按钮开启调试模式'); } else if (res.errMsg == 'request:fail ') { reject("网络请求失败"); } else { reject(res.errMsg); } } }); }; Api.prototype.isTokenInValidCode = function (code) { return code === 401 || code === 403; }; return Api; }()); exports.Api = Api; //# 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=