ngx-image-cropper 7.2.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -29
- package/esm2022/lib/component/image-cropper.component.mjs +636 -0
- package/esm2022/lib/interfaces/basic-event.interface.mjs +2 -0
- package/{esm2020 → esm2022}/lib/services/crop.service.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/cropper-position.service.mjs +16 -6
- package/esm2022/lib/services/load-image.service.mjs +201 -0
- package/{esm2020 → esm2022}/lib/utils/keyboard.utils.mjs +1 -1
- package/esm2022/public-api.mjs +7 -0
- package/{fesm2020 → fesm2022}/ngx-image-cropper.mjs +36 -47
- package/fesm2022/ngx-image-cropper.mjs.map +1 -0
- package/index.d.ts +5 -7
- package/lib/component/image-cropper.component.d.ts +5 -4
- package/lib/interfaces/basic-event.interface.d.ts +4 -0
- package/lib/interfaces/cropper-options.interface.d.ts +2 -2
- package/lib/services/cropper-position.service.d.ts +5 -4
- package/lib/utils/hammer.utils.d.ts +1 -1
- package/lib/utils/keyboard.utils.d.ts +2 -1
- package/package.json +10 -18
- package/public-api.d.ts +6 -1
- package/esm2020/index.mjs +0 -8
- package/esm2020/lib/component/image-cropper.component.mjs +0 -635
- package/esm2020/lib/image-cropper.module.mjs +0 -26
- package/esm2020/lib/services/load-image.service.mjs +0 -200
- package/esm2020/public-api.mjs +0 -2
- package/fesm2015/ngx-image-cropper.mjs +0 -1483
- package/fesm2015/ngx-image-cropper.mjs.map +0 -1
- package/fesm2020/ngx-image-cropper.mjs.map +0 -1
- package/lib/image-cropper.module.d.ts +0 -8
- package/ngx-image-cropper.d.ts +0 -5
- /package/{esm2020 → esm2022}/lib/interfaces/cropper-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/cropper-position.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/cropper.settings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/dimensions.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/exif-transform.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/image-cropped-event.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/image-transform.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/loaded-image.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/interfaces/move-start.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/blob.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/exif.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/hammer.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/percentage.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/resize.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-image-cropper.mjs +0 -0
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { ImageCropperComponent } from './component/image-cropper.component';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class ImageCropperModule {
|
|
6
|
-
}
|
|
7
|
-
ImageCropperModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
8
|
-
ImageCropperModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, declarations: [ImageCropperComponent], imports: [CommonModule], exports: [ImageCropperComponent] });
|
|
9
|
-
ImageCropperModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, imports: [[
|
|
10
|
-
CommonModule
|
|
11
|
-
]] });
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, decorators: [{
|
|
13
|
-
type: NgModule,
|
|
14
|
-
args: [{
|
|
15
|
-
imports: [
|
|
16
|
-
CommonModule
|
|
17
|
-
],
|
|
18
|
-
declarations: [
|
|
19
|
-
ImageCropperComponent,
|
|
20
|
-
],
|
|
21
|
-
exports: [
|
|
22
|
-
ImageCropperComponent
|
|
23
|
-
]
|
|
24
|
-
}]
|
|
25
|
-
}] });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL2ltYWdlLWNyb3BwZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQWM1RSxNQUFNLE9BQU8sa0JBQWtCOztnSEFBbEIsa0JBQWtCO2lIQUFsQixrQkFBa0IsaUJBUDNCLHFCQUFxQixhQUhyQixZQUFZLGFBT1oscUJBQXFCO2lIQUdaLGtCQUFrQixZQVhwQjtZQUNQLFlBQVk7U0FDYjs0RkFTVSxrQkFBa0I7a0JBWjlCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7cUJBQ2I7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLHFCQUFxQjtxQkFFdEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHFCQUFxQjtxQkFDdEI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEltYWdlQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBJbWFnZUNyb3BwZXJDb21wb25lbnQsXG5cbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEltYWdlQ3JvcHBlckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlQ3JvcHBlck1vZHVsZSB7XG59XG4iXX0=
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class LoadImageService {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.autoRotateSupported = supportsAutomaticRotation();
|
|
7
|
-
}
|
|
8
|
-
async loadImageFile(file, cropperSettings) {
|
|
9
|
-
const arrayBuffer = await file.arrayBuffer();
|
|
10
|
-
return await this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);
|
|
11
|
-
}
|
|
12
|
-
checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, imageType, cropperSettings) {
|
|
13
|
-
if (!this.isValidImageType(imageType)) {
|
|
14
|
-
return Promise.reject(new Error('Invalid image type'));
|
|
15
|
-
}
|
|
16
|
-
return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);
|
|
17
|
-
}
|
|
18
|
-
isValidImageType(type) {
|
|
19
|
-
return /image\/(png|jpg|jpeg|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);
|
|
20
|
-
}
|
|
21
|
-
async loadImageFromURL(url, cropperSettings) {
|
|
22
|
-
const res = await fetch(url);
|
|
23
|
-
const buffer = await res.arrayBuffer();
|
|
24
|
-
return await this.loadImageFromArrayBuffer(buffer, cropperSettings);
|
|
25
|
-
}
|
|
26
|
-
loadBase64Image(imageBase64, cropperSettings) {
|
|
27
|
-
const arrayBuffer = this.base64ToArrayBuffer(imageBase64);
|
|
28
|
-
return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
|
|
29
|
-
}
|
|
30
|
-
base64ToArrayBuffer(imageBase64) {
|
|
31
|
-
imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');
|
|
32
|
-
const binaryString = atob(imageBase64);
|
|
33
|
-
const len = binaryString.length;
|
|
34
|
-
const bytes = new Uint8Array(len);
|
|
35
|
-
for (let i = 0; i < len; i++) {
|
|
36
|
-
bytes[i] = binaryString.charCodeAt(i);
|
|
37
|
-
}
|
|
38
|
-
return bytes.buffer;
|
|
39
|
-
}
|
|
40
|
-
async loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType) {
|
|
41
|
-
const res = await new Promise(async (resolve, reject) => {
|
|
42
|
-
try {
|
|
43
|
-
const blob = new Blob([arrayBuffer], imageType ? { type: imageType } : undefined);
|
|
44
|
-
const objectUrl = URL.createObjectURL(blob);
|
|
45
|
-
const originalImage = new Image();
|
|
46
|
-
const isSvg = imageType === 'image/svg+xml';
|
|
47
|
-
const originalImageSize = isSvg ? await this.getSvgImageSize(blob) : undefined;
|
|
48
|
-
originalImage.onload = () => resolve({
|
|
49
|
-
originalImage,
|
|
50
|
-
originalImageSize,
|
|
51
|
-
originalObjectUrl: objectUrl,
|
|
52
|
-
originalArrayBuffer: arrayBuffer
|
|
53
|
-
});
|
|
54
|
-
originalImage.onerror = reject;
|
|
55
|
-
originalImage.src = objectUrl;
|
|
56
|
-
}
|
|
57
|
-
catch (e) {
|
|
58
|
-
reject(e);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
return await this.transformImageFromArrayBuffer(res, cropperSettings, res.originalImageSize != null);
|
|
62
|
-
}
|
|
63
|
-
async getSvgImageSize(blob) {
|
|
64
|
-
const parser = new DOMParser();
|
|
65
|
-
const doc = parser.parseFromString(await blob.text(), 'image/svg+xml');
|
|
66
|
-
const svgElement = doc.querySelector('svg');
|
|
67
|
-
if (!svgElement) {
|
|
68
|
-
throw Error('Failed to parse SVG image');
|
|
69
|
-
}
|
|
70
|
-
const widthAttr = svgElement.getAttribute('width');
|
|
71
|
-
const heightAttr = svgElement.getAttribute('height');
|
|
72
|
-
if (widthAttr && heightAttr) {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
const viewBoxAttr = svgElement.getAttribute('viewBox')
|
|
76
|
-
|| svgElement.getAttribute('viewbox');
|
|
77
|
-
if (viewBoxAttr) {
|
|
78
|
-
const viewBox = viewBoxAttr.split(' ');
|
|
79
|
-
return {
|
|
80
|
-
width: +viewBox[2],
|
|
81
|
-
height: +viewBox[3]
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');
|
|
85
|
-
}
|
|
86
|
-
async transformImageFromArrayBuffer(res, cropperSettings, forceTransform = false) {
|
|
87
|
-
const autoRotate = await this.autoRotateSupported;
|
|
88
|
-
const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);
|
|
89
|
-
if (!res.originalImage || !res.originalImage.complete) {
|
|
90
|
-
return Promise.reject(new Error('No image loaded'));
|
|
91
|
-
}
|
|
92
|
-
const loadedImage = {
|
|
93
|
-
original: {
|
|
94
|
-
objectUrl: res.originalObjectUrl,
|
|
95
|
-
image: res.originalImage,
|
|
96
|
-
size: res.originalImageSize ?? {
|
|
97
|
-
width: res.originalImage.naturalWidth,
|
|
98
|
-
height: res.originalImage.naturalHeight
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
exifTransform
|
|
102
|
-
};
|
|
103
|
-
return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);
|
|
104
|
-
}
|
|
105
|
-
async transformLoadedImage(loadedImage, cropperSettings, forceTransform = false) {
|
|
106
|
-
const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;
|
|
107
|
-
const originalSize = loadedImage.original.size;
|
|
108
|
-
if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
|
|
109
|
-
return {
|
|
110
|
-
original: {
|
|
111
|
-
objectUrl: loadedImage.original.objectUrl,
|
|
112
|
-
image: loadedImage.original.image,
|
|
113
|
-
size: { ...originalSize }
|
|
114
|
-
},
|
|
115
|
-
transformed: {
|
|
116
|
-
objectUrl: loadedImage.original.objectUrl,
|
|
117
|
-
image: loadedImage.original.image,
|
|
118
|
-
size: { ...originalSize }
|
|
119
|
-
},
|
|
120
|
-
exifTransform: loadedImage.exifTransform
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperSettings);
|
|
124
|
-
const canvas = document.createElement('canvas');
|
|
125
|
-
canvas.width = transformedSize.width;
|
|
126
|
-
canvas.height = transformedSize.height;
|
|
127
|
-
const ctx = canvas.getContext('2d');
|
|
128
|
-
ctx?.setTransform(loadedImage.exifTransform.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);
|
|
129
|
-
ctx?.rotate(Math.PI * (canvasRotation / 2));
|
|
130
|
-
ctx?.drawImage(loadedImage.original.image, -originalSize.width / 2, -originalSize.height / 2);
|
|
131
|
-
const blob = await new Promise(resolve => canvas.toBlob(resolve, cropperSettings.format));
|
|
132
|
-
if (!blob) {
|
|
133
|
-
throw new Error('Failed to get Blob for transformed image.');
|
|
134
|
-
}
|
|
135
|
-
const objectUrl = URL.createObjectURL(blob);
|
|
136
|
-
const transformedImage = await this.loadImageFromObjectUrl(objectUrl);
|
|
137
|
-
return {
|
|
138
|
-
original: {
|
|
139
|
-
objectUrl: loadedImage.original.objectUrl,
|
|
140
|
-
image: loadedImage.original.image,
|
|
141
|
-
size: { ...originalSize }
|
|
142
|
-
},
|
|
143
|
-
transformed: {
|
|
144
|
-
objectUrl: objectUrl,
|
|
145
|
-
image: transformedImage,
|
|
146
|
-
size: {
|
|
147
|
-
width: transformedImage.width,
|
|
148
|
-
height: transformedImage.height
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
exifTransform: loadedImage.exifTransform
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
loadImageFromObjectUrl(objectUrl) {
|
|
155
|
-
return new Promise(((resolve, reject) => {
|
|
156
|
-
const image = new Image();
|
|
157
|
-
image.onload = () => resolve(image);
|
|
158
|
-
image.onerror = reject;
|
|
159
|
-
image.src = objectUrl;
|
|
160
|
-
}));
|
|
161
|
-
}
|
|
162
|
-
getTransformedSize(originalSize, exifTransform, cropperSettings) {
|
|
163
|
-
const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;
|
|
164
|
-
if (cropperSettings.containWithinAspectRatio) {
|
|
165
|
-
if (canvasRotation % 2) {
|
|
166
|
-
const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;
|
|
167
|
-
const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;
|
|
168
|
-
return {
|
|
169
|
-
width: Math.max(originalSize.height, minWidthToContain),
|
|
170
|
-
height: Math.max(originalSize.width, minHeightToContain)
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;
|
|
175
|
-
const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;
|
|
176
|
-
return {
|
|
177
|
-
width: Math.max(originalSize.width, minWidthToContain),
|
|
178
|
-
height: Math.max(originalSize.height, minHeightToContain)
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (canvasRotation % 2) {
|
|
183
|
-
return {
|
|
184
|
-
height: originalSize.width,
|
|
185
|
-
width: originalSize.height
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
return {
|
|
189
|
-
width: originalSize.width,
|
|
190
|
-
height: originalSize.height
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
LoadImageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
195
|
-
LoadImageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, providedIn: 'root' });
|
|
196
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, decorators: [{
|
|
197
|
-
type: Injectable,
|
|
198
|
-
args: [{ providedIn: 'root' }]
|
|
199
|
-
}] });
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbWFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFVaEcsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUdVLHdCQUFtQixHQUFxQix5QkFBeUIsRUFBRSxDQUFDO0tBcU43RTtJQW5OQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVUsRUFBRSxlQUFnQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLHlDQUF5QyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFTyx5Q0FBeUMsQ0FBQyxXQUE0QixFQUFFLFNBQWlCLEVBQUUsZUFBZ0M7UUFDakksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxPQUFPLHVFQUF1RSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVcsRUFB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O2dCQUMxQixLQUFLLEVBQUUsWUFBWSxDQUFDLE1BQU07YUFDM0IsQ0FBQztTQUNIO1FBQ0QsT0FBTztZQUNMLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztZQUN6QixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDNUIsQ0FBQztJQUNKLENBQUM7OzhHQXROVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQURKLE1BQU07NEZBQ2xCLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaW1lbnNpb25zLCBMb2FkZWRJbWFnZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ3JvcHBlclNldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jcm9wcGVyLnNldHRpbmdzJztcbmltcG9ydCB7IEV4aWZUcmFuc2Zvcm0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4aWYtdHJhbnNmb3JtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXRUcmFuc2Zvcm1hdGlvbnNGcm9tRXhpZkRhdGEsIHN1cHBvcnRzQXV0b21hdGljUm90YXRpb24gfSBmcm9tICcuLi91dGlscy9leGlmLnV0aWxzJztcblxuaW50ZXJmYWNlIExvYWRJbWFnZUFycmF5QnVmZmVyIHtcbiAgb3JpZ2luYWxJbWFnZTogSFRNTEltYWdlRWxlbWVudDtcbiAgb3JpZ2luYWxBcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlO1xuICBvcmlnaW5hbE9iamVjdFVybDogc3RyaW5nO1xuICBvcmlnaW5hbEltYWdlU2l6ZT86IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IH0gfCBudWxsO1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBMb2FkSW1hZ2VTZXJ2aWNlIHtcblxuICBwcml2YXRlIGF1dG9Sb3RhdGVTdXBwb3J0ZWQ6IFByb21pc2U8Ym9vbGVhbj4gPSBzdXBwb3J0c0F1dG9tYXRpY1JvdGF0aW9uKCk7XG5cbiAgYXN5bmMgbG9hZEltYWdlRmlsZShmaWxlOiBGaWxlLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGVja0ltYWdlVHlwZUFuZExvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgZmlsZS50eXBlLCBjcm9wcGVyU2V0dGluZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ltYWdlVHlwZUFuZExvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlLCBpbWFnZVR5cGU6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRJbWFnZVR5cGUoaW1hZ2VUeXBlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignSW52YWxpZCBpbWFnZSB0eXBlJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2FkSW1hZ2VGcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIsIGNyb3BwZXJTZXR0aW5ncywgaW1hZ2VUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEltYWdlVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL2ltYWdlXFwvKHBuZ3xqcGd8anBlZ3xibXB8Z2lmfHRpZmZ8c3ZnfHdlYnB8eC1pY29ufHZuZC5taWNyb3NvZnQuaWNvbikvLnRlc3QodHlwZSk7XG4gIH1cblxuICBhc3luYyBsb2FkSW1hZ2VGcm9tVVJMKHVybDogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihidWZmZXIsIGNyb3BwZXJTZXR0aW5ncyk7XG4gIH1cblxuICBsb2FkQmFzZTY0SW1hZ2UoaW1hZ2VCYXNlNjQ6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoaW1hZ2VCYXNlNjQpO1xuICAgIHJldHVybiB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgY3JvcHBlclNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYmFzZTY0VG9BcnJheUJ1ZmZlcihpbWFnZUJhc2U2NDogc3RyaW5nKTogQXJyYXlCdWZmZXJMaWtlIHtcbiAgICBpbWFnZUJhc2U2NCA9IGltYWdlQmFzZTY0LnJlcGxhY2UoL15kYXRhOihbXjtdKyk7YmFzZTY0LC9nbWksICcnKTtcbiAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGltYWdlQmFzZTY0KTtcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW1hZ2VGcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyTGlrZSwgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MsIGltYWdlVHlwZT86IHN0cmluZyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBuZXcgUHJvbWlzZTxMb2FkSW1hZ2VBcnJheUJ1ZmZlcj4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJheUJ1ZmZlcl0sIGltYWdlVHlwZSA/IHt0eXBlOiBpbWFnZVR5cGV9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBjb25zdCBpc1N2ZyA9IGltYWdlVHlwZSA9PT0gJ2ltYWdlL3N2Zyt4bWwnO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEltYWdlU2l6ZSA9IGlzU3ZnID8gYXdhaXQgdGhpcy5nZXRTdmdJbWFnZVNpemUoYmxvYikgOiB1bmRlZmluZWQ7XG4gICAgICAgIG9yaWdpbmFsSW1hZ2Uub25sb2FkID0gKCkgPT4gcmVzb2x2ZSh7XG4gICAgICAgICAgb3JpZ2luYWxJbWFnZSxcbiAgICAgICAgICBvcmlnaW5hbEltYWdlU2l6ZSxcbiAgICAgICAgICBvcmlnaW5hbE9iamVjdFVybDogb2JqZWN0VXJsLFxuICAgICAgICAgIG9yaWdpbmFsQXJyYXlCdWZmZXI6IGFycmF5QnVmZmVyXG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbEltYWdlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIG9yaWdpbmFsSW1hZ2Uuc3JjID0gb2JqZWN0VXJsO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhbnNmb3JtSW1hZ2VGcm9tQXJyYXlCdWZmZXIocmVzLCBjcm9wcGVyU2V0dGluZ3MsIHJlcy5vcmlnaW5hbEltYWdlU2l6ZSAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3ZnSW1hZ2VTaXplKGJsb2I6IEJsb2IpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IH0gfCBudWxsPiB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoYXdhaXQgYmxvYi50ZXh0KCksICdpbWFnZS9zdmcreG1sJyk7XG4gICAgY29uc3Qgc3ZnRWxlbWVudCA9IGRvYy5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICBpZiAoIXN2Z0VsZW1lbnQpIHtcbiAgICAgIHRocm93IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgU1ZHIGltYWdlJyk7XG4gICAgfVxuICAgIGNvbnN0IHdpZHRoQXR0ciA9IHN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGNvbnN0IGhlaWdodEF0dHIgPSBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgaWYgKHdpZHRoQXR0ciAmJiBoZWlnaHRBdHRyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgdmlld0JveEF0dHIgPSBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgndmlld0JveCcpXG4gICAgICB8fCBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgndmlld2JveCcpO1xuICAgIGlmICh2aWV3Qm94QXR0cikge1xuICAgICAgY29uc3Qgdmlld0JveCA9IHZpZXdCb3hBdHRyLnNwbGl0KCcgJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogK3ZpZXdCb3hbMl0sXG4gICAgICAgIGhlaWdodDogK3ZpZXdCb3hbM11cbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBTVkcgaW1hZ2UuIFNWRyBtdXN0IGhhdmUgd2lkdGggKyBoZWlnaHQgb3Igdmlld0JveCBkZWZpbml0aW9uLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2Zvcm1JbWFnZUZyb21BcnJheUJ1ZmZlcihyZXM6IExvYWRJbWFnZUFycmF5QnVmZmVyLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgZm9yY2VUcmFuc2Zvcm0gPSBmYWxzZSk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBhdXRvUm90YXRlID0gYXdhaXQgdGhpcy5hdXRvUm90YXRlU3VwcG9ydGVkO1xuICAgIGNvbnN0IGV4aWZUcmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1hdGlvbnNGcm9tRXhpZkRhdGEoYXV0b1JvdGF0ZSA/IC0xIDogcmVzLm9yaWdpbmFsQXJyYXlCdWZmZXIpO1xuICAgIGlmICghcmVzLm9yaWdpbmFsSW1hZ2UgfHwgIXJlcy5vcmlnaW5hbEltYWdlLmNvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBpbWFnZSBsb2FkZWQnKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvYWRlZEltYWdlID0ge1xuICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgb2JqZWN0VXJsOiByZXMub3JpZ2luYWxPYmplY3RVcmwsXG4gICAgICAgIGltYWdlOiByZXMub3JpZ2luYWxJbWFnZSxcbiAgICAgICAgc2l6ZTogcmVzLm9yaWdpbmFsSW1hZ2VTaXplID8/IHtcbiAgICAgICAgICB3aWR0aDogcmVzLm9yaWdpbmFsSW1hZ2UubmF0dXJhbFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVzLm9yaWdpbmFsSW1hZ2UubmF0dXJhbEhlaWdodFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXhpZlRyYW5zZm9ybVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtTG9hZGVkSW1hZ2UobG9hZGVkSW1hZ2UsIGNyb3BwZXJTZXR0aW5ncywgZm9yY2VUcmFuc2Zvcm0pO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNmb3JtTG9hZGVkSW1hZ2UobG9hZGVkSW1hZ2U6IFBhcnRpYWw8TG9hZGVkSW1hZ2U+LCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgZm9yY2VUcmFuc2Zvcm0gPSBmYWxzZSk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLnJvdGF0ZTtcbiAgICBjb25zdCBvcmlnaW5hbFNpemUgPSBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuc2l6ZTtcbiAgICBpZiAoIWZvcmNlVHJhbnNmb3JtICYmIGNhbnZhc1JvdGF0aW9uID09PSAwICYmICFsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIS5mbGlwICYmICFjcm9wcGVyU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgIG9iamVjdFVybDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLm9iamVjdFVybCxcbiAgICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgICAgIHNpemU6IHsuLi5vcmlnaW5hbFNpemV9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgICAgb2JqZWN0VXJsOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEub2JqZWN0VXJsLFxuICAgICAgICAgIGltYWdlOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAgICAgc2l6ZTogey4uLm9yaWdpbmFsU2l6ZX1cbiAgICAgICAgfSxcbiAgICAgICAgZXhpZlRyYW5zZm9ybTogbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNmb3JtZWRTaXplID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFNpemUob3JpZ2luYWxTaXplLCBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtISwgY3JvcHBlclNldHRpbmdzKTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB0cmFuc2Zvcm1lZFNpemUud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRyYW5zZm9ybWVkU2l6ZS5oZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY3R4Py5zZXRUcmFuc2Zvcm0oXG4gICAgICBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIS5mbGlwID8gLTEgOiAxLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgY2FudmFzLndpZHRoIC8gMixcbiAgICAgIGNhbnZhcy5oZWlnaHQgLyAyXG4gICAgKTtcbiAgICBjdHg/LnJvdGF0ZShNYXRoLlBJICogKGNhbnZhc1JvdGF0aW9uIC8gMikpO1xuICAgIGN0eD8uZHJhd0ltYWdlKFxuICAgICAgbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgLW9yaWdpbmFsU2l6ZS53aWR0aCAvIDIsXG4gICAgICAtb3JpZ2luYWxTaXplLmhlaWdodCAvIDJcbiAgICApO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4ocmVzb2x2ZSA9PiBjYW52YXMudG9CbG9iKHJlc29sdmUsIGNyb3BwZXJTZXR0aW5ncy5mb3JtYXQpKTtcbiAgICBpZiAoIWJsb2IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBCbG9iIGZvciB0cmFuc2Zvcm1lZCBpbWFnZS4nKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZEltYWdlID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VGcm9tT2JqZWN0VXJsKG9iamVjdFVybCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgIG9iamVjdFVybDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLm9iamVjdFVybCxcbiAgICAgICAgaW1hZ2U6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZSxcbiAgICAgICAgc2l6ZTogey4uLm9yaWdpbmFsU2l6ZX1cbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm1lZDoge1xuICAgICAgICBvYmplY3RVcmw6IG9iamVjdFVybCxcbiAgICAgICAgaW1hZ2U6IHRyYW5zZm9ybWVkSW1hZ2UsXG4gICAgICAgIHNpemU6IHtcbiAgICAgICAgICB3aWR0aDogdHJhbnNmb3JtZWRJbWFnZS53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRyYW5zZm9ybWVkSW1hZ2UuaGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBleGlmVHJhbnNmb3JtOiBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvYWRJbWFnZUZyb21PYmplY3RVcmwob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4oKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltYWdlKTtcbiAgICAgIGltYWdlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICBpbWFnZS5zcmMgPSBvYmplY3RVcmw7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUcmFuc2Zvcm1lZFNpemUoXG4gICAgb3JpZ2luYWxTaXplOiB7IHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0sXG4gICAgZXhpZlRyYW5zZm9ybTogRXhpZlRyYW5zZm9ybSxcbiAgICBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5nc1xuICApOiBEaW1lbnNpb25zIHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGV4aWZUcmFuc2Zvcm0ucm90YXRlO1xuICAgIGlmIChjcm9wcGVyU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLndpZHRoICogY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHRUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUuaGVpZ2h0IC8gY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1heChvcmlnaW5hbFNpemUuaGVpZ2h0LCBtaW5XaWR0aFRvQ29udGFpbiksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChvcmlnaW5hbFNpemUud2lkdGgsIG1pbkhlaWdodFRvQ29udGFpbilcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLmhlaWdodCAqIGNyb3BwZXJTZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0VG9Db250YWluID0gb3JpZ2luYWxTaXplLndpZHRoIC8gY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1heChvcmlnaW5hbFNpemUud2lkdGgsIG1pbldpZHRoVG9Db250YWluKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS5oZWlnaHQsIG1pbkhlaWdodFRvQ29udGFpbilcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsU2l6ZS53aWR0aCxcbiAgICAgICAgd2lkdGg6IG9yaWdpbmFsU2l6ZS5oZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogb3JpZ2luYWxTaXplLndpZHRoLFxuICAgICAgaGVpZ2h0OiBvcmlnaW5hbFNpemUuaGVpZ2h0XG4gICAgfTtcbiAgfVxufVxuIl19
|
package/esm2020/public-api.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from './index';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|