cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
151 lines • 22.6 kB
JavaScript
import { HttpEventType } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, of, Subject } from 'rxjs';
import { catchError, last, map, tap } from 'rxjs/operators';
import SparkMD5 from 'spark-md5';
import { DefaultConfigComponent } from '../../config/config.components';
import * as i0 from "@angular/core";
import * as i1 from "cocori-ng/src/feature-core";
export class UploaderService {
constructor(httpService) {
this.httpService = httpService;
this.progressSource = new BehaviorSubject(0);
this.fileUploaded$ = new Subject();
this.fileOnError$ = new Subject();
this.chunkSize = DefaultConfigComponent.upload.chunkSize;
}
uploadFile(file) {
this.file = file;
const numberParts = this.getNumberPart(file);
this.convertFileToArrayBuffer(file).subscribe((fileArrayBuffer) => {
if (numberParts === 1) {
this.handleFullFile(fileArrayBuffer, numberParts);
}
else {
this.handlePartsFile(fileArrayBuffer, numberParts);
}
});
}
handleFullFile(fileArrayBuffer, numberParts) {
this.sendFull(fileArrayBuffer, numberParts).pipe(tap((fileId) => {
this.fileUploaded$.next(fileId);
})).subscribe();
}
handlePartsFile(fileArrayBuffer, numberParts) {
/** send first part then the others */
this.sendFull(this.getPart(fileArrayBuffer, 0), numberParts).subscribe((datas) => {
const fileId = datas.value;
this.loopParts(numberParts, fileId, fileArrayBuffer).then(() => {
this.endCommand(fileId, fileArrayBuffer).subscribe(_ => {
this.fileUploaded$.next(fileId);
});
});
});
}
async loopParts(numberParts, fileId, fileArrayBuffer) {
for (var iPart = 1; iPart < numberParts; iPart++) {
await this.sendPart(fileId, iPart, this.getPart(fileArrayBuffer, iPart), numberParts);
}
}
sendFull(buffer, numberParts) {
const command = {
fileName: this.file.name,
mimeType: this.file.type,
numberParts: numberParts,
base64Content: this.convertToBase64(buffer)
};
return this.sendFile(command, 1, numberParts);
}
sendPart(fileId, partIndex, buffer, numberParts) {
const command = {
fileId: fileId,
partIndex: partIndex,
mimeType: this.file.type,
base64Content: this.convertToBase64(buffer)
};
return this.sendFile(command, partIndex + 1, numberParts).toPromise();
}
sendFile(command, partIndex, numberParts) {
return this.UploadFileAPI(command, partIndex, numberParts).pipe(map(event => this.getEventMessage(event, partIndex, numberParts)), last(), catchError(error => {
this.fileOnError$.next(undefined);
return of(null);
}));
}
endCommand(fileId, buffer) {
const command = {
fileId: fileId,
checksum: this.getChecksum(buffer)
};
return this.EndUploadPartsFileAPI(command).pipe(catchError(error => {
this.fileOnError$.next(undefined);
return of(null);
}));
}
getNumberPart(file) {
return this.chunkSize <= 0
? 1
: Math.ceil(file.size / this.chunkSize);
}
convertFileToArrayBuffer(file) {
return new Observable((observer) => {
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function () {
const arraybuffer = reader.result;
observer.next(arraybuffer);
observer.complete();
};
});
}
convertToBase64(buffer) {
let binary = "";
let bytes = new Uint8Array(buffer);
let len = bytes.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
getPart(data, partIndex) {
const start = partIndex * this.chunkSize;
const end = start + this.chunkSize;
return data.slice(start, Math.min(end, data.byteLength));
}
getChecksum(data) {
const spark = new SparkMD5.ArrayBuffer();
spark.append(data);
return btoa(spark.end(true));
}
getEventMessage(event, partIndex, numberParts) {
switch (event.type) {
case HttpEventType.Sent:
return this.progressSource.next(Math.round((partIndex / numberParts) * 100));
case HttpEventType.UploadProgress:
return `progress...`;
case HttpEventType.Response:
return event.body;
default:
return `default...`;
}
}
/** APIs */
UploadFileAPI(datas, partIndex, numberParts) {
let apiFile = this.apisFile.apiFile();
if (numberParts > 1 && partIndex > 1)
apiFile = `${apiFile}/${datas.fileId}/parts`;
return this.httpService.upload(apiFile, datas);
}
EndUploadPartsFileAPI(datas) {
const apiFile = this.apisFile.apiFile();
return this.httpService.patch(`${apiFile}/${datas.fileId}/parts`, datas);
}
}
UploaderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: UploaderService, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Injectable });
UploaderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: UploaderService, providedIn: "root" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: UploaderService, decorators: [{
type: Injectable,
args: [{
providedIn: "root"
}]
}], ctorParameters: function () { return [{ type: i1.HttpService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvY29yaS1uZy9zcmMvZmVhdHVyZS1mb3JtL2NvcmUvc2VydmljZS91cGxvYWRlci91cGxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7O0FBZXhFLE1BQU0sT0FBTyxlQUFlO0lBUTFCLFlBQ1UsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFSM0IsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNoRCxrQkFBYSxHQUFpQixJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQ2pELGlCQUFZLEdBQWlCLElBQUksT0FBTyxFQUFPLENBQUM7UUFPckQsSUFBSSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQzNELENBQUM7SUFFRCxVQUFVLENBQUMsSUFBVTtRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUVoQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJ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QU8sRUFBRSxDQUFBO1FBRS9DLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzFFLENBQUM7OzRHQS9LVSxlQUFlO2dIQUFmLGVBQWUsY0FGZCxNQUFNOzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQXNzZW1ibGVGaWxlUGFydHNDb21tYW5kLFxyXG4gIENvbmZpZ0FQSXNGaWxlLFxyXG4gIEZpbGVQYXJ0Q29tbWFuZCxcclxuICBIdHRwU2VydmljZSxcclxuICBOZXdGaWxlQ29tbWFuZCxcclxufSBmcm9tICdjb2Nvcmktbmcvc3JjL2ZlYXR1cmUtY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbGFzdCwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCBTcGFya01ENSBmcm9tICdzcGFyay1tZDUnO1xyXG5cclxuaW1wb3J0IHsgRGVmYXVsdENvbmZpZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbmZpZy9jb25maWcuY29tcG9uZW50cyc7XHJcblxyXG5cclxuaW50ZXJmYWNlIEZpbGVSZWFkZXJFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcclxuICByZXN1bHQ6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIEZpbGVSZWFkZXJFdmVudCBleHRlbmRzIEV2ZW50IHtcclxuICB0YXJnZXQ6IEZpbGVSZWFkZXJFdmVudFRhcmdldDtcclxuICBnZXRNZXNzYWdlKCk6IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVcGxvYWRlclNlcnZpY2Uge1xyXG4gIHB1YmxpYyBwcm9ncmVzc1NvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuICBwdWJsaWMgZmlsZVVwbG9hZGVkJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHB1YmxpYyBmaWxlT25FcnJvciQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICBwdWJsaWMgYXBpc0ZpbGU6IENvbmZpZ0FQSXNGaWxlO1xyXG4gIGNodW5rU2l6ZTogbnVtYmVyO1xyXG4gIGZpbGU6IEZpbGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwU2VydmljZTogSHR0cFNlcnZpY2UsKSB7XHJcbiAgICB0aGlzLmNodW5rU2l6ZSA9IERlZmF1bHRDb25maWdDb21wb25lbnQudXBsb2FkLmNodW5rU2l6ZTtcclxuICB9XHJcblxyXG4gIHVwbG9hZEZpbGUoZmlsZTogRmlsZSkge1xyXG4gICAgdGhpcy5maWxlID0gZmlsZVxyXG5cclxuICAgIGNvbnN0IG51bWJlclBhcnRzID0gdGhpcy5nZXROdW1iZXJQYXJ0KGZpbGUpO1xyXG5cclxuICAgIHRoaXMuY29udmVydEZpbGVUb0FycmF5QnVmZmVyKGZpbGUpLnN1YnNjcmliZShcclxuICAgICAgKGZpbGVBcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IHtcclxuICAgICAgICBpZiAobnVtYmVyUGFydHMgPT09IDEpIHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRnVsbEZpbGUoZmlsZUFycmF5QnVmZmVyLCBudW1iZXJQYXJ0cylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVQYXJ0c0ZpbGUoZmlsZUFycmF5QnVmZmVyLCBudW1iZXJQYXJ0cylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRnVsbEZpbGUoZmlsZUFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlciwgbnVtYmVyUGFydHM6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZW5kRnVsbChmaWxlQXJyYXlCdWZmZXIsIG51bWJlclBhcnRzKS5waXBlKFxyXG4gICAgICB0YXAoKGZpbGVJZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkZWQkLm5leHQoZmlsZUlkKVxyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlUGFydHNGaWxlKGZpbGVBcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIsIG51bWJlclBhcnRzOiBudW1iZXIpIHtcclxuICAgIC8qKiBzZW5kIGZpcnN0IHBhcnQgdGhlbiB0aGUgb3RoZXJzICovXHJcbiAgICB0aGlzLnNlbmRGdWxsKHRoaXMuZ2V0UGFydChmaWxlQXJyYXlCdWZmZXIsIDApLCBudW1iZXJQYXJ0cykuc3Vic2NyaWJlKChkYXRhczogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVJZDogc3RyaW5nID0gZGF0YXMudmFsdWVcclxuXHJcbiAgICAgIHRoaXMubG9vcFBhcnRzKG51bWJlclBhcnRzLCBmaWxlSWQsIGZpbGVBcnJheUJ1ZmZlcikudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbmRDb21tYW5kKGZpbGVJZCwgZmlsZUFycmF5QnVmZmVyKS5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRlZCQubmV4dChmaWxlSWQpXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGxvb3BQYXJ0cyhudW1iZXJQYXJ0czogbnVtYmVyLCBmaWxlSWQ6IHN0cmluZywgZmlsZUFycmF5QnVmZmVyOiBhbnkpIHtcclxuICAgIGZvciAodmFyIGlQYXJ0ID0gMTsgaVBhcnQgPCBudW1iZXJQYXJ0czsgaVBhcnQrKykge1xyXG4gICAgICBhd2FpdCB0aGlzLnNlbmRQYXJ0KGZpbGVJZCwgaVBhcnQsIHRoaXMuZ2V0UGFydChmaWxlQXJyYXlCdWZmZXIsIGlQYXJ0KSwgbnVtYmVyUGFydHMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzZW5kRnVsbChidWZmZXI6IEFycmF5QnVmZmVyLCBudW1iZXJQYXJ0czogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvbW1hbmQ6IE5ld0ZpbGVDb21tYW5kID0ge1xyXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlLm5hbWUsXHJcbiAgICAgIG1pbWVUeXBlOiB0aGlzLmZpbGUudHlwZSxcclxuICAgICAgbnVtYmVyUGFydHM6IG51bWJlclBhcnRzLFxyXG4gICAgICBiYXNlNjRDb250ZW50OiB0aGlzLmNvbnZlcnRUb0Jhc2U2NChidWZmZXIpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2VuZEZpbGUoY29tbWFuZCwgMSwgbnVtYmVyUGFydHMpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRQYXJ0KGZpbGVJZDogc3RyaW5nLCBwYXJ0SW5kZXg6IG51bWJlciwgYnVmZmVyOiBBcnJheUJ1ZmZlciwgbnVtYmVyUGFydHM6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBjb21tYW5kOiBGaWxlUGFydENvbW1hbmQgPSB7XHJcbiAgICAgIGZpbGVJZDogZmlsZUlkLFxyXG4gICAgICBwYXJ0SW5kZXg6IHBhcnRJbmRleCxcclxuICAgICAgbWltZVR5cGU6IHRoaXMuZmlsZS50eXBlLFxyXG4gICAgICBiYXNlNjRDb250ZW50OiB0aGlzLmNvbnZlcnRUb0Jhc2U2NChidWZmZXIpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kRmlsZShjb21tYW5kLCBwYXJ0SW5kZXggKyAxLCBudW1iZXJQYXJ0cykudG9Qcm9taXNlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VuZEZpbGUoY29tbWFuZDogTmV3RmlsZUNvbW1hbmQgfCBGaWxlUGFydENvbW1hbmQsIHBhcnRJbmRleDogbnVtYmVyLCBudW1iZXJQYXJ0czogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5VcGxvYWRGaWxlQVBJKGNvbW1hbmQsIHBhcnRJbmRleCwgbnVtYmVyUGFydHMpLnBpcGUoXHJcbiAgICAgIG1hcChldmVudCA9PiB0aGlzLmdldEV2ZW50TWVzc2FnZShldmVudCwgcGFydEluZGV4LCBudW1iZXJQYXJ0cykpLFxyXG4gICAgICBsYXN0KCksXHJcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsZU9uRXJyb3IkLm5leHQodW5kZWZpbmVkKVxyXG4gICAgICAgIHJldHVybiBvZihudWxsKVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kQ29tbWFuZChmaWxlSWQ6IHN0cmluZywgYnVmZmVyOiBBcnJheUJ1ZmZlcikge1xyXG4gICAgY29uc3QgY29tbWFuZDogQXNzZW1ibGVGaWxlUGFydHNDb21tYW5kID0ge1xyXG4gICAgICBmaWxlSWQ6IGZpbGVJZCxcclxuICAgICAgY2hlY2tzdW06IHRoaXMuZ2V0Q2hlY2tzdW0oYnVmZmVyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuRW5kVXBsb2FkUGFydHNGaWxlQVBJKGNvbW1hbmQpLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuZmlsZU9uRXJyb3IkLm5leHQodW5kZWZpbmVkKVxyXG4gICAgICAgIHJldHVybiBvZihudWxsKVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TnVtYmVyUGFydChmaWxlOiBGaWxlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jaHVua1NpemUgPD0gMFxyXG4gICAgICA/IDFcclxuICAgICAgOiBNYXRoLmNlaWwoZmlsZS5zaXplIC8gdGhpcy5jaHVua1NpemUpO1xyXG4gIH1cclxuXHJcbiAgY29udmVydEZpbGVUb0FycmF5QnVmZmVyKGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgYXJyYXlidWZmZXIgPSA8QXJyYXlCdWZmZXI+cmVhZGVyLnJlc3VsdDtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZXIubmV4dChhcnJheWJ1ZmZlcilcclxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY29udmVydFRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpIHtcclxuICAgIGxldCBiaW5hcnkgPSBcIlwiO1xyXG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcclxuICAgIGxldCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gd2luZG93LmJ0b2EoYmluYXJ5KTtcclxuICB9XHJcblxyXG4gIGdldFBhcnQoZGF0YTogQXJyYXlCdWZmZXIsIHBhcnRJbmRleDogbnVtYmVyKTogQXJyYXlCdWZmZXIge1xyXG4gICAgY29uc3Qgc3RhcnQgPSBwYXJ0SW5kZXggKiB0aGlzLmNodW5rU2l6ZTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdGhpcy5jaHVua1NpemU7XHJcblxyXG4gICAgcmV0dXJuIGRhdGEuc2xpY2Uoc3RhcnQsIE1hdGgubWluKGVuZCwgZGF0YS5ieXRlTGVuZ3RoKSk7XHJcbiAgfVxyXG5cclxuICBnZXRDaGVja3N1bShkYXRhOiBBcnJheUJ1ZmZlcikge1xyXG4gICAgY29uc3Qgc3BhcmsgPSBuZXcgU3BhcmtNRDUuQXJyYXlCdWZmZXIoKTtcclxuICAgIHNwYXJrLmFwcGVuZChkYXRhKTtcclxuICAgIHJldHVybiBidG9hKHNwYXJrLmVuZCh0cnVlKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEV2ZW50TWVzc2FnZShldmVudDogSHR0cEV2ZW50PGFueT4sIHBhcnRJbmRleDogbnVtYmVyLCBudW1iZXJQYXJ0czogbnVtYmVyKSB7XHJcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgY2FzZSBIdHRwRXZlbnRUeXBlLlNlbnQ6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZ3Jlc3NTb3VyY2UubmV4dChNYXRoLnJvdW5kKChwYXJ0SW5kZXggLyBudW1iZXJQYXJ0cykgKiAxMDApKTtcclxuXHJcbiAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzczpcclxuICAgICAgICByZXR1cm4gYHByb2dyZXNzLi4uYDtcclxuXHJcbiAgICAgIGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcclxuICAgICAgICByZXR1cm4gZXZlbnQuYm9keTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGBkZWZhdWx0Li4uYDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBBUElzICovXHJcblxyXG4gIFVwbG9hZEZpbGVBUEkoZGF0YXM6IE5ld0ZpbGVDb21tYW5kIHwgRmlsZVBhcnRDb21tYW5kLCBwYXJ0SW5kZXg6IG51bWJlciwgbnVtYmVyUGFydHM6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBsZXQgYXBpRmlsZTogc3RyaW5nID0gdGhpcy5hcGlzRmlsZS5hcGlGaWxlKClcclxuXHJcbiAgICBpZiAobnVtYmVyUGFydHMgPiAxICYmIHBhcnRJbmRleCA+IDEpIGFwaUZpbGUgPSBgJHthcGlGaWxlfS8keyg8RmlsZVBhcnRDb21tYW5kPmRhdGFzKS5maWxlSWR9L3BhcnRzYFxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLnVwbG9hZChhcGlGaWxlLCBkYXRhcylcclxuICB9XHJcblxyXG4gIEVuZFVwbG9hZFBhcnRzRmlsZUFQSShkYXRhczogQXNzZW1ibGVGaWxlUGFydHNDb21tYW5kKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGFwaUZpbGU6IHN0cmluZyA9IHRoaXMuYXBpc0ZpbGUuYXBpRmlsZSgpXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UucGF0Y2goYCR7YXBpRmlsZX0vJHtkYXRhcy5maWxlSWR9L3BhcnRzYCwgZGF0YXMpXHJcbiAgfVxyXG59XHJcbiJdfQ==