UNPKG

jade-integration-utils

Version:

A tool made for any type of http requisitions and to manage localstorage. This package works into Angular and Ionic projects (maybe you can run this in ReactNative, MAYBE!).

280 lines 36.4 kB
import { StorageService } from '../services/storage.service'; import { XHRManager } from '../services/xhr-manager.service'; var DataService = /** @class */ (function () { function DataService(api_url, endpoint) { this._endpoint = ""; this.xMan = new XHRManager(api_url, endpoint); this.element_list = new Array(); this.loading = false; this._endpoint = endpoint; } DataService.prototype.remove_e_query = function (query) { query = query.startsWith("&") ? query.replace(query.charAt(0), "") : query; return query; }; DataService.prototype.getById = function (id, callbackHandler) { var _this = this; this.loading = true; this.xMan.getById(id, this._endpoint) .then(function (result) { _this.bind_results(result); if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; DataService.prototype.bind_results = function (result) { var _a, _b, _c; this.page = (_a = result === null || result === void 0 ? void 0 : result.page) !== null && _a !== void 0 ? _a : this.page; this.fetch = (_b = result === null || result === void 0 ? void 0 : result.fetch) !== null && _b !== void 0 ? _b : this.fetch; this.itemsCount = (_c = result === null || result === void 0 ? void 0 : result.itemsCount) !== null && _c !== void 0 ? _c : this.itemsCount; if (result.objects != null) this.element_list = result.objects; this.results = result; this.get_pages_array(); }; DataService.prototype.get = function (filter, callbackHandler, pagination) { var _this = this; if (pagination === void 0) { pagination = false; } this.loading = true; var query = this.serialize_query(filter) + (pagination ? '&' + this.get_pagination_query() : ''); console.log(query); this.xMan.get(this._endpoint, query) .then(function (result) { _this.bind_results(result); if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; DataService.prototype.getAll = function (callbackHandler, pagination) { var _this = this; if (pagination === void 0) { pagination = false; } this.loading = true; var pagination_query = (pagination ? this.get_pagination_query() : ''); console.log(pagination); this.xMan.get(this._endpoint, pagination_query) .then(function (result) { _this.bind_results(result); if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; DataService.prototype.next = function (filter) { this.page += 1; this.get(filter, true); }; DataService.prototype.previous = function (filter) { if (this.page > 1) this.page -= 1; this.get(filter, true); }; /** * calls a http get to not configured endpoint * * @param endpoint another endpoint */ DataService.prototype.get_by_endpoint = function (endpoint, callbackHandler, query_params, pagination) { var _this = this; if (pagination === void 0) { pagination = false; } this.loading = true; console.log(pagination); this.xMan.get(endpoint + (pagination ? this.get_pagination_query() : '')) .then(function (result) { _this.bind_results(result); if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; /** * this function calls a http post from before configured api * * @param body parameter that send's a different custom body * @param callbackHandler @optional function to call when requests finish * @param message @optional string to show after requests finish */ DataService.prototype.post = function (body, callbackHandler) { var _this = this; this.loading = true; this.xMan.post(this.remove_resource(body), this._endpoint) .then(function (result) { _this.results = result; if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; /** * this function calls a http post from before configured api * * @param body parameter that send's a custom body * @param callbackHandler @optional function to call when requests finish * @param message @optional string to show after requests finish */ DataService.prototype.create = function (body, callbackHandler) { var _this = this; this.loading = true; this.xMan.post(this.remove_resource(body), this._endpoint) .then(function (result) { _this.results = result; if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; /** * call's a Put method to the url before configured * @param body of requisition of request * @param callbackHandler function that call's on request's finished * @param message @optional string to show after requests finish */ DataService.prototype.update = function (body, callbackHandler) { var _this = this; this.loading = true; this.xMan.put(this.remove_resource(body), this._endpoint) .then(function (result) { _this.results = result; if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; /** * call's a Put method to the url before configured * @param body of requisition of request * @param callbackHandler function that call's on request's finished * @param message @optional string to show after requests finish */ DataService.prototype.put = function (body, callbackHandler) { var _this = this; this.loading = true; this.xMan.put(body, this._endpoint) .then(function (result) { _this.results = result; if (callbackHandler) callbackHandler(result); }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; /** * calls http DELETE to configured endpoint * * @param id Id to delete * @param callbackHandler a function to run after delete function as done */ DataService.prototype.delete = function (id, callbackHandler) { var _this = this; this.loading = true; this.xMan.delete(id, this._endpoint) .then(function (results) { if (results.target) { if (callbackHandler) callbackHandler(results); } else { alert("Ocorreu um erro!"); } }) .catch(function (error) { return _this.showError(error); }) .finally(function () { return _this.loading = false; }); }; /** * Set's Authentication bearer * @param auth strings containing authentication bearer */ DataService.prototype.set_auth = function (auth) { this.xMan.set_token(auth); }; DataService.prototype.get_auth = function () { return this.xMan.get_token(); }; DataService.prototype.get_pages_array = function () { this.page_array = new Array(); var pagesCount = this.itemsCount / this.fetch; for (var index = 1; index <= pagesCount; index++) { this.page_array.push(index); } }; DataService.prototype.get_pagination_query = function () { return "fetch=" + this.fetch + "&page=" + this.page; }; DataService.prototype.show_success = function (msg) { alert(msg || 'Saved with success'); }; DataService.prototype.showError = function (error) { console.log("***API ERROR REPORT***"); console.log(error); console.log("--------------------"); }; DataService.prototype.logout = function () { StorageService.clear(); this.xMan.auth = ''; window.location.reload(); }; DataService.prototype.serialize_query = function (obj) { var str = []; for (var p in obj) { if (typeof obj[p] === 'object') { for (var key in obj[p]) { if (p == 'resource') continue; if (Object.prototype.hasOwnProperty.call(obj[p], key)) { var element = obj[p][key]; if (this.serialize_query(obj[p])) str.push(encodeURIComponent(p) + "." + this.serialize_query(obj[p])); } } } else if (obj.hasOwnProperty(p)) { if (encodeURIComponent(obj[p])) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); } } var results = str.join("&"); return results; }; DataService.prototype.auto_bind = function (result, target) { for (var p in result) { if (target.hasOwnProperty(p) && result.hasOwnProperty(p)) { target[p] = result[p]; } } }; DataService.prototype.remove_resource = function (target) { this.target = JSON.parse(JSON.stringify(target)); for (var p in this.target) { if (this.target.hasOwnProperty(p)) { if (p == 'resource' || p == 'endpoint') { delete this.target[p]; } ; } } return this.target; }; DataService.normalizeString = function (text) { text = text.toLowerCase(); text = text.replace(new RegExp('[ÁÀÂÃ]', 'gi'), 'a'); text = text.replace(new RegExp('[ÉÈÊ]', 'gi'), 'e'); text = text.replace(new RegExp('[ÍÌÎ]', 'gi'), 'i'); text = text.replace(new RegExp('[ÓÒÔÕ]', 'gi'), 'o'); text = text.replace(new RegExp('[ÚÙÛ]', 'gi'), 'u'); text = text.replace(new RegExp('[Ç]', 'gi'), 'c'); text = text.replace(/[^a-z0-9 -]/g, ''); return text; }; DataService.user_session = "session-user"; return DataService; }()); export { DataService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9qYWRlLWludGVncmF0aW9uLXV0aWxzLyIsInNvdXJjZXMiOlsibGliL01vZGVscy9EYXRhU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSTdEO0lBY0UscUJBQ0UsT0FBZSxFQUNmLFFBQWU7UUFMVCxjQUFTLEdBQVcsRUFBRSxDQUFDO1FBTzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM1QixDQUFDO0lBRU8sb0NBQWMsR0FBdEIsVUFBdUIsS0FBYTtRQUNsQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFMUUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sNkJBQU8sR0FBZCxVQUFlLEVBQVUsRUFBQyxlQUFxQjtRQUEvQyxpQkFVQztRQVRDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFJLEVBQUUsRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ3RDLElBQUksQ0FBQyxVQUFDLE1BQU07WUFDWCxLQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FB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Q0FBQyxDQUFDO1FBQ3BELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQW5TYSx3QkFBWSxHQUFXLGNBQWMsQ0FBQztJQW9TdEQsa0JBQUM7Q0FBQSxBQXJTRCxJQXFTQztTQXJTWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSURhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JRGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgWEhSTWFuYWdlciB9IGZyb20gJy4uL3NlcnZpY2VzL3hoci1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSAnLi9QYWdpbmF0b3InO1xuXG5cbmV4cG9ydCBjbGFzcyBEYXRhU2VydmljZTxUPiBpbXBsZW1lbnRzIElEYXRhU2VydmljZXtcbiAgcHVibGljIHN0YXRpYyB1c2VyX3Nlc3Npb246IHN0cmluZyA9IFwic2Vzc2lvbi11c2VyXCI7XG4gIHB1YmxpYyBlbGVtZW50X2xpc3Q6IEFycmF5PFQ+O1xuICBwdWJsaWMgcGFnZV9hcnJheSA6IEFycmF5PG51bWJlcj47XG4gIHB1YmxpYyBwYWdlIDogbnVtYmVyO1xuICBwdWJsaWMgZmV0Y2ggOiBudW1iZXI7XG4gIHB1YmxpYyBpdGVtc0NvdW50IDogbnVtYmVyO1xuICBwdWJsaWMgYXJnczogYW55O1xuICBwdWJsaWMgcmVzdWx0czogYW55O1xuICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcbiAgcHVibGljIHhNYW4gOiBYSFJNYW5hZ2VyO1xuICBwcml2YXRlIF9lbmRwb2ludDogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSB0YXJnZXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhcGlfdXJsOiBzdHJpbmcsXG4gICAgZW5kcG9pbnQ6c3RyaW5nXG4gICAgKSB7XG4gICAgdGhpcy54TWFuID0gbmV3IFhIUk1hbmFnZXIoYXBpX3VybCxlbmRwb2ludCk7XG4gICAgdGhpcy5lbGVtZW50X2xpc3QgPSBuZXcgQXJyYXk8VD4oKTtcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9lbmRwb2ludCA9IGVuZHBvaW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVfZV9xdWVyeShxdWVyeTogc3RyaW5nKTogc3RyaW5ne1xuICAgIHF1ZXJ5ID0gcXVlcnkuc3RhcnRzV2l0aChcIiZcIikgPyBxdWVyeS5yZXBsYWNlKHF1ZXJ5LmNoYXJBdCgwKSxcIlwiKSA6IHF1ZXJ5O1xuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgcHVibGljIGdldEJ5SWQoaWQ6IG51bWJlcixjYWxsYmFja0hhbmRsZXI/OiBhbnkpOiB2b2lke1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLnhNYW4uZ2V0QnlJZDxUPihpZCx0aGlzLl9lbmRwb2ludClcbiAgICAudGhlbigocmVzdWx0KSA9PiB7IFxuICAgICAgdGhpcy5iaW5kX3Jlc3VsdHMocmVzdWx0KTtcbiAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgIGNhbGxiYWNrSGFuZGxlcihyZXN1bHQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcik9PiB0aGlzLnNob3dFcnJvcihlcnJvcikpXG4gICAgLmZpbmFsbHkoKCk9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRfcmVzdWx0cyhyZXN1bHQ6IFJlc3VsdDxUPik6IGFueSB7XG4gICAgdGhpcy5wYWdlID0gcmVzdWx0Py5wYWdlID8/IHRoaXMucGFnZTtcbiAgICB0aGlzLmZldGNoID0gcmVzdWx0Py5mZXRjaCA/PyB0aGlzLmZldGNoO1xuICAgIHRoaXMuaXRlbXNDb3VudCA9IHJlc3VsdD8uaXRlbXNDb3VudCA/PyB0aGlzLml0ZW1zQ291bnQ7XG4gICAgaWYocmVzdWx0Lm9iamVjdHMgIT0gbnVsbCkgdGhpcy5lbGVtZW50X2xpc3QgPSByZXN1bHQub2JqZWN0cztcbiAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHQ7XG5cbiAgICB0aGlzLmdldF9wYWdlc19hcnJheSgpO1xuICB9XG5cbiAgcHVibGljIGdldChmaWx0ZXI/OiBULCBjYWxsYmFja0hhbmRsZXI/OmFueSxwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGxldCBxdWVyeSA9IHRoaXMuc2VyaWFsaXplX3F1ZXJ5KGZpbHRlcikrIChwYWdpbmF0aW9uID8gJyYnK3RoaXMuZ2V0X3BhZ2luYXRpb25fcXVlcnkoKTogJycpO1xuICAgIGNvbnNvbGUubG9nKHF1ZXJ5KTtcblxuICAgIHRoaXMueE1hbi5nZXQ8VD4odGhpcy5fZW5kcG9pbnQscXVlcnkpXG4gICAgLnRoZW4oKHJlc3VsdCk9PiB7IFxuICAgICAgdGhpcy5iaW5kX3Jlc3VsdHMocmVzdWx0KTtcbiAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgIGNhbGxiYWNrSGFuZGxlcihyZXN1bHQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcik9PiB0aGlzLnNob3dFcnJvcihlcnJvcikpXG4gICAgLmZpbmFsbHkoKCk9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsKGNhbGxiYWNrSGFuZGxlcj86YW55LHBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgbGV0IHBhZ2luYXRpb25fcXVlcnkgPSAocGFnaW5hdGlvbiA/IHRoaXMuZ2V0X3BhZ2luYXRpb25fcXVlcnkoKTogJycpO1xuXG4gICAgY29uc29sZS5sb2cocGFnaW5hdGlvbik7XG5cbiAgICB0aGlzLnhNYW4uZ2V0PFQ+KHRoaXMuX2VuZHBvaW50LCBwYWdpbmF0aW9uX3F1ZXJ5KVxuICAgIC50aGVuKChyZXN1bHQpPT4gIHsgXG4gICAgICB0aGlzLmJpbmRfcmVzdWx0cyhyZXN1bHQpO1xuICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSAgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBuZXh0KGZpbHRlcj86VCk6IHZvaWQge1xuICAgIHRoaXMucGFnZSArPSAxO1xuICAgIHRoaXMuZ2V0KGZpbHRlcix0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmV2aW91cyhmaWx0ZXI/OiBUKTogdm9pZCB7XG4gICAgaWYodGhpcy5wYWdlID4gMSkgdGhpcy5wYWdlIC09IDE7XG4gICAgdGhpcy5nZXQoZmlsdGVyLHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxzIGEgaHR0cCBnZXQgdG8gbm90IGNvbmZpZ3VyZWQgZW5kcG9pbnRcbiAgICpcbiAgICogQHBhcmFtIGVuZHBvaW50IGFub3RoZXIgZW5kcG9pbnRcbiAgICovXG4gIHB1YmxpYyBnZXRfYnlfZW5kcG9pbnQoZW5kcG9pbnQ6c3RyaW5nLGNhbGxiYWNrSGFuZGxlcj86YW55LHF1ZXJ5X3BhcmFtcz86YW55LHBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWR7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnNvbGUubG9nKHBhZ2luYXRpb24pO1xuXG4gICAgdGhpcy54TWFuLmdldDxUPihlbmRwb2ludCsocGFnaW5hdGlvbiA/IHRoaXMuZ2V0X3BhZ2luYXRpb25fcXVlcnkoKTogJycpKVxuICAgIC50aGVuKChyZXN1bHQpPT4gIHsgXG4gICAgICB0aGlzLmJpbmRfcmVzdWx0cyhyZXN1bHQpO1xuICAgICAgaWYoY2FsbGJhY2tIYW5kbGVyKSAgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIGZ1bmN0aW9uIGNhbGxzIGEgaHR0cCBwb3N0IGZyb20gYmVmb3JlIGNvbmZpZ3VyZWQgYXBpXG4gICAqXG4gICAqIEBwYXJhbSBib2R5ICBwYXJhbWV0ZXIgdGhhdCBzZW5kJ3MgYSBkaWZmZXJlbnQgY3VzdG9tIGJvZHlcbiAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciBAb3B0aW9uYWwgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHJlcXVlc3RzIGZpbmlzaFxuICAgKiBAcGFyYW0gbWVzc2FnZSBAb3B0aW9uYWwgc3RyaW5nIHRvIHNob3cgYWZ0ZXIgcmVxdWVzdHMgZmluaXNoXG4gICAqL1xuICBwdWJsaWMgcG9zdChib2R5OiBhbnksIGNhbGxiYWNrSGFuZGxlcj86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLnhNYW4ucG9zdDxULGFueT4odGhpcy5yZW1vdmVfcmVzb3VyY2UoYm9keSksdGhpcy5fZW5kcG9pbnQpXG4gICAgLnRoZW4oKHJlc3VsdCk9PntcbiAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdDtcbiAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIGZ1bmN0aW9uIGNhbGxzIGEgaHR0cCBwb3N0IGZyb20gYmVmb3JlIGNvbmZpZ3VyZWQgYXBpXG4gICAqXG4gICAqIEBwYXJhbSBib2R5IHBhcmFtZXRlciB0aGF0IHNlbmQncyBhIGN1c3RvbSBib2R5XG4gICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIgQG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiByZXF1ZXN0cyBmaW5pc2hcbiAgICogQHBhcmFtIG1lc3NhZ2UgQG9wdGlvbmFsIHN0cmluZyB0byBzaG93IGFmdGVyIHJlcXVlc3RzIGZpbmlzaFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZShib2R5OiBULCBjYWxsYmFja0hhbmRsZXI/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy54TWFuLnBvc3Q8VCxhbnk+KHRoaXMucmVtb3ZlX3Jlc291cmNlKGJvZHkpLHRoaXMuX2VuZHBvaW50KVxuICAgIC50aGVuKChyZXN1bHQpPT57XG4gICAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHQ7XG4gICAgICBpZihjYWxsYmFja0hhbmRsZXIpIGNhbGxiYWNrSGFuZGxlcihyZXN1bHQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcik9PiB0aGlzLnNob3dFcnJvcihlcnJvcikpXG4gICAgLmZpbmFsbHkoKCk9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogY2FsbCdzIGEgUHV0IG1ldGhvZCB0byB0aGUgdXJsIGJlZm9yZSBjb25maWd1cmVkXG4gICAqIEBwYXJhbSBib2R5IG9mIHJlcXVpc2l0aW9uIG9mIHJlcXVlc3RcbiAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciBmdW5jdGlvbiB0aGF0IGNhbGwncyBvbiByZXF1ZXN0J3MgZmluaXNoZWRcbiAgICogQHBhcmFtIG1lc3NhZ2UgQG9wdGlvbmFsIHN0cmluZyB0byBzaG93IGFmdGVyIHJlcXVlc3RzIGZpbmlzaFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZShib2R5OlQsY2FsbGJhY2tIYW5kbGVyPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnhNYW4ucHV0PGFueSwgVD4odGhpcy5yZW1vdmVfcmVzb3VyY2UoYm9keSksdGhpcy5fZW5kcG9pbnQpXG4gICAgLnRoZW4oKHJlc3VsdCk9PntcbiAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdDtcbiAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKT0+IHRoaXMuc2hvd0Vycm9yKGVycm9yKSlcbiAgICAuZmluYWxseSgoKT0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcbiAgfVxuLyoqXG4gKiBjYWxsJ3MgYSBQdXQgbWV0aG9kIHRvIHRoZSB1cmwgYmVmb3JlIGNvbmZpZ3VyZWRcbiAqIEBwYXJhbSBib2R5IG9mIHJlcXVpc2l0aW9uIG9mIHJlcXVlc3RcbiAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIgZnVuY3Rpb24gdGhhdCBjYWxsJ3Mgb24gcmVxdWVzdCdzIGZpbmlzaGVkXG4qIEBwYXJhbSBtZXNzYWdlIEBvcHRpb25hbCBzdHJpbmcgdG8gc2hvdyBhZnRlciByZXF1ZXN0cyBmaW5pc2ggXG4gKi9cbiAgcHVibGljIHB1dChib2R5OmFueSxjYWxsYmFja0hhbmRsZXI/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMueE1hbi5wdXQ8YW55LCBUPihib2R5LHRoaXMuX2VuZHBvaW50KVxuICAgIC50aGVuKChyZXN1bHQpPT57XG4gICAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHQ7XG4gICAgICBpZihjYWxsYmFja0hhbmRsZXIpIGNhbGxiYWNrSGFuZGxlcihyZXN1bHQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcik9PiB0aGlzLnNob3dFcnJvcihlcnJvcikpXG4gICAgLmZpbmFsbHkoKCk9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogY2FsbHMgaHR0cCBERUxFVEUgdG8gY29uZmlndXJlZCBlbmRwb2ludFxuICAgKlxuICAgKiBAcGFyYW0gaWQgSWQgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIgYSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgZGVsZXRlIGZ1bmN0aW9uIGFzIGRvbmVcbiAgICovXG4gIHB1YmxpYyBkZWxldGUoaWQ6bnVtYmVyLCBjYWxsYmFja0hhbmRsZXI/OiBhbnkpOiB2b2lke1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy54TWFuLmRlbGV0ZTxUPihpZCx0aGlzLl9lbmRwb2ludClcbiAgICAudGhlbigocmVzdWx0cyk9PiB7XG4gICAgICBpZihyZXN1bHRzLnRhcmdldCl7XG4gICAgICAgIGlmKGNhbGxiYWNrSGFuZGxlcikgY2FsbGJhY2tIYW5kbGVyKHJlc3VsdHMpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGFsZXJ0KFwiT2NvcnJldSB1bSBlcnJvIVwiKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3IpPT4gdGhpcy5zaG93RXJyb3IoZXJyb3IpKVxuICAgIC5maW5hbGx5KCgpPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCdzIEF1dGhlbnRpY2F0aW9uIGJlYXJlclxuICAgKiBAcGFyYW0gYXV0aCBzdHJpbmdzIGNvbnRhaW5pbmcgYXV0aGVudGljYXRpb24gYmVhcmVyXG4gICAqL1xuICBwdWJsaWMgc2V0X2F1dGgoYXV0aDogc3RyaW5nKTp2b2lkIHtcbiAgICB0aGlzLnhNYW4uc2V0X3Rva2VuKGF1dGgpO1xuICB9XG5cbiAgcHVibGljIGdldF9hdXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMueE1hbi5nZXRfdG9rZW4oKTtcbiAgfVxuICBwdWJsaWMgZ2V0X3BhZ2VzX2FycmF5KCk6IHZvaWQge1xuICAgIHRoaXMucGFnZV9hcnJheSA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgbGV0IHBhZ2VzQ291bnQgPSB0aGlzLml0ZW1zQ291bnQgLyB0aGlzLmZldGNoO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPD0gcGFnZXNDb3VudDsgaW5kZXgrKykge1xuICAgICAgdGhpcy5wYWdlX2FycmF5LnB1c2goaW5kZXgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0X3BhZ2luYXRpb25fcXVlcnkoKTogc3RyaW5ne1xuICAgIHJldHVybiBcImZldGNoPVwiK3RoaXMuZmV0Y2grXCImcGFnZT1cIit0aGlzLnBhZ2U7XG4gIH1cblxuICBwdWJsaWMgc2hvd19zdWNjZXNzKG1zZz86IHN0cmluZyk6IHZvaWQge1xuICAgIGFsZXJ0KG1zZyB8fCAnU2F2ZWQgd2l0aCBzdWNjZXNzJyk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0Vycm9yKGVycm9yOmFueSk6dm9pZHtcbiAgICBjb25zb2xlLmxvZyhcIioqKkFQSSBFUlJPUiBSRVBPUlQqKipcIik7XG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gIH1cblxuICBwdWJsaWMgbG9nb3V0KCk6dm9pZHtcbiAgICBTdG9yYWdlU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMueE1hbi5hdXRoID0gJyc7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZV9xdWVyeShvYmopIHtcbiAgICB2YXIgc3RyID0gW107XG4gICAgZm9yICh2YXIgcCBpbiBvYmope1xuICAgICAgaWYodHlwZW9mIG9ialtwXSA9PT0gJ29iamVjdCcpe1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmpbcF0pIHtcbiAgICAgICAgICBpZihwID09ICdyZXNvdXJjZScpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqW3BdLCBrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW3BdW2tleV07XG5cbiAgICAgICAgICAgIGlmKHRoaXMuc2VyaWFsaXplX3F1ZXJ5KG9ialtwXSkpXG4gICAgICAgICAgICAgIHN0ci5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChwKSArIFwiLlwiICsgdGhpcy5zZXJpYWxpemVfcXVlcnkob2JqW3BdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9ZWxzZSBpZiAob2JqLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgIGlmKGVuY29kZVVSSUNvbXBvbmVudChvYmpbcF0pKSBzdHIucHVzaChlbmNvZGVVUklDb21wb25lbnQocCkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChvYmpbcF0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJlc3VsdHMgPSBzdHIuam9pbihcIiZcIik7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICBwdWJsaWMgYXV0b19iaW5kKHJlc3VsdCx0YXJnZXQpIDogdm9pZCB7XG4gICAgZm9yICh2YXIgcCBpbiByZXN1bHQpe1xuICAgICAgaWYgKHRhcmdldC5oYXNPd25Qcm9wZXJ0eShwKSAmJiByZXN1bHQuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgdGFyZ2V0W3BdID0gcmVzdWx0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVfcmVzb3VyY2UodGFyZ2V0KSA6IGFueSB7XG4gICAgdGhpcy50YXJnZXQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRhcmdldCkpO1xuXG4gICAgZm9yICh2YXIgcCBpbiB0aGlzLnRhcmdldCl7XG4gICAgICBpZiAodGhpcy50YXJnZXQuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaWYocCA9PSAncmVzb3VyY2UnIHx8IHAgPT0gJ2VuZHBvaW50Jyl7XG4gICAgICAgICAgZGVsZXRlIHRoaXMudGFyZ2V0W3BdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRhcmdldDtcbiAgfVxuXG4gIHN0YXRpYyBub3JtYWxpemVTdHJpbmcodGV4dCl7XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1vDgcOAw4LDg10nLCdnaScpLCAnYScpO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cCgnW8OJw4jDil0nLCdnaScpLCAnZScpO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cCgnW8ONw4zDjl0nLCdnaScpLCAnaScpO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UobmV3IFJlZ0V4cCgnW8OTw5LDlMOVXScsJ2dpJyksICdvJyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKCdbw5rDmcObXScsJ2dpJyksICd1Jyk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKCdbw4ddJywnZ2knKSwgJ2MnKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9bXmEtejAtOSAtXS9nLCAnJyk7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cbiJdfQ==