UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

398 lines (397 loc) 37.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Headers } from '@angular/http'; import { DataSchema, DataField } from '../../share/model/models'; var /** @type {?} */ GET = 'GET'; var /** @type {?} */ POST = 'POST'; var /** @type {?} */ PUT = 'PUT'; var /** @type {?} */ DELETE = 'DELETE'; var /** @type {?} */ PATCH = 'PATCH'; var /** @type {?} */ HEAD = 'HEAD'; var /** @type {?} */ OPTIONS = 'OPTIONS'; var ParrotsDataService = /** @class */ (function () { function ParrotsDataService(className, baseURL, connectionManager) { this.isTest = true; this.className = className; this.baseURL = baseURL; this.connectionManager = connectionManager; } /** * @param {?} url * @param {?} requestMethod * @param {?} body * @return {?} */ ParrotsDataService.prototype.getRequestPromise = /** * @param {?} url * @param {?} requestMethod * @param {?} body * @return {?} */ function (url, requestMethod, body) { if (this.connectionManager === null || typeof this.connectionManager === 'undefined') { return null; } var /** @type {?} */ headers = new Headers({ 'Content-Type': 'application/json', 'Accept': 'application/json' }); if (requestMethod == null) { return null; } var /** @type {?} */ requestOptionsArgs = { url: url, method: requestMethod, headers: headers, body: body }; if (requestMethod === GET) { requestOptionsArgs.method = GET; return this.connectionManager.getWithHttpInfo(url, requestOptionsArgs); } else if (requestMethod === POST) { requestOptionsArgs.method = POST; return this.connectionManager.postWithHttpInfo(url, body, requestOptionsArgs); } else if (requestMethod === PUT) { requestOptionsArgs.method = PUT; return this.connectionManager.putWithHttpInfo(url, body, requestOptionsArgs); } else if (requestMethod === DELETE) { requestOptionsArgs.method = DELETE; return this.connectionManager.deleteWithHttpInfo(url, requestOptionsArgs); } else if (requestMethod === PATCH) { requestOptionsArgs.method = PATCH; return this.connectionManager.patchWithHttpInfo(url, body, requestOptionsArgs); } else if (requestMethod === HEAD) { requestOptionsArgs.method = HEAD; return this.connectionManager.headWithHttpInfo(url, requestOptionsArgs); } else if (requestMethod === OPTIONS) { requestOptionsArgs.method = OPTIONS; return this.connectionManager.optionsWithHttpInfo(url, requestOptionsArgs); } return this.connectionManager.optionsWithHttpInfo(url, requestOptionsArgs); }; /** * @return {?} */ ParrotsDataService.prototype.loadClassSchema = /** * @return {?} */ function () { if (this.isTest) { var /** @type {?} */ body_1 = ''; return this.getRequestPromise('https://api.myjson.com/bins/1fnx6', GET, body_1); } var /** @type {?} */ body = ''; return this.getRequestPromise(this.baseURL, OPTIONS, body); }; /** * @return {?} */ ParrotsDataService.prototype.loadDataSchema = /** * @return {?} */ function () { return this.loadClassSchema().then(function (response) { var /** @type {?} */ dataFields = []; var /** @type {?} */ jsonSchema = null; var /** @type {?} */ responseObj = JSON.parse(response._body); if (responseObj != null && responseObj.schema != null && (typeof responseObj.schema !== 'undefined')) { jsonSchema = responseObj.schema; } for (var /** @type {?} */ key in jsonSchema.properties) { var /** @type {?} */ selfJsonSchema = jsonSchema.properties[key]; var /** @type {?} */ dataField = new DataField(key, key, selfJsonSchema.type, selfJsonSchema, null); dataFields.push(dataField); } var /** @type {?} */ resultSchema = new DataSchema(responseObj.className, 'class label', dataFields, jsonSchema); return Promise.resolve(resultSchema); }).catch(function (error) { return Promise.reject(error); }); }; /** * @return {?} */ ParrotsDataService.prototype.loadData = /** * @return {?} */ function () { if (this.isTest) { var /** @type {?} */ body_2 = ''; // 'https://api.myjson.com/bins/oc8uh' return this.getRequestPromise('https://api.myjson.com/bins/1dkjpd', GET, body_2).then(function (response) { var /** @type {?} */ data = []; var /** @type {?} */ responseObj = JSON.parse(response._body); if (responseObj != null && (typeof responseObj !== 'undefined')) { data = responseObj.items; } return Promise.resolve(data); }); } var /** @type {?} */ body = ''; return this.getRequestPromise(this.baseURL, GET, body).then(function (response) { var /** @type {?} */ data = []; var /** @type {?} */ responseObj = JSON.parse(response._body); if (responseObj != null && (typeof responseObj !== 'undefined')) { data = responseObj.items; } return Promise.resolve(data); }); }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.createData = /** * @param {?} data * @return {?} */ function (data) { // mockdata if (data !== null && typeof data !== 'undefined') { if (Array.isArray(data)) { try { for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) { var d = data_1_1.value; d._objectId = Math.floor((Math.random() * 100000) + 1); d._uuid = d._objectId; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1); } finally { if (e_1) throw e_1.error; } } } else { data._objectId = Math.floor((Math.random() * 100000) + 1); data._uuid = data._objectId; } } return Promise.resolve(data); var e_1, _a; }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.updateData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.deleteData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.destroyData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.fetchData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.findData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; /** * @param {?} filterData * @return {?} */ ParrotsDataService.prototype.queryData = /** * @param {?} filterData * @return {?} */ function (filterData) { // data as a filter data only var /** @type {?} */ result = []; // mockdata -- data is raw data if (filterData !== null && typeof filterData !== 'undefined') { if (filterData.data !== null && typeof filterData.data !== 'undefined') { var /** @type {?} */ isLang = (filterData.lang !== null && typeof filterData.lang !== 'undefined') ? filterData.lang : false; if (Array.isArray(filterData.data)) { try { for (var _a = tslib_1.__values(filterData.data), _b = _a.next(); !_b.done; _b = _a.next()) { var d = _b.value; var /** @type {?} */ versions = this.getDataVersions(d, 2); if (isLang) { versions = this.getDataLanguage(d); } try { for (var versions_1 = tslib_1.__values(versions), versions_1_1 = versions_1.next(); !versions_1_1.done; versions_1_1 = versions_1.next()) { var v = versions_1_1.value; result.push(v); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (versions_1_1 && !versions_1_1.done && (_c = versions_1.return)) _c.call(versions_1); } finally { if (e_2) throw e_2.error; } } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_b && !_b.done && (_d = _a.return)) _d.call(_a); } finally { if (e_3) throw e_3.error; } } } else { var /** @type {?} */ versions = this.getDataVersions(filterData.data, 4); if (isLang) { versions = this.getDataLanguage(filterData.data); } try { for (var versions_2 = tslib_1.__values(versions), versions_2_1 = versions_2.next(); !versions_2_1.done; versions_2_1 = versions_2.next()) { var v = versions_2_1.value; result.push(v); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (versions_2_1 && !versions_2_1.done && (_e = versions_2.return)) _e.call(versions_2); } finally { if (e_4) throw e_4.error; } } } } } return Promise.resolve(result); var e_3, _d, e_2, _c, e_4, _e; }; /** * @param {?} obj * @return {?} */ ParrotsDataService.prototype.getDataLanguage = /** * @param {?} obj * @return {?} */ function (obj) { var /** @type {?} */ result = []; var /** @type {?} */ langSet = ["TH", "EN"]; try { for (var langSet_1 = tslib_1.__values(langSet), langSet_1_1 = langSet_1.next(); !langSet_1_1.done; langSet_1_1 = langSet_1.next()) { var lang = langSet_1_1.value; var /** @type {?} */ cloneData = JSON.parse(JSON.stringify(obj)); if (cloneData.name === null || typeof cloneData.name === 'undefined') { continue; } cloneData.name = cloneData.name + "_" + lang; cloneData._lang = lang; result.push(cloneData); } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (langSet_1_1 && !langSet_1_1.done && (_a = langSet_1.return)) _a.call(langSet_1); } finally { if (e_5) throw e_5.error; } } // if(obj.name !== null && typeof obj.name !== 'undefined'){ // let cloneData = JSON.parse(JSON.stringify(obj)); // cloneData.name = cloneData.name+"_KR"; // cloneData._lang = "KR"; // result.push(cloneData); // } return result; var e_5, _a; }; /** * @param {?} obj * @param {?} amount * @return {?} */ ParrotsDataService.prototype.getDataVersions = /** * @param {?} obj * @param {?} amount * @return {?} */ function (obj, amount) { var /** @type {?} */ result = []; for (var /** @type {?} */ i = 0; i < amount; i++) { var /** @type {?} */ cloneData = JSON.parse(JSON.stringify(obj)); cloneData._version = (i + 1); cloneData._versionCreated = "2017-03-1" + i + "T01:44:54.862Z"; cloneData._lastUpdated = "2017-03-1" + i + "T01:44:54.862Z"; cloneData._lang = "TH"; result.push(cloneData); } return result; }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.recycleData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; /** * @param {?} data * @return {?} */ ParrotsDataService.prototype.promoteData = /** * @param {?} data * @return {?} */ function (data) { return Promise.resolve(data); }; return ParrotsDataService; }()); export { ParrotsDataService }; function ParrotsDataService_tsickle_Closure_declarations() { /** @type {?} */ ParrotsDataService.prototype.baseURL; /** @type {?} */ ParrotsDataService.prototype.className; /** @type {?} */ ParrotsDataService.prototype.isTest; /** @type {?} */ ParrotsDataService.prototype.connectionManager; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c0RhdGFTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9QYXJyb3RzRGF0YVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQWtCLE9BQU8sRUFBc0MsTUFBTSxlQUFlLENBQUM7QUFJNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RSxxQkFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDO0FBQzFCLHFCQUFNLElBQUksR0FBVyxNQUFNLENBQUM7QUFDNUIscUJBQU0sR0FBRyxHQUFXLEtBQUssQ0FBQztBQUMxQixxQkFBTSxNQUFNLEdBQVcsUUFBUSxDQUFDO0FBQ2hDLHFCQUFNLEtBQUssR0FBVyxPQUFPLENBQUM7QUFDOUIscUJBQU0sSUFBSSxHQUFXLE1BQU0sQ0FBQztBQUM1QixxQkFBTSxPQUFPLEdBQVcsU0FBUyxDQUFDO0FBR2xDLElBQUE7SUFPSSw0QkFBWSxTQUFpQixFQUFFLE9BQWUsRUFBRSxpQkFBb0M7c0JBSDFELElBQUk7UUFJMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0tBQzlDOzs7Ozs7O0lBRU8sOENBQWlCOzs7Ozs7Y0FBQyxHQUFXLEVBQUUsYUFBcUIsRUFBRSxJQUFZO1FBQ3RFLEVBQUUsQ0FBQSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssV0FBVyxDQUFDLENBQUEsQ0FBQztZQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDO1NBQ2Y7UUFFRCxxQkFBSSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxjQUFjLEVBQUUsa0JB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Q0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzs7Ozs7SUFHMUIsd0NBQVc7Ozs7Y0FBQyxJQUFTO1FBQ3hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzs2QkF6UHJDO0lBNFBDLENBQUE7QUE1T0QsOEJBNE9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cCwgUmVzcG9uc2UsIEhlYWRlcnMsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc0FyZ3MgfSBmcm9tICdAYW5ndWxhci9odHRwJztcbmltcG9ydCB7IElEYXRhU2VydmljZSB9IGZyb20gJy4vZWRpdG9ycyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlcnZpY2UvQ29ubmVjdGlvbk1hbmFnZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IERhdGFTY2hlbWEsIERhdGFGaWVsZCwgSnNvblNjaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlL21vZGVsL21vZGVscyc7XG5cbmNvbnN0IEdFVDogc3RyaW5nID0gJ0dFVCc7XG5jb25zdCBQT1NUOiBzdHJpbmcgPSAnUE9TVCc7XG5jb25zdCBQVVQ6IHN0cmluZyA9ICdQVVQnO1xuY29uc3QgREVMRVRFOiBzdHJpbmcgPSAnREVMRVRFJztcbmNvbnN0IFBBVENIOiBzdHJpbmcgPSAnUEFUQ0gnO1xuY29uc3QgSEVBRDogc3RyaW5nID0gJ0hFQUQnO1xuY29uc3QgT1BUSU9OUzogc3RyaW5nID0gJ09QVElPTlMnO1xuXG5cbmV4cG9ydCBjbGFzcyBQYXJyb3RzRGF0YVNlcnZpY2UgaW1wbGVtZW50cyBJRGF0YVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBiYXNlVVJMOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjbGFzc05hbWU6IHN0cmluZztcbiAgICBwcml2YXRlIGlzVGVzdDogYm9vbGVhbiA9IHRydWU7XG4gICAgcHJpdmF0ZSBjb25uZWN0aW9uTWFuYWdlcjogQ29ubmVjdGlvbk1hbmFnZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihjbGFzc05hbWU6IHN0cmluZywgYmFzZVVSTDogc3RyaW5nLCBjb25uZWN0aW9uTWFuYWdlcjogQ29ubmVjdGlvbk1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHRoaXMuYmFzZVVSTCA9IGJhc2VVUkw7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIgPSBjb25uZWN0aW9uTWFuYWdlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJlcXVlc3RQcm9taXNlKHVybDogc3RyaW5nLCByZXF1ZXN0TWV0aG9kOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubmVjdGlvbk1hbmFnZXIgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIgPT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RNZXRob2QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzOiBSZXF1ZXN0T3B0aW9uc0FyZ3MgPSB7IHVybDogdXJsLCBtZXRob2Q6IHJlcXVlc3RNZXRob2QsIGhlYWRlcnM6IGhlYWRlcnMsIGJvZHk6IGJvZHkgfTtcblxuICAgICAgICBpZiAocmVxdWVzdE1ldGhvZCA9PT0gR0VUKSB7XG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MubWV0aG9kID0gR0VUO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0V2l0aEh0dHBJbmZvKHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0TWV0aG9kID09PSBQT1NUKSB7XG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MubWV0aG9kID0gUE9TVDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLnBvc3RXaXRoSHR0cEluZm8odXJsLCBib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RNZXRob2QgPT09IFBVVCkge1xuICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnNBcmdzLm1ldGhvZCA9IFBVVDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLnB1dFdpdGhIdHRwSW5mbyh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdE1ldGhvZCA9PT0gREVMRVRFKSB7XG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MubWV0aG9kID0gREVMRVRFO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZGVsZXRlV2l0aEh0dHBJbmZvKHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0TWV0aG9kID09PSBQQVRDSCkge1xuICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnNBcmdzLm1ldGhvZCA9IFBBVENIO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIucGF0Y2hXaXRoSHR0cEluZm8odXJsLCBib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RNZXRob2QgPT09IEhFQUQpIHtcbiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5tZXRob2QgPSBIRUFEO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuaGVhZFdpdGhIdHRwSW5mbyh1cmwsIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdE1ldGhvZCA9PT0gT1BUSU9OUykge1xuICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnNBcmdzLm1ldGhvZCA9IE9QVElPTlM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5vcHRpb25zV2l0aEh0dHBJbmZvKHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLm9wdGlvbnNXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZENsYXNzU2NoZW1hKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVGVzdCkge1xuICAgICAgICAgICAgbGV0IGJvZHkgPSAnJztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJlcXVlc3RQcm9taXNlKCdodHRwczovL2FwaS5teWpzb24uY29tL2JpbnMvMWZueDYnLCBHRVQsIGJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBib2R5ID0gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcXVlc3RQcm9taXNlKHRoaXMuYmFzZVVSTCwgT1BUSU9OUywgYm9keSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWREYXRhU2NoZW1hKCk6IFByb21pc2U8RGF0YVNjaGVtYT4ge1xuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRDbGFzc1NjaGVtYSgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG5cbiAgICAgICAgICAgIGxldCBkYXRhRmllbGRzOiBEYXRhRmllbGRbXSA9IFtdO1xuICAgICAgICAgICAgbGV0IGpzb25TY2hlbWE6IEpzb25TY2hlbWEgPSBudWxsO1xuXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSBKU09OLnBhcnNlKHJlc3BvbnNlLl9ib2R5KTtcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlT2JqICE9IG51bGwgJiYgcmVzcG9uc2VPYmouc2NoZW1hICE9IG51bGwgJiYgKHR5cGVvZiByZXNwb25zZU9iai5zY2hlbWEgIT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgICAgIGpzb25TY2hlbWEgPSByZXNwb25zZU9iai5zY2hlbWE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBqc29uU2NoZW1hLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZkpzb25TY2hlbWE6IEpzb25TY2hlbWEgPSBqc29uU2NoZW1hLnByb3BlcnRpZXNba2V5XTtcblxuICAgICAgICAgICAgICAgIGxldCBkYXRhRmllbGQ6IERhdGFGaWVsZCA9IG5ldyBEYXRhRmllbGQoa2V5LCBrZXksIHNlbGZKc29uU2NoZW1hLnR5cGUsIHNlbGZKc29uU2NoZW1hLCBudWxsKTtcbiAgICAgICAgICAgICAgICBkYXRhRmllbGRzLnB1c2goZGF0YUZpZWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlc3VsdFNjaGVtYTogRGF0YVNjaGVtYSA9IG5ldyBEYXRhU2NoZW1hKHJlc3BvbnNlT2JqLmNsYXNzTmFtZSwgJ2NsYXNzIGxhYmVsJywgZGF0YUZpZWxkcywganNvblNjaGVtYSk7XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0U2NoZW1hKTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRGF0YSgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Rlc3QpIHtcbiAgICAgICAgICAgIGxldCBib2R5ID0gJyc7XG4gICAgICAgICAgICAvLyAnaHR0cHM6Ly9hcGkubXlqc29uLmNvbS9iaW5zL29jOHVoJ1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVxdWVzdFByb21pc2UoJ2h0dHBzOi8vYXBpLm15anNvbi5jb20vYmlucy8xZGtqcGQnLCBHRVQsIGJvZHkpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBsZXQgZGF0YTogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZU9iaiA9IEpTT04ucGFyc2UocmVzcG9uc2UuX2JvZHkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlT2JqICE9IG51bGwgJiYgKHR5cGVvZiByZXNwb25zZU9iaiAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZU9iai5pdGVtcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYm9keSA9ICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXF1ZXN0UHJvbWlzZSh0aGlzLmJhc2VVUkwsIEdFVCwgYm9keSkudGhlbigocmVzcG9uc2UpID0+IHtcblxuICAgICAgICAgICAgbGV0IGRhdGE6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZU9iaiA9IEpTT04ucGFyc2UocmVzcG9uc2UuX2JvZHkpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT0gbnVsbCAmJiAodHlwZW9mIHJlc3BvbnNlT2JqICE9PSAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gcmVzcG9uc2VPYmouaXRlbXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIC8vIG1vY2tkYXRhXG4gICAgICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShkYXRhKSl7XG4gICAgICAgICAgICAgICAgZm9yKGxldCBkIG9mIGRhdGEpe1xuICAgICAgICAgICAgICAgICAgICBkLl9vYmplY3RJZCA9IE1hdGguZmxvb3IoKE1hdGgucmFuZG9tKCkgKiAxMDAwMDApICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGQuX3V1aWQgPSBkLl9vYmplY3RJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEuX29iamVjdElkID0gTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDEwMDAwMCkgKyAxKTtcbiAgICAgICAgICAgICAgICBkYXRhLl91dWlkID0gZGF0YS5fb2JqZWN0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlRGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3lEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZldGNoRGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kRGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBxdWVyeURhdGEoZmlsdGVyRGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgLy8gZGF0YSBhcyBhIGZpbHRlciBkYXRhIG9ubHlcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAvLyBtb2NrZGF0YSAtLSBkYXRhIGlzIHJhdyBkYXRhXG4gICAgICAgIGlmIChmaWx0ZXJEYXRhICE9PSBudWxsICYmIHR5cGVvZiBmaWx0ZXJEYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKGZpbHRlckRhdGEuZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZmlsdGVyRGF0YS5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxldCBpc0xhbmc6IGJvb2xlYW4gPSAoZmlsdGVyRGF0YS5sYW5nICE9PSBudWxsICYmIHR5cGVvZiBmaWx0ZXJEYXRhLmxhbmcgIT09ICd1bmRlZmluZWQnKSA/IGZpbHRlckRhdGEubGFuZyA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZmlsdGVyRGF0YS5kYXRhKSl7XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgZCBvZiBmaWx0ZXJEYXRhLmRhdGEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnNpb25zID0gdGhpcy5nZXREYXRhVmVyc2lvbnMoZCwgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihpc0xhbmcpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gdGhpcy5nZXREYXRhTGFuZ3VhZ2UoZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHYgb2YgdmVyc2lvbnMpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZlcnNpb25zID0gdGhpcy5nZXREYXRhVmVyc2lvbnMoZmlsdGVyRGF0YS5kYXRhLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGFuZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSB0aGlzLmdldERhdGFMYW5ndWFnZShmaWx0ZXJEYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdiBvZiB2ZXJzaW9ucyl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8hIGZvciB0ZXN0aW5nIHJlbW92ZSB3aGVuIGZpbmlzaGVkIHRlc3RpbmdcbiAgICBwcml2YXRlIGdldERhdGFMYW5ndWFnZShvYmo6IGFueSk6IGFueVtdIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IGxhbmdTZXQ6IHN0cmluZ1tdID0gW1wiVEhcIiwgXCJFTlwiXTtcbiAgICAgICAgZm9yIChsZXQgbGFuZyBvZiBsYW5nU2V0KSB7XG4gICAgICAgICAgICBsZXQgY2xvbmVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICAgICAgICAgIGlmKGNsb25lRGF0YS5uYW1lID09PSBudWxsIHx8IHR5cGVvZiBjbG9uZURhdGEubmFtZSA9PT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xvbmVEYXRhLm5hbWUgPSBjbG9uZURhdGEubmFtZStcIl9cIitsYW5nO1xuICAgICAgICAgICAgY2xvbmVEYXRhLl9sYW5nID0gbGFuZztcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNsb25lRGF0YSk7XG4gICAgICAgIH1cblxuLy8gICAgICAgIGlmKG9iai5uYW1lICE9PSBudWxsICYmIHR5cGVvZiBvYmoubmFtZSAhPT0gJ3VuZGVmaW5lZCcpe1xuLy8gICAgICAgICAgICBsZXQgY2xvbmVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbi8vICAgICAgICAgICAgY2xvbmVEYXRhLm5hbWUgPSBjbG9uZURhdGEubmFtZStcIl9LUlwiO1xuLy8gICAgICAgICAgICBjbG9uZURhdGEuX2xhbmcgPSBcIktSXCI7XG4vLyAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNsb25lRGF0YSk7XG4vLyAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8hIGZvciB0ZXN0aW5nIHJlbW92ZSB3aGVuIGZpbmlzaGVkIHRlc3RpbmdcbiAgICBwcml2YXRlIGdldERhdGFWZXJzaW9ucyhvYmo6IGFueSwgYW1vdW50OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW1vdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjbG9uZURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgICAgICAgICAgY2xvbmVEYXRhLl92ZXJzaW9uID0gKGkgKyAxKTtcbiAgICAgICAgICAgIGNsb25lRGF0YS5fdmVyc2lvbkNyZWF0ZWQgPSBcIjIwMTctMDMtMVwiK2krXCJUMDE6NDQ6NTQuODYyWlwiO1xuICAgICAgICAgICAgY2xvbmVEYXRhLl9sYXN0VXBkYXRlZCA9IFwiMjAxNy0wMy0xXCIraStcIlQwMTo0NDo1NC44NjJaXCI7XG4gICAgICAgICAgICBjbG9uZURhdGEuX2xhbmcgPSBcIlRIXCI7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjbG9uZURhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVjeWNsZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJvbW90ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==