com.phloxui
Version:
PhloxUI Ng2+ Framework
398 lines (397 loc) • 37.9 kB
JavaScript
/**
* @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==