UNPKG

@schoolbelle/common

Version:

Demo library to showcase Angular packaging format

314 lines (306 loc) 30.1 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@schoolbelle/common/tokens'), require('@angular/common/http'), require('@schoolbelle/common/services/group'), require('@schoolbelle/common/services/socket'), require('rxjs'), require('lodash')) : typeof define === 'function' && define.amd ? define('@schoolbelle/common/services/file', ['exports', '@angular/core', '@schoolbelle/common/tokens', '@angular/common/http', '@schoolbelle/common/services/group', '@schoolbelle/common/services/socket', 'rxjs', 'lodash'], factory) : (factory((global.schoolbelle = global.schoolbelle || {}, global.schoolbelle.common = global.schoolbelle.common || {}, global.schoolbelle.common.services = global.schoolbelle.common.services || {}, global.schoolbelle.common.services.file = {}),global.ng.core,global.schoolbelle.common.tokens,global.ng.common.http,global.schoolbelle.common.services.group,global.schoolbelle.common.services.socket,global.rxjs,null)); }(this, (function (exports,core,tokens,http,group,socket,rxjs,lodash) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var FileService = (function () { function FileService(http$$1, groupService, socketService, serverHost) { this.http = http$$1; this.groupService = groupService; this.socketService = socketService; this.serverHost = serverHost; this.uploadStatusChangeEvent = new rxjs.Subject(); this.uploadStatus = new Map(); } Object.defineProperty(FileService.prototype, "onUploadStatusChange", { get: /** * @return {?} */ function () { return this.uploadStatusChangeEvent.asObservable(); }, enumerable: true, configurable: true }); /** * @param {?} key * @param {?} data * @return {?} */ FileService.prototype.setUploadStatus = /** * @param {?} key * @param {?} data * @return {?} */ function (key, data) { this.uploadStatus.set(key, data); this.uploadStatusChangeEvent.next(this.caculatePercent()); }; /** * @param {?} key * @param {?} data * @return {?} */ FileService.prototype.updateUploadStatus = /** * @param {?} key * @param {?} data * @return {?} */ function (key, data) { var /** @type {?} */ found = this.uploadStatus.get(key); if (found) { Object.assign(found, data); this.uploadStatusChangeEvent.next(this.caculatePercent()); } }; /** * @return {?} */ FileService.prototype.caculatePercent = /** * @return {?} */ function () { var _this = this; var /** @type {?} */ perc = 0; this.uploadStatus.forEach(function (uploadState, key) { perc += (uploadState.upload * 0.5 + (typeof uploadState.process === 'undefined' ? 1 : uploadState.process) * 0.5) / _this.uploadStatus.size; }); return perc; }; /** * @param {?} file * @param {?} opts * @return {?} */ FileService.prototype.getUrl = /** * @param {?} file * @param {?} opts * @return {?} */ function (file, opts) { return this.http .post(this.serverHost + '/group/file/sign_url', { sign_for: 'upload', name: file.name, type: file.type, size: file.size, process: opts.process }, { headers: { Authorization: "Bearer " + this.groupService.token } }) .toPromise(); }; /** * @param {?} file * @param {?=} opts * @return {?} */ FileService.prototype.upload = /** * @param {?} file * @param {?=} opts * @return {?} */ function (file, opts) { var _this = this; if (opts === void 0) { opts = { process: false }; } return new Promise(function (resolve, reject) { _this.getUrl(file, opts) .then(function (data) { _this.setUploadStatus(data.file_id, { name: file.name, size: file.size, type: file.type, upload: 0, process: opts.process ? 0 : undefined }); _this.http .put(data.signedUrl, file, { reportProgress: true }) .subscribe(function (event) { console.log(event); // let perc = Math.round(progressEvent.loaded / progressEvent.total * 100); // let info = this.uploadStatus.get(data.file_id); // if (info) info.upload = perc; // observer.next(perc); }, reject, function () { _this.updateUploadStatus(data.file_id, { upload: 100 }); if (opts.process === true) _this.observeProgress(data.file_id).subscribe(null, reject, function () { return resolve(data.file_id); }); else resolve(data.file_id); }); }) .catch(reject); }).then(function (sbe_file_id) { return _this.register(sbe_file_id); }); }; /** * @param {?} sbe_file_id * @return {?} */ FileService.prototype.register = /** * @param {?} sbe_file_id * @return {?} */ function (sbe_file_id) { return this.http .post(this.serverHost + '/group/file/register', { file_id: sbe_file_id }, { headers: { Authorization: "Bearer " + this.groupService.token } }) .toPromise(); // .then(response=>response.json()); }; /** * @param {?} file_id * @return {?} */ FileService.prototype.observeProgress = /** * @param {?} file_id * @return {?} */ function (file_id) { var _this = this; return new rxjs.Observable(function (observer) { var /** @type {?} */ uploadStatus = _this.uploadStatus.get(file_id); var /** @type {?} */ process = uploadStatus ? uploadStatus.process : undefined; if (process === undefined) observer.error('no processing found'); else if (process === 100) observer.complete(); else { _this.socketService.listen('f' + file_id); var /** @type {?} */ subscription_1 = _this.socketService .getObservable('f' + file_id) .subscribe(function (event) { var /** @type {?} */ data = event.data; if (data.match(/download \d+/)) process = Math.round(FileService.Weights.download * parseInt(data.replace(/\D/g, ''))); else if (data.match(/convert.low \d+/)) process = Math.round(FileService.Weights.download * 100 + FileService.Weights.convert * parseInt(data.replace(/\D/g, ''))); else if (data.match(/upload.low \d+/)) process = Math.round((FileService.Weights.download + FileService.Weights.convert) * 100 + FileService.Weights.upload * parseInt(data.replace(/\D/g, ''))); _this.updateUploadStatus(file_id, { process: process }); if (process === 100 || data.match('job is done')) { observer.complete(); _this.socketService.unlisten('f' + file_id); subscription_1.unsubscribe(); } else if (data.match('timeout')) { observer.error('timeout'); subscription_1.unsubscribe(); } else { observer.next(process); } }); } }); }; /** * @param {?} letterFiles * @param {?=} process * @return {?} */ FileService.prototype.multipleUpload = /** * @param {?} letterFiles * @param {?=} process * @return {?} */ function (letterFiles, process) { var _this = this; if (process === void 0) { process = true; } this.uploadStatus.clear(); if (process) this.socketService.connect(true); var /** @type {?} */ promises = []; lodash.forEach(letterFiles, function (file, index) { if (file instanceof File) { promises.push(_this.upload(file, { process: process }).then(function (fileInfo) { letterFiles.splice(index, 1, fileInfo); })); } }); return Promise.all(promises).then(function () { return (letterFiles); }); }; /** * @param {?} uri * @param {?} name * @return {?} */ FileService.prototype.download = /** * @param {?} uri * @param {?} name * @return {?} */ function (uri, name) { }; FileService.Weights = { download: 0.1, convert: 0.8, upload: 0.1 }; FileService.decorators = [ { type: core.Injectable }, ]; /** @nocollapse */ FileService.ctorParameters = function () { return [ { type: http.HttpClient, }, { type: group.GroupService, }, { type: socket.SocketService, }, { type: undefined, decorators: [{ type: core.Inject, args: [tokens.REST_SERVER_HOST,] },] }, ]; }; return FileService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var FileServiceModule = (function () { function FileServiceModule() { } /** * @return {?} */ FileServiceModule.forRoot = /** * @return {?} */ function () { return { ngModule: FileServiceModule, providers: [FileService] }; }; FileServiceModule.decorators = [ { type: core.NgModule, args: [{ imports: [http.HttpClientModule] },] }, ]; return FileServiceModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ exports.FileService = FileService; exports.FileServiceModule = FileServiceModule; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29sYmVsbGUtY29tbW9uLXNlcnZpY2VzLWZpbGUudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9Ac2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL2ZpbGUvZmlsZS5zZXJ2aWNlLnRzIiwibmc6Ly9Ac2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL2ZpbGUvZmlsZS1zZXJ2aWNlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJFU1RfU0VSVkVSX0hPU1QgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3Rva2Vucyc7XG5cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBHcm91cFNlcnZpY2UgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL2dyb3VwJztcbmltcG9ydCB7IFNvY2tldFNlcnZpY2UgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL3NvY2tldCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZvckVhY2ggfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBVcGxvYWRTdGF0dXMgfSBmcm9tICcuL3VwbG9hZC1zdGF0dXMudHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUluZm9JbnRlcmZhY2Uge1xuICBmaWxlX2lkOiBudW1iZXI7XG4gIHVybDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICBkb3duc2FtcGxlZDogc3RyaW5nO1xuICB0aHVtYm5haWw6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpbGVTZXJ2aWNlIHtcbiAgc3RhdGljIFdlaWdodHMgPSB7XG4gICAgZG93bmxvYWQ6IDAuMSxcbiAgICBjb252ZXJ0OiAwLjgsXG4gICAgdXBsb2FkOiAwLjFcbiAgfTtcbiAgcHJpdmF0ZSB1cGxvYWRTdGF0dXNDaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0KCk7XG4gIGdldCBvblVwbG9hZFN0YXR1c0NoYW5nZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHB1YmxpYyB1cGxvYWRTdGF0dXM6IE1hcDxudW1iZXIsIFVwbG9hZFN0YXR1cz4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHVibGljIGdyb3VwU2VydmljZTogR3JvdXBTZXJ2aWNlLFxuICAgIHB1YmxpYyBzb2NrZXRTZXJ2aWNlOiBTb2NrZXRTZXJ2aWNlLFxuICAgIEBJbmplY3QoUkVTVF9TRVJWRVJfSE9TVCkgcHJpdmF0ZSBzZXJ2ZXJIb3N0OiBzdHJpbmdcbiAgKSB7fVxuICBwcml2YXRlIHNldFVwbG9hZFN0YXR1cyhrZXk6IGFueSwgZGF0YTogVXBsb2FkU3RhdHVzKSB7XG4gICAgdGhpcy51cGxvYWRTdGF0dXMuc2V0KGtleSwgZGF0YSk7XG4gICAgdGhpcy51cGxvYWRTdGF0dXNDaGFuZ2VFdmVudC5uZXh0KHRoaXMuY2FjdWxhdGVQZXJjZW50KCkpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlVXBsb2FkU3RhdHVzKGtleTogYW55LCBkYXRhOiBQYXJ0aWFsPFVwbG9hZFN0YXR1cz4pIHtcbiAgICBsZXQgZm91bmQgPSB0aGlzLnVwbG9hZFN0YXR1cy5nZXQoa2V5KTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZm91bmQsIGRhdGEpO1xuICAgICAgdGhpcy51cGxvYWRTdGF0dXNDaGFuZ2VFdmVudC5uZXh0KHRoaXMuY2FjdWxhdGVQZXJjZW50KCkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNhY3VsYXRlUGVyY2VudCgpIHtcbiAgICBsZXQgcGVyYyA9IDA7XG4gICAgdGhpcy51cGxvYWRTdGF0dXMuZm9yRWFjaCgodXBsb2FkU3RhdGUsIGtleSkgPT4ge1xuICAgICAgcGVyYyArPVxuICAgICAgICAodXBsb2FkU3RhdGUudXBsb2FkICogMC41ICtcbiAgICAgICAgICAodHlwZW9mIHVwbG9hZFN0YXRlLnByb2Nlc3MgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogdXBsb2FkU3RhdGUucHJvY2VzcykgKlxuICAgICAgICAgICAgMC41KSAvXG4gICAgICAgIHRoaXMudXBsb2FkU3RhdHVzLnNpemU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBlcmM7XG4gIH1cbiAgcHVibGljIGdldFVybChmaWxlOiBGaWxlLCBvcHRzOiB7IHByb2Nlc3M6IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KFxuICAgICAgICB0aGlzLnNlcnZlckhvc3QgKyAnL2dyb3VwL2ZpbGUvc2lnbl91cmwnLFxuICAgICAgICB7XG4gICAgICAgICAgc2lnbl9mb3I6ICd1cGxvYWQnLFxuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIHByb2Nlc3M6IG9wdHMucHJvY2Vzc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5ncm91cFNlcnZpY2UudG9rZW59YCB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuICBwdWJsaWMgdXBsb2FkKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb3B0czogeyBwcm9jZXNzOiBib29sZWFuIH0gPSB7IHByb2Nlc3M6IGZhbHNlIH1cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZXRVcmwoZmlsZSwgb3B0cylcbiAgICAgICAgLnRoZW4oKGRhdGE6IHsgZmlsZV9pZDogbnVtYmVyOyBzaWduZWRVcmw6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRVcGxvYWRTdGF0dXMoZGF0YS5maWxlX2lkLCB7XG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICB1cGxvYWQ6IDAsXG4gICAgICAgICAgICBwcm9jZXNzOiBvcHRzLnByb2Nlc3MgPyAwIDogdW5kZWZpbmVkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucHV0KGRhdGEuc2lnbmVkVXJsLCBmaWxlLCB7IHJlcG9ydFByb2dyZXNzOiB0cnVlIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBwZXJjID0gTWF0aC5yb3VuZChwcm9ncmVzc0V2ZW50LmxvYWRlZCAvIHByb2dyZXNzRXZlbnQudG90YWwgKiAxMDApO1xuICAgICAgICAgICAgICAgIC8vIGxldCBpbmZvID0gdGhpcy51cGxvYWRTdGF0dXMuZ2V0KGRhdGEuZmlsZV9pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGluZm8pIGluZm8udXBsb2FkID0gcGVyYztcbiAgICAgICAgICAgICAgICAvLyBvYnNlcnZlci5uZXh0KHBlcmMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cyhkYXRhLmZpbGVfaWQsIHsgdXBsb2FkOiAxMDAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucHJvY2VzcyA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZVByb2dyZXNzKGRhdGEuZmlsZV9pZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHJlc29sdmUoZGF0YS5maWxlX2lkKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBlbHNlIHJlc29sdmUoZGF0YS5maWxlX2lkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSkudGhlbigoc2JlX2ZpbGVfaWQ6IG51bWJlcikgPT4gdGhpcy5yZWdpc3RlcihzYmVfZmlsZV9pZCkpO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlcihzYmVfZmlsZV9pZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIHRoaXMuc2VydmVySG9zdCArICcvZ3JvdXAvZmlsZS9yZWdpc3RlcicsXG4gICAgICAgIHsgZmlsZV9pZDogc2JlX2ZpbGVfaWQgfSxcbiAgICAgICAgeyBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmdyb3VwU2VydmljZS50b2tlbn1gIH0gfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIC8vIC50aGVuKHJlc3BvbnNlPT5yZXNwb25zZS5qc29uKCkpO1xuICB9XG4gIHByaXZhdGUgb2JzZXJ2ZVByb2dyZXNzKGZpbGVfaWQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgdXBsb2FkU3RhdHVzOiBVcGxvYWRTdGF0dXMgPSB0aGlzLnVwbG9hZFN0YXR1cy5nZXQoZmlsZV9pZCk7XG4gICAgICBsZXQgcHJvY2VzcyA9IHVwbG9hZFN0YXR1cyA/IHVwbG9hZFN0YXR1cy5wcm9jZXNzIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHByb2Nlc3MgPT09IHVuZGVmaW5lZCkgb2JzZXJ2ZXIuZXJyb3IoJ25vIHByb2Nlc3NpbmcgZm91bmQnKTtcbiAgICAgIGVsc2UgaWYgKHByb2Nlc3MgPT09IDEwMCkgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldFNlcnZpY2UubGlzdGVuKCdmJyArIGZpbGVfaWQpO1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5zb2NrZXRTZXJ2aWNlXG4gICAgICAgICAgLmdldE9ic2VydmFibGUoJ2YnICsgZmlsZV9pZClcbiAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhLm1hdGNoKC9kb3dubG9hZCBcXGQrLykpXG4gICAgICAgICAgICAgIHByb2Nlc3MgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIEZpbGVTZXJ2aWNlLldlaWdodHMuZG93bmxvYWQgKiBwYXJzZUludChkYXRhLnJlcGxhY2UoL1xcRC9nLCAnJykpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLm1hdGNoKC9jb252ZXJ0LmxvdyBcXGQrLykpXG4gICAgICAgICAgICAgIHByb2Nlc3MgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIEZpbGVTZXJ2aWNlLldlaWdodHMuZG93bmxvYWQgKiAxMDAgK1xuICAgICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy5jb252ZXJ0ICpcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoZGF0YS5yZXBsYWNlKC9cXEQvZywgJycpKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YS5tYXRjaCgvdXBsb2FkLmxvdyBcXGQrLykpXG4gICAgICAgICAgICAgIHByb2Nlc3MgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIChGaWxlU2VydmljZS5XZWlnaHRzLmRvd25sb2FkICsgRmlsZVNlcnZpY2UuV2VpZ2h0cy5jb252ZXJ0KSAqXG4gICAgICAgICAgICAgICAgICAxMDAgK1xuICAgICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy51cGxvYWQgKiBwYXJzZUludChkYXRhLnJlcGxhY2UoL1xcRC9nLCAnJykpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKGZpbGVfaWQsIHsgcHJvY2VzczogcHJvY2VzcyB9KTtcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MgPT09IDEwMCB8fCBkYXRhLm1hdGNoKCdqb2IgaXMgZG9uZScpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIHRoaXMuc29ja2V0U2VydmljZS51bmxpc3RlbignZicgKyBmaWxlX2lkKTtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEubWF0Y2goJ3RpbWVvdXQnKSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcigndGltZW91dCcpO1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocHJvY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG11bHRpcGxlVXBsb2FkKFxuICAgIGxldHRlckZpbGVzOiBBcnJheTxGaWxlIHwgRmlsZUluZm9JbnRlcmZhY2U+LFxuICAgIHByb2Nlc3M6IGJvb2xlYW4gPSB0cnVlXG4gICAgLy8gbGlzdDogeyBmaWxlOiBGaWxlOyBwcmlvcml0eTogbnVtYmVyOyBwcm9jZXNzPzogYm9vbGVhbiB9W11cbiAgKTogUHJvbWlzZTxGaWxlSW5mb0ludGVyZmFjZVtdPiB7XG4gICAgdGhpcy51cGxvYWRTdGF0dXMuY2xlYXIoKTtcbiAgICBpZiAocHJvY2VzcykgdGhpcy5zb2NrZXRTZXJ2aWNlLmNvbm5lY3QodHJ1ZSk7XG4gICAgbGV0IHByb21pc2VzID0gW107XG4gICAgZm9yRWFjaChsZXR0ZXJGaWxlcywgKGZpbGUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICB0aGlzLnVwbG9hZChmaWxlLCB7IHByb2Nlc3M6IHByb2Nlc3MgfSkudGhlbihcbiAgICAgICAgICAgIChmaWxlSW5mbzogRmlsZUluZm9JbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICAgICAgbGV0dGVyRmlsZXMuc3BsaWNlKGluZGV4LCAxLCBmaWxlSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBsZXR0ZXJGaWxlcyBhcyBGaWxlSW5mb0ludGVyZmFjZVtdKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZCh1cmksIG5hbWUpIHt9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBGaWxlU2VydmljZSB9IGZyb20gJy4vZmlsZS5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVTZXJ2aWNlTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBGaWxlU2VydmljZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW0ZpbGVTZXJ2aWNlXVxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJodHRwIiwiU3ViamVjdCIsIk9ic2VydmFibGUiLCJmb3JFYWNoIiwiSW5qZWN0YWJsZSIsIkh0dHBDbGllbnQiLCJHcm91cFNlcnZpY2UiLCJTb2NrZXRTZXJ2aWNlIiwiSW5qZWN0IiwiUkVTVF9TRVJWRVJfSE9TVCIsIk5nTW9kdWxlIiwiSHR0cENsaWVudE1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBb0NFLHFCQUNTQSxTQUNBLGNBQ0EsZUFDMkI7WUFIM0IsU0FBSSxHQUFKQSxPQUFJO1lBQ0osaUJBQVksR0FBWixZQUFZO1lBQ1osa0JBQWEsR0FBYixhQUFhO1lBQ2MsZUFBVSxHQUFWLFVBQVU7MkNBVlosSUFBSUMsWUFBTyxFQUFFO2dDQUlFLElBQUksR0FBRyxFQUFFO1NBT3REO1FBVkosc0JBQUksNkNBQW9COzs7Z0JBQXhCO2dCQUNFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3BEOzs7V0FBQTs7Ozs7O1FBU08scUNBQWU7Ozs7O3NCQUFDLEdBQVEsRUFBRSxJQUFrQjtnQkFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7O1FBRXBELHdDQUFrQjs7Ozs7c0JBQUMsR0FBUSxFQUFFLElBQTJCO2dC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