ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
246 lines • 30.5 kB
JavaScript
import { Codes } from '../../../util/codes';
export class OFileUploader {
constructor(service, entity) {
this.service = service;
this.files = [];
this.isUploading = false;
this.progress = 0;
this.nextIndex = 0;
this.splitUpload = true;
this.entity = entity;
}
addFile(fileItem) {
this.files.push(fileItem);
this.progress = this._getTotalProgress();
}
clear() {
this.cancel();
while (this.files.length) {
this.files[0].remove();
}
this.progress = 0;
}
removeFile(value) {
const index = this.getIndexOfItem(value);
const item = this.files[index];
if (item) {
if (item.isUploading) {
item.cancel();
}
this.files.splice(index, 1);
this.progress = this._getTotalProgress();
}
}
upload() {
this.files.forEach((item) => {
if (item.pendingUpload) {
item.prepareToUpload();
}
});
if (this.splitUpload) {
this.files.forEach((item) => {
if (item.pendingUpload) {
this.uploadItem(item);
}
});
}
else {
this.uploadItems(this.files);
}
}
uploadItem(item) {
item.prepareToUpload();
if (this.isUploading || item.isUploading) {
return;
}
this.isUploading = true;
item.isUploading = true;
this._onBeforeUploadItem(item);
if (this.service === undefined) {
console.warn('No service configured! aborting upload');
return;
}
if (this._uploadSuscription) {
this._uploadSuscription.unsubscribe();
}
const self = this;
this._uploadSuscription = item._uploadSuscription = this.service.upload([item], this.entity, this.data).subscribe(resp => {
if (resp.loaded && resp.total) {
const progress = Math.round(resp.loaded * 100 / resp.total);
self._onProgressItem(item, progress);
}
else if (resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE) {
self._onSuccessItem(item, resp);
}
else {
console.error('uploadItem error');
self._onErrorItem(item, 'Unknow error');
}
}, err => self._onErrorItem(item, err), () => self._onCompleteItem(item));
}
uploadItems(items) {
if (this.isUploading || items.some(item => item.isUploading)) {
return;
}
this.isUploading = true;
this._onBeforeUploadAll();
if (this.service === undefined) {
console.warn('No service configured! aborting upload');
return;
}
if (this._uploadSuscription) {
this._uploadSuscription.unsubscribe();
}
const self = this;
this._uploadSuscription = this.service.upload(items, this.entity, this.data).subscribe(resp => {
if (resp.loaded && resp.total) {
const progress = Math.round(resp.loaded * 100 / resp.total);
self._onProgressAll(progress);
}
else if (resp.code === Codes.ONTIMIZE_SUCCESSFUL_CODE) {
self._onSuccessAll(resp);
}
else {
console.error('uploadItems error');
}
}, err => self._onErrorAll(err), () => self._onCompleteAll());
}
cancel() {
if (this.splitUpload) {
this.files.forEach(item => item.cancel());
}
else {
if (this._uploadSuscription) {
this._uploadSuscription.unsubscribe();
}
this._onCancelAll();
this._onCompleteAll();
}
}
cancelItem(value) {
const index = this.getIndexOfItem(value);
const item = this.files[index];
if (item && item.isUploading && this.splitUpload) {
item._uploadSuscription.unsubscribe();
}
this._onCancelItem(item);
this._onCompleteItem(item);
}
getNotUploadedItems() {
return this.files.filter((item) => !item.isUploaded);
}
getIndexOfItem(value) {
return typeof value === 'number' ? value : this.files.indexOf(value);
}
onBeforeUploadItem(fileItem) {
return { fileItem };
}
onBeforeUploadAll() {
return {};
}
onProgressItem(fileItem, progress) {
return { fileItem, progress };
}
onProgressAll(progress) {
return { progress };
}
onCancelItem(fileItem) {
return { fileItem };
}
onCancelAll() {
return {};
}
onSuccessItem(fileItem, response) {
return { fileItem, response };
}
onSuccessAll(response) {
return { response };
}
onErrorItem(fileItem, error) {
return { fileItem, error };
}
onErrorAll(error) {
return { error };
}
onCompleteItem(fileItem) {
return { fileItem };
}
onCompleteAll() {
return void 0;
}
_onBeforeUploadItem(item) {
item._onBeforeUpload();
this.onBeforeUploadItem(item);
}
_onBeforeUploadAll() {
this.files.forEach(item => item._onBeforeUpload(false));
this.onBeforeUploadAll();
}
_onProgressItem(item, progress) {
const total = this._getTotalProgress(progress);
this.progress = total;
item._onProgress(progress);
this.onProgressItem(item, progress);
this.onProgressAll(total);
}
_onProgressAll(progress) {
const total = this._getTotalProgress(progress);
this.progress = total;
this.onProgressAll(total);
}
_onSuccessItem(item, response) {
item._onSuccess(response);
this.onSuccessItem(item, response);
}
_onSuccessAll(response) {
this.files.forEach(item => item._onSuccess(response, false));
this.onSuccessAll(response);
}
_onErrorItem(item, error) {
item._onError(error);
this.onErrorItem(item, error);
}
_onErrorAll(error) {
this.files.forEach(item => item._onError(error, false));
this.onErrorAll(error);
}
_onCancelItem(item) {
item._onCancel();
this.onCancelItem(item);
}
_onCancelAll() {
this.files.forEach(item => item._onCancel(false));
this.onCancelAll();
}
_onCompleteItem(item) {
item._onComplete();
this.onCompleteItem(item);
const nextItem = this._getReadyItems()[0];
this.isUploading = false;
if (nextItem) {
nextItem.upload();
return;
}
this.onCompleteAll();
this.progress = this._getTotalProgress();
}
_onCompleteAll() {
this.files.forEach(item => item._onComplete(false));
this.isUploading = false;
this.onCompleteAll();
this.progress = this._getTotalProgress();
}
_getReadyItems() {
return this.files
.filter((item) => (item.isReady && !item.isUploading))
.sort((item1, item2) => item1.index - item2.index);
}
_getTotalProgress(value = 0) {
const notUploaded = this.getNotUploadedItems().length;
const uploaded = notUploaded ? this.files.length - notUploaded : this.files.length;
const ratio = this.splitUpload ? 100 / this.files.length : 100;
const current = value * ratio / 100;
return Math.round(uploaded * ratio + current);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1maWxlLXVwbG9hZGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZmlsZS1pbnB1dC9vLWZpbGUtdXBsb2FkZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzVDLE1BQU0sT0FBTyxhQUFhO0lBWXhCLFlBQ1ksT0FBcUIsRUFDL0IsTUFBYztRQURKLFlBQU8sR0FBUCxPQUFPLENBQWM7UUFWMUIsVUFBSyxHQUFnQixFQUFFLENBQUM7UUFDeEIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBU2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxPQUFPLENBQUMsUUFBbUI7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBS0QsS0FBSztRQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFNRCxVQUFVLENBQUMsS0FBVTtRQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFD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LENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElGaWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZmlsZS1zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgT0ZpbGVJdGVtIH0gZnJvbSAnLi9vLWZpbGUtaXRlbS5jbGFzcyc7XG5cbmV4cG9ydCBjbGFzcyBPRmlsZVVwbG9hZGVyIHtcblxuICBwdWJsaWMgZW50aXR5OiBzdHJpbmc7XG4gIHB1YmxpYyBmaWxlczogT0ZpbGVJdGVtW10gPSBbXTtcbiAgcHVibGljIGlzVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBwcm9ncmVzczogbnVtYmVyID0gMDtcbiAgcHVibGljIG5leHRJbmRleDogbnVtYmVyID0gMDtcbiAgcHVibGljIHNwbGl0VXBsb2FkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGRhdGE6IG9iamVjdDtcblxuICBwcm90ZWN0ZWQgX3VwbG9hZFN1c2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNlcnZpY2U6IElGaWxlU2VydmljZSxcbiAgICBlbnRpdHk6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLmVudGl0eSA9IGVudGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRGaWxlKGZpbGVJdGVtOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUl0ZW0pO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgdXBsb2FkIG9mIGFsbCBmaWxlcyBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZmlsZSBsaXN0LlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWwoKTtcbiAgICB3aGlsZSAodGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsZXNbMF0ucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBmaWxlIGZyb20gdGhlIGZpbGUgbGlzdCwgaXQgY2FuY2VscyB1cGxvYWQgaWYgbmVlZGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpbGUgdG8gcmVtb3ZlXG4gICAqL1xuICByZW1vdmVGaWxlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhPZkl0ZW0odmFsdWUpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZpbGVzW2luZGV4XTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgaWYgKGl0ZW0uaXNVcGxvYWRpbmcpIHtcbiAgICAgICAgaXRlbS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goKGl0ZW06IE9GaWxlSXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0ucGVuZGluZ1VwbG9hZCkge1xuICAgICAgICBpdGVtLnByZXBhcmVUb1VwbG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNwbGl0VXBsb2FkKSB7XG4gICAgICB0aGlzLmZpbGVzLmZvckVhY2goKGl0ZW06IE9GaWxlSXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5wZW5kaW5nVXBsb2FkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRJdGVtKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGxvYWRJdGVtcyh0aGlzLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkcyBhIHNpbmdsZSBmaWxlIG9uIGEgc2luZ2xlIHJlcXVlc3QuXG4gICAqIEBwYXJhbSBpdGVtIHRoZSBmaWxlIHRvIHVwbG9hZFxuICAgKi9cbiAgcHVibGljIHVwbG9hZEl0ZW0oaXRlbTogT0ZpbGVJdGVtKTogdm9pZCB7XG4gICAgaXRlbS5wcmVwYXJlVG9VcGxvYWQoKTtcbiAgICBpZiAodGhpcy5pc1VwbG9hZGluZyB8fCBpdGVtLmlzVXBsb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNVcGxvYWRpbmcgPSB0cnVlO1xuICAgIGl0ZW0uaXNVcGxvYWRpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5fb25CZWZvcmVVcGxvYWRJdGVtKGl0ZW0pO1xuXG4gICAgaWYgKHRoaXMuc2VydmljZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIHNlcnZpY2UgY29uZmlndXJlZCEgYWJvcnRpbmcgdXBsb2FkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl91cGxvYWRTdXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fdXBsb2FkU3VzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLl91cGxvYWRTdXNjcmlwdGlvbiA9IGl0ZW0uX3VwbG9hZFN1c2NyaXB0aW9uID0gdGhpcy5zZXJ2aWNlLnVwbG9hZChbaXRlbV0sIHRoaXMuZW50aXR5LCB0aGlzLmRhdGEpLnN1YnNjcmliZShcbiAgICAgIHJlc3AgPT4ge1xuICAgICAgICBpZiAocmVzcC5sb2FkZWQgJiYgcmVzcC50b3RhbCkge1xuICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5yb3VuZChyZXNwLmxvYWRlZCAqIDEwMCAvIHJlc3AudG90YWwpO1xuICAgICAgICAgIHNlbGYuX29uUHJvZ3Jlc3NJdGVtKGl0ZW0sIHByb2dyZXNzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwLmNvZGUgPT09IENvZGVzLk9OVElNSVpFX1NVQ0NFU1NGVUxfQ09ERSkge1xuICAgICAgICAgIHNlbGYuX29uU3VjY2Vzc0l0ZW0oaXRlbSwgcmVzcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndXBsb2FkSXRlbSBlcnJvcicpO1xuICAgICAgICAgIHNlbGYuX29uRXJyb3JJdGVtKGl0ZW0sICdVbmtub3cgZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVyciA9PiBzZWxmLl9vbkVycm9ySXRlbShpdGVtLCBlcnIpLFxuICAgICAgKCkgPT4gc2VsZi5fb25Db21wbGV0ZUl0ZW0oaXRlbSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhIHNldCBvZiBmaWxlcyBvbiBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gaXRlbXMgdGhlIGFycmF5IG9mIGZpbGVzIHRvIHVwbG9hZFxuICAgKi9cbiAgcHVibGljIHVwbG9hZEl0ZW1zKGl0ZW1zOiBPRmlsZUl0ZW1bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nIHx8IGl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLmlzVXBsb2FkaW5nKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVXBsb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuX29uQmVmb3JlVXBsb2FkQWxsKCk7XG5cbiAgICBpZiAodGhpcy5zZXJ2aWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gc2VydmljZSBjb25maWd1cmVkISBhYm9ydGluZyB1cGxvYWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VwbG9hZFN1c2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl91cGxvYWRTdXNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3VwbG9hZFN1c2NyaXB0aW9uID0gdGhpcy5zZXJ2aWNlLnVwbG9hZChpdGVtcywgdGhpcy5lbnRpdHksIHRoaXMuZGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgaWYgKHJlc3AubG9hZGVkICYmIHJlc3AudG90YWwpIHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKHJlc3AubG9hZGVkICogMTAwIC8gcmVzcC50b3RhbCk7XG4gICAgICAgIHNlbGYuX29uUHJvZ3Jlc3NBbGwocHJvZ3Jlc3MpO1xuICAgICAgfSBlbHNlIGlmIChyZXNwLmNvZGUgPT09IENvZGVzLk9OVElNSVpFX1NVQ0NFU1NGVUxfQ09ERSkge1xuICAgICAgICBzZWxmLl9vblN1Y2Nlc3NBbGwocmVzcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1cGxvYWRJdGVtcyBlcnJvcicpO1xuICAgICAgfVxuICAgIH0sXG4gICAgICBlcnIgPT4gc2VsZi5fb25FcnJvckFsbChlcnIpLFxuICAgICAgKCkgPT4gc2VsZi5fb25Db21wbGV0ZUFsbCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSB1cGxvYWQgb2YgYWxsIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zcGxpdFVwbG9hZCkge1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5jYW5jZWwoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl91cGxvYWRTdXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLl91cGxvYWRTdXNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fb25DYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMuX29uQ29tcGxldGVBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyB0aGUgdGhlIGZpbGUgdXBsb2FkLlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpbGUgdG8gY2FuY2VsIGl0cyB1cGxvYWRcbiAgICovXG4gIHB1YmxpYyBjYW5jZWxJdGVtKHZhbHVlOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0SW5kZXhPZkl0ZW0odmFsdWUpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZpbGVzW2luZGV4XTtcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmlzVXBsb2FkaW5nICYmIHRoaXMuc3BsaXRVcGxvYWQpIHtcbiAgICAgIGl0ZW0uX3VwbG9hZFN1c2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuX29uQ2FuY2VsSXRlbShpdGVtKTtcbiAgICB0aGlzLl9vbkNvbXBsZXRlSXRlbShpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROb3RVcGxvYWRlZEl0ZW1zKCk6IE9GaWxlSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5maWxlcy5maWx0ZXIoKGl0ZW06IE9GaWxlSXRlbSkgPT4gIWl0ZW0uaXNVcGxvYWRlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SW5kZXhPZkl0ZW0odmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHRoaXMuZmlsZXMuaW5kZXhPZih2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25CZWZvcmVVcGxvYWRJdGVtKGZpbGVJdGVtOiBPRmlsZUl0ZW0pOiBhbnkge1xuICAgIHJldHVybiB7IGZpbGVJdGVtIH07XG4gIH1cblxuICBwdWJsaWMgb25CZWZvcmVVcGxvYWRBbGwoKTogYW55IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgb25Qcm9ncmVzc0l0ZW0oZmlsZUl0ZW06IE9GaWxlSXRlbSwgcHJvZ3Jlc3M6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHsgZmlsZUl0ZW0sIHByb2dyZXNzIH07XG4gIH1cblxuICBwdWJsaWMgb25Qcm9ncmVzc0FsbChwcm9ncmVzczogYW55KTogYW55IHtcbiAgICByZXR1cm4geyBwcm9ncmVzcyB9O1xuICB9XG5cbiAgcHVibGljIG9uQ2FuY2VsSXRlbShmaWxlSXRlbTogT0ZpbGVJdGVtKTogYW55IHtcbiAgICByZXR1cm4geyBmaWxlSXRlbSB9O1xuICB9XG5cbiAgcHVibGljIG9uQ2FuY2VsQWxsKCk6IGFueSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIG9uU3VjY2Vzc0l0ZW0oZmlsZUl0ZW06IE9GaWxlSXRlbSwgcmVzcG9uc2U6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHsgZmlsZUl0ZW0sIHJlc3BvbnNlIH07XG4gIH1cblxuICBwdWJsaWMgb25TdWNjZXNzQWxsKHJlc3BvbnNlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB7IHJlc3BvbnNlIH07XG4gIH1cblxuICBwdWJsaWMgb25FcnJvckl0ZW0oZmlsZUl0ZW06IE9GaWxlSXRlbSwgZXJyb3I6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHsgZmlsZUl0ZW0sIGVycm9yIH07XG4gIH1cblxuICBwdWJsaWMgb25FcnJvckFsbChlcnJvcjogYW55KTogYW55IHtcbiAgICByZXR1cm4geyBlcnJvciB9O1xuICB9XG5cbiAgcHVibGljIG9uQ29tcGxldGVJdGVtKGZpbGVJdGVtOiBPRmlsZUl0ZW0pOiBhbnkge1xuICAgIHJldHVybiB7IGZpbGVJdGVtIH07XG4gIH1cblxuICBwdWJsaWMgb25Db21wbGV0ZUFsbCgpOiBhbnkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uQmVmb3JlVXBsb2FkSXRlbShpdGVtOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLl9vbkJlZm9yZVVwbG9hZCgpO1xuICAgIHRoaXMub25CZWZvcmVVcGxvYWRJdGVtKGl0ZW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkJlZm9yZVVwbG9hZEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goaXRlbSA9PiBpdGVtLl9vbkJlZm9yZVVwbG9hZChmYWxzZSkpO1xuICAgIHRoaXMub25CZWZvcmVVcGxvYWRBbGwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25Qcm9ncmVzc0l0ZW0oaXRlbTogT0ZpbGVJdGVtLCBwcm9ncmVzczogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKHByb2dyZXNzKTtcbiAgICB0aGlzLnByb2dyZXNzID0gdG90YWw7XG4gICAgaXRlbS5fb25Qcm9ncmVzcyhwcm9ncmVzcyk7XG4gICAgdGhpcy5vblByb2dyZXNzSXRlbShpdGVtLCBwcm9ncmVzcyk7XG4gICAgdGhpcy5vblByb2dyZXNzQWxsKHRvdGFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25Qcm9ncmVzc0FsbChwcm9ncmVzczogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKHByb2dyZXNzKTtcbiAgICB0aGlzLnByb2dyZXNzID0gdG90YWw7XG4gICAgdGhpcy5vblByb2dyZXNzQWxsKHRvdGFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25TdWNjZXNzSXRlbShpdGVtOiBPRmlsZUl0ZW0sIHJlc3BvbnNlOiBhbnkpOiB2b2lkIHtcbiAgICBpdGVtLl9vblN1Y2Nlc3MocmVzcG9uc2UpO1xuICAgIHRoaXMub25TdWNjZXNzSXRlbShpdGVtLCByZXNwb25zZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uU3VjY2Vzc0FsbChyZXNwb25zZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5maWxlcy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5fb25TdWNjZXNzKHJlc3BvbnNlLCBmYWxzZSkpO1xuICAgIHRoaXMub25TdWNjZXNzQWxsKHJlc3BvbnNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25FcnJvckl0ZW0oaXRlbTogT0ZpbGVJdGVtLCBlcnJvcjogYW55KTogdm9pZCB7XG4gICAgaXRlbS5fb25FcnJvcihlcnJvcik7XG4gICAgdGhpcy5vbkVycm9ySXRlbShpdGVtLCBlcnJvcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uRXJyb3JBbGwoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uX29uRXJyb3IoZXJyb3IsIGZhbHNlKSk7XG4gICAgdGhpcy5vbkVycm9yQWxsKGVycm9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25DYW5jZWxJdGVtKGl0ZW06IE9GaWxlSXRlbSk6IHZvaWQge1xuICAgIGl0ZW0uX29uQ2FuY2VsKCk7XG4gICAgdGhpcy5vbkNhbmNlbEl0ZW0oaXRlbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX29uQ2FuY2VsQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uX29uQ2FuY2VsKGZhbHNlKSk7XG4gICAgdGhpcy5vbkNhbmNlbEFsbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkNvbXBsZXRlSXRlbShpdGVtOiBPRmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpdGVtLl9vbkNvbXBsZXRlKCk7XG4gICAgdGhpcy5vbkNvbXBsZXRlSXRlbShpdGVtKTtcbiAgICBjb25zdCBuZXh0SXRlbSA9IHRoaXMuX2dldFJlYWR5SXRlbXMoKVswXTtcbiAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgaWYgKG5leHRJdGVtKSB7XG4gICAgICBuZXh0SXRlbS51cGxvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vbkNvbXBsZXRlQWxsKCk7XG4gICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMuX2dldFRvdGFsUHJvZ3Jlc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25Db21wbGV0ZUFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goaXRlbSA9PiBpdGVtLl9vbkNvbXBsZXRlKGZhbHNlKSk7XG4gICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMub25Db21wbGV0ZUFsbCgpO1xuICAgIHRoaXMucHJvZ3Jlc3MgPSB0aGlzLl9nZXRUb3RhbFByb2dyZXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2dldFJlYWR5SXRlbXMoKTogT0ZpbGVJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKChpdGVtOiBPRmlsZUl0ZW0pID0+IChpdGVtLmlzUmVhZHkgJiYgIWl0ZW0uaXNVcGxvYWRpbmcpKVxuICAgICAgLnNvcnQoKGl0ZW0xOiBPRmlsZUl0ZW0sIGl0ZW0yOiBPRmlsZUl0ZW0pID0+IGl0ZW0xLmluZGV4IC0gaXRlbTIuaW5kZXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9nZXRUb3RhbFByb2dyZXNzKHZhbHVlOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgICBjb25zdCBub3RVcGxvYWRlZCA9IHRoaXMuZ2V0Tm90VXBsb2FkZWRJdGVtcygpLmxlbmd0aDtcbiAgICBjb25zdCB1cGxvYWRlZCA9IG5vdFVwbG9hZGVkID8gdGhpcy5maWxlcy5sZW5ndGggLSBub3RVcGxvYWRlZCA6IHRoaXMuZmlsZXMubGVuZ3RoO1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5zcGxpdFVwbG9hZCA/IDEwMCAvIHRoaXMuZmlsZXMubGVuZ3RoIDogMTAwO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB2YWx1ZSAqIHJhdGlvIC8gMTAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHVwbG9hZGVkICogcmF0aW8gKyBjdXJyZW50KTtcbiAgfVxuXG59XG4iXX0=