UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

287 lines (286 loc) 33.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Headers } from '@angular/http'; import { DataSchema, DataField } from '../../share/model/models'; const /** @type {?} */ GET = 'GET'; const /** @type {?} */ POST = 'POST'; const /** @type {?} */ PUT = 'PUT'; const /** @type {?} */ DELETE = 'DELETE'; const /** @type {?} */ PATCH = 'PATCH'; const /** @type {?} */ HEAD = 'HEAD'; const /** @type {?} */ OPTIONS = 'OPTIONS'; export class ParrotsDataService { /** * @param {?} className * @param {?} baseURL * @param {?} connectionManager */ constructor(className, baseURL, connectionManager) { this.isTest = true; this.className = className; this.baseURL = baseURL; this.connectionManager = connectionManager; } /** * @param {?} url * @param {?} requestMethod * @param {?} body * @return {?} */ getRequestPromise(url, requestMethod, body) { if (this.connectionManager === null || typeof this.connectionManager === 'undefined') { return null; } let /** @type {?} */ headers = new Headers({ 'Content-Type': 'application/json', 'Accept': 'application/json' }); if (requestMethod == null) { return null; } let /** @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 {?} */ loadClassSchema() { if (this.isTest) { let /** @type {?} */ body = ''; return this.getRequestPromise('https://api.myjson.com/bins/1fnx6', GET, body); } let /** @type {?} */ body = ''; return this.getRequestPromise(this.baseURL, OPTIONS, body); } /** * @return {?} */ loadDataSchema() { return this.loadClassSchema().then((response) => { let /** @type {?} */ dataFields = []; let /** @type {?} */ jsonSchema = null; let /** @type {?} */ responseObj = JSON.parse(response._body); if (responseObj != null && responseObj.schema != null && (typeof responseObj.schema !== 'undefined')) { jsonSchema = responseObj.schema; } for (let /** @type {?} */ key in jsonSchema.properties) { let /** @type {?} */ selfJsonSchema = jsonSchema.properties[key]; let /** @type {?} */ dataField = new DataField(key, key, selfJsonSchema.type, selfJsonSchema, null); dataFields.push(dataField); } let /** @type {?} */ resultSchema = new DataSchema(responseObj.className, 'class label', dataFields, jsonSchema); return Promise.resolve(resultSchema); }).catch(error => { return Promise.reject(error); }); } /** * @return {?} */ loadData() { if (this.isTest) { let /** @type {?} */ body = ''; // 'https://api.myjson.com/bins/oc8uh' return this.getRequestPromise('https://api.myjson.com/bins/1dkjpd', GET, body).then((response) => { let /** @type {?} */ data = []; let /** @type {?} */ responseObj = JSON.parse(response._body); if (responseObj != null && (typeof responseObj !== 'undefined')) { data = responseObj.items; } return Promise.resolve(data); }); } let /** @type {?} */ body = ''; return this.getRequestPromise(this.baseURL, GET, body).then((response) => { let /** @type {?} */ data = []; let /** @type {?} */ responseObj = JSON.parse(response._body); if (responseObj != null && (typeof responseObj !== 'undefined')) { data = responseObj.items; } return Promise.resolve(data); }); } /** * @param {?} data * @return {?} */ createData(data) { // mockdata if (data !== null && typeof data !== 'undefined') { if (Array.isArray(data)) { for (let /** @type {?} */ d of data) { d._objectId = Math.floor((Math.random() * 100000) + 1); d._uuid = d._objectId; } } else { data._objectId = Math.floor((Math.random() * 100000) + 1); data._uuid = data._objectId; } } return Promise.resolve(data); } /** * @param {?} data * @return {?} */ updateData(data) { return Promise.resolve(data); } /** * @param {?} data * @return {?} */ deleteData(data) { return Promise.resolve(data); } /** * @param {?} data * @return {?} */ destroyData(data) { return Promise.resolve(data); } /** * @param {?} data * @return {?} */ fetchData(data) { return Promise.resolve(data); } /** * @param {?} data * @return {?} */ findData(data) { return Promise.resolve(data); } /** * @param {?} filterData * @return {?} */ queryData(filterData) { // data as a filter data only let /** @type {?} */ result = []; // mockdata -- data is raw data if (filterData !== null && typeof filterData !== 'undefined') { if (filterData.data !== null && typeof filterData.data !== 'undefined') { let /** @type {?} */ isLang = (filterData.lang !== null && typeof filterData.lang !== 'undefined') ? filterData.lang : false; if (Array.isArray(filterData.data)) { for (let /** @type {?} */ d of filterData.data) { let /** @type {?} */ versions = this.getDataVersions(d, 2); if (isLang) { versions = this.getDataLanguage(d); } for (let /** @type {?} */ v of versions) { result.push(v); } } } else { let /** @type {?} */ versions = this.getDataVersions(filterData.data, 4); if (isLang) { versions = this.getDataLanguage(filterData.data); } for (let /** @type {?} */ v of versions) { result.push(v); } } } } return Promise.resolve(result); } /** * @param {?} obj * @return {?} */ getDataLanguage(obj) { let /** @type {?} */ result = []; let /** @type {?} */ langSet = ["TH", "EN"]; for (let /** @type {?} */ lang of langSet) { let /** @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); } // 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; } /** * @param {?} obj * @param {?} amount * @return {?} */ getDataVersions(obj, amount) { let /** @type {?} */ result = []; for (let /** @type {?} */ i = 0; i < amount; i++) { let /** @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 {?} */ recycleData(data) { return Promise.resolve(data); } /** * @param {?} data * @return {?} */ promoteData(data) { return Promise.resolve(data); } } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c0RhdGFTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9QYXJyb3RzRGF0YVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBa0IsT0FBTyxFQUFzQyxNQUFNLGVBQWUsQ0FBQztBQUk1RixPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBYyxNQUFNLDBCQUEwQixDQUFDO0FBRTdFLHVCQUFNLEdBQUcsR0FBVyxLQUFLLENBQUM7QUFDMUIsdUJBQU0sSUFBSSxHQUFXLE1BQU0sQ0FBQztBQUM1Qix1QkFBTSxHQUFHLEdBQVcsS0FBSyxDQUFDO0FBQzFCLHVCQUFNLE1BQU0sR0FBVyxRQUFRLENBQUM7QUFDaEMsdUJBQU0sS0FBSyxHQUFXLE9BQU8sQ0FBQztBQUM5Qix1QkFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQzVCLHVCQUFNLE9BQU8sR0FBVyxTQUFTLENBQUM7QUFHbEMsTUFBTTs7Ozs7O0lBT0YsWUFBWSxTQUFpQixFQUFFLE9BQWUsRUFBRSxpQkFBb0M7c0JBSDFELElBQUk7UUFJMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO0tBQzlDOzs7Ozs7O0lBRU8saUJBQWlCLENBQUMsR0FBVyxFQUFFLGFBQXFCLEVBQUUsSUFBWTtRQUN0RSxFQUFFLENBQUEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFdBQVcsQ0FBQyxDQUFBLENBQUM7WUFDakYsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNmO1FBRUQscUJBQUksT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFr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bSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwLCBSZXNwb25zZSwgSGVhZGVycywgUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RPcHRpb25zQXJncyB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgSURhdGFTZXJ2aWNlIH0gZnJvbSAnLi9lZGl0b3JzJztcbmltcG9ydCB7IENvbm5lY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VydmljZS9Db25uZWN0aW9uTWFuYWdlci5zZXJ2aWNlJztcblxuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YUZpZWxkLCBKc29uU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2hhcmUvbW9kZWwvbW9kZWxzJztcblxuY29uc3QgR0VUOiBzdHJpbmcgPSAnR0VUJztcbmNvbnN0IFBPU1Q6IHN0cmluZyA9ICdQT1NUJztcbmNvbnN0IFBVVDogc3RyaW5nID0gJ1BVVCc7XG5jb25zdCBERUxFVEU6IHN0cmluZyA9ICdERUxFVEUnO1xuY29uc3QgUEFUQ0g6IHN0cmluZyA9ICdQQVRDSCc7XG5jb25zdCBIRUFEOiBzdHJpbmcgPSAnSEVBRCc7XG5jb25zdCBPUFRJT05TOiBzdHJpbmcgPSAnT1BUSU9OUyc7XG5cblxuZXhwb3J0IGNsYXNzIFBhcnJvdHNEYXRhU2VydmljZSBpbXBsZW1lbnRzIElEYXRhU2VydmljZSB7XG5cbiAgICBwcml2YXRlIGJhc2VVUkw6IHN0cmluZztcbiAgICBwcml2YXRlIGNsYXNzTmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgaXNUZXN0OiBib29sZWFuID0gdHJ1ZTtcbiAgICBwcml2YXRlIGNvbm5lY3Rpb25NYW5hZ2VyOiBDb25uZWN0aW9uTWFuYWdlcjtcblxuICAgIGNvbnN0cnVjdG9yKGNsYXNzTmFtZTogc3RyaW5nLCBiYXNlVVJMOiBzdHJpbmcsIGNvbm5lY3Rpb25NYW5hZ2VyOiBDb25uZWN0aW9uTWFuYWdlcikge1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy5iYXNlVVJMID0gYmFzZVVSTDtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IGNvbm5lY3Rpb25NYW5hZ2VyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVxdWVzdFByb21pc2UodXJsOiBzdHJpbmcsIHJlcXVlc3RNZXRob2Q6IHN0cmluZywgYm9keTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYodGhpcy5jb25uZWN0aW9uTWFuYWdlciA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9PT0gJ3VuZGVmaW5lZCcpe1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcblxuICAgICAgICBpZiAocmVxdWVzdE1ldGhvZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3M6IFJlcXVlc3RPcHRpb25zQXJncyA9IHsgdXJsOiB1cmwsIG1ldGhvZDogcmVxdWVzdE1ldGhvZCwgaGVhZGVyczogaGVhZGVycywgYm9keTogYm9keSB9O1xuXG4gICAgICAgIGlmIChyZXF1ZXN0TWV0aG9kID09PSBHRVQpIHtcbiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5tZXRob2QgPSBHRVQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5nZXRXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RNZXRob2QgPT09IFBPU1QpIHtcbiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5tZXRob2QgPSBQT1NUO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIucG9zdFdpdGhIdHRwSW5mbyh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdE1ldGhvZCA9PT0gUFVUKSB7XG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MubWV0aG9kID0gUFVUO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIucHV0V2l0aEh0dHBJbmZvKHVybCwgYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0TWV0aG9kID09PSBERUxFVEUpIHtcbiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5tZXRob2QgPSBERUxFVEU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5kZWxldGVXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RNZXRob2QgPT09IFBBVENIKSB7XG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MubWV0aG9kID0gUEFUQ0g7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5wYXRjaFdpdGhIdHRwSW5mbyh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdE1ldGhvZCA9PT0gSEVBRCkge1xuICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnNBcmdzLm1ldGhvZCA9IEhFQUQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5oZWFkV2l0aEh0dHBJbmZvKHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0TWV0aG9kID09PSBPUFRJT05TKSB7XG4gICAgICAgICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MubWV0aG9kID0gT1BUSU9OUztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLm9wdGlvbnNXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIub3B0aW9uc1dpdGhIdHRwSW5mbyh1cmwsIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkQ2xhc3NTY2hlbWEoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNUZXN0KSB7XG4gICAgICAgICAgICBsZXQgYm9keSA9ICcnO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVxdWVzdFByb21pc2UoJ2h0dHBzOi8vYXBpLm15anNvbi5jb20vYmlucy8xZm54NicsIEdFVCwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvZHkgPSAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVxdWVzdFByb21pc2UodGhpcy5iYXNlVVJMLCBPUFRJT05TLCBib2R5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZERhdGFTY2hlbWEoKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZENsYXNzU2NoZW1hKCkudGhlbigocmVzcG9uc2UpID0+IHtcblxuICAgICAgICAgICAgbGV0IGRhdGFGaWVsZHM6IERhdGFGaWVsZFtdID0gW107XG4gICAgICAgICAgICBsZXQganNvblNjaGVtYTogSnNvblNjaGVtYSA9IG51bGw7XG5cbiAgICAgICAgICAgIGxldCByZXNwb25zZU9iaiA9IEpTT04ucGFyc2UocmVzcG9uc2UuX2JvZHkpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT0gbnVsbCAmJiByZXNwb25zZU9iai5zY2hlbWEgIT0gbnVsbCAmJiAodHlwZW9mIHJlc3BvbnNlT2JqLnNjaGVtYSAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICAgICAganNvblNjaGVtYSA9IHJlc3BvbnNlT2JqLnNjaGVtYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGpzb25TY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGxldCBzZWxmSnNvblNjaGVtYTogSnNvblNjaGVtYSA9IGpzb25TY2hlbWEucHJvcGVydGllc1trZXldO1xuXG4gICAgICAgICAgICAgICAgbGV0IGRhdGFGaWVsZDogRGF0YUZpZWxkID0gbmV3IERhdGFGaWVsZChrZXksIGtleSwgc2VsZkpzb25TY2hlbWEudHlwZSwgc2VsZkpzb25TY2hlbWEsIG51bGwpO1xuICAgICAgICAgICAgICAgIGRhdGFGaWVsZHMucHVzaChkYXRhRmllbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzdWx0U2NoZW1hOiBEYXRhU2NoZW1hID0gbmV3IERhdGFTY2hlbWEocmVzcG9uc2VPYmouY2xhc3NOYW1lLCAnY2xhc3MgbGFiZWwnLCBkYXRhRmllbGRzLCBqc29uU2NoZW1hKTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHRTY2hlbWEpO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWREYXRhKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVGVzdCkge1xuICAgICAgICAgICAgbGV0IGJvZHkgPSAnJztcbiAgICAgICAgICAgIC8vICdodHRwczovL2FwaS5teWpzb24uY29tL2JpbnMvb2M4dWgnXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSZXF1ZXN0UHJvbWlzZSgnaHR0cHM6Ly9hcGkubXlqc29uLmNvbS9iaW5zLzFka2pwZCcsIEdFVCwgYm9keSkudGhlbigocmVzcG9uc2UpID0+IHtcblxuICAgICAgICAgICAgICAgIGxldCBkYXRhOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlT2JqID0gSlNPTi5wYXJzZShyZXNwb25zZS5fYm9keSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT0gbnVsbCAmJiAodHlwZW9mIHJlc3BvbnNlT2JqICE9PSAndW5kZWZpbmVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlc3BvbnNlT2JqLml0ZW1zO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBib2R5ID0gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJlcXVlc3RQcm9taXNlKHRoaXMuYmFzZVVSTCwgR0VULCBib2R5KS50aGVuKChyZXNwb25zZSkgPT4ge1xuXG4gICAgICAgICAgICBsZXQgZGF0YTogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlT2JqID0gSlNPTi5wYXJzZShyZXNwb25zZS5fYm9keSk7XG5cbiAgICAgICAgICAgIGlmIChyZXNwb25zZU9iaiAhPSBudWxsICYmICh0eXBlb2YgcmVzcG9uc2VPYmogIT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwb25zZU9iai5pdGVtcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgLy8gbW9ja2RhdGFcbiAgICAgICAgaWYgKGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KGRhdGEpKXtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGQgb2YgZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgIGQuX29iamVjdElkID0gTWF0aC5mbG9vcigoTWF0aC5yYW5kb20oKSAqIDEwMDAwMCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgZC5fdXVpZCA9IGQuX29iamVjdElkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YS5fb2JqZWN0SWQgPSBNYXRoLmZsb29yKChNYXRoLnJhbmRvbSgpICogMTAwMDAwKSArIDEpO1xuICAgICAgICAgICAgICAgIGRhdGEuX3V1aWQgPSBkYXRhLl9vYmplY3RJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShkYXRhKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmV0Y2hEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmREYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5RGF0YShmaWx0ZXJEYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICAvLyBkYXRhIGFzIGEgZmlsdGVyIGRhdGEgb25seVxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIC8vIG1vY2tkYXRhIC0tIGRhdGEgaXMgcmF3IGRhdGFcbiAgICAgICAgaWYgKGZpbHRlckRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGZpbHRlckRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyRGF0YS5kYXRhICE9PSBudWxsICYmIHR5cGVvZiBmaWx0ZXJEYXRhLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlzTGFuZzogYm9vbGVhbiA9IChmaWx0ZXJEYXRhLmxhbmcgIT09IG51bGwgJiYgdHlwZW9mIGZpbHRlckRhdGEubGFuZyAhPT0gJ3VuZGVmaW5lZCcpID8gZmlsdGVyRGF0YS5sYW5nIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShmaWx0ZXJEYXRhLmRhdGEpKXtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBkIG9mIGZpbHRlckRhdGEuZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbnMgPSB0aGlzLmdldERhdGFWZXJzaW9ucyhkLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTGFuZyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbnMgPSB0aGlzLmdldERhdGFMYW5ndWFnZShkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdiBvZiB2ZXJzaW9ucyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbnMgPSB0aGlzLmdldERhdGFWZXJzaW9ucyhmaWx0ZXJEYXRhLmRhdGEsIDQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNMYW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9IHRoaXMuZ2V0RGF0YUxhbmd1YWdlKGZpbHRlckRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCB2IG9mIHZlcnNpb25zKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICB9XG5cbiAgICAvLyEgZm9yIHRlc3RpbmcgcmVtb3ZlIHdoZW4gZmluaXNoZWQgdGVzdGluZ1xuICAgIHByaXZhdGUgZ2V0RGF0YUxhbmd1YWdlKG9iajogYW55KTogYW55W10ge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgICBsZXQgbGFuZ1NldDogc3RyaW5nW10gPSBbXCJUSFwiLCBcIkVOXCJdO1xuICAgICAgICBmb3IgKGxldCBsYW5nIG9mIGxhbmdTZXQpIHtcbiAgICAgICAgICAgIGxldCBjbG9uZURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgICAgICAgICAgaWYoY2xvbmVEYXRhLm5hbWUgPT09IG51bGwgfHwgdHlwZW9mIGNsb25lRGF0YS5uYW1lID09PSAndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbG9uZURhdGEubmFtZSA9IGNsb25lRGF0YS5uYW1lK1wiX1wiK2xhbmc7XG4gICAgICAgICAgICBjbG9uZURhdGEuX2xhbmcgPSBsYW5nO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2xvbmVEYXRhKTtcbiAgICAgICAgfVxuXG4vLyAgICAgICAgaWYob2JqLm5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG9iai5uYW1lICE9PSAndW5kZWZpbmVkJyl7XG4vLyAgICAgICAgICAgIGxldCBjbG9uZURhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuLy8gICAgICAgICAgICBjbG9uZURhdGEubmFtZSA9IGNsb25lRGF0YS5uYW1lK1wiX0tSXCI7XG4vLyAgICAgICAgICAgIGNsb25lRGF0YS5fbGFuZyA9IFwiS1JcIjtcbi8vICAgICAgICAgICAgcmVzdWx0LnB1c2goY2xvbmVEYXRhKTtcbi8vICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyEgZm9yIHRlc3RpbmcgcmVtb3ZlIHdoZW4gZmluaXNoZWQgdGVzdGluZ1xuICAgIHByaXZhdGUgZ2V0RGF0YVZlcnNpb25zKG9iajogYW55LCBhbW91bnQ6IG51bWJlcik6IGFueVtdIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbW91bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNsb25lRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gICAgICAgICAgICBjbG9uZURhdGEuX3ZlcnNpb24gPSAoaSArIDEpO1xuICAgICAgICAgICAgY2xvbmVEYXRhLl92ZXJzaW9uQ3JlYXRlZCA9IFwiMjAxNy0wMy0xXCIraStcIlQwMTo0NDo1NC44NjJaXCI7XG4gICAgICAgICAgICBjbG9uZURhdGEuX2xhc3RVcGRhdGVkID0gXCIyMDE3LTAzLTFcIitpK1wiVDAxOjQ0OjU0Ljg2MlpcIjtcbiAgICAgICAgICAgIGNsb25lRGF0YS5fbGFuZyA9IFwiVEhcIjtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNsb25lRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyByZWN5Y2xlRGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcm9tb3RlRGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpO1xuICAgIH1cblxufVxuIl19