@wizishop/img-manager-webelement 15.2.52 → 18.2.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 +24 -24
- package/{esm2020 → esm2022}/lib/environments/environment.mjs +1 -1
- package/esm2022/lib/img-manager-webelement.component.mjs +135 -0
- package/esm2022/lib/img-manager-webelement.module.mjs +50 -0
- package/{esm2020 → esm2022}/lib/services/auth-credentials.service.mjs +4 -4
- package/esm2022/lib/services/event.service.mjs +40 -0
- package/esm2022/lib/services/fiche_products.service.mjs +253 -0
- package/esm2022/lib/services/webelement-image-manager-api.config.mjs +89 -0
- package/{esm2020 → esm2022}/public-api.mjs +1 -1
- package/{fesm2020 → fesm2022}/wizishop-img-manager-webelement.mjs +104 -97
- package/fesm2022/wizishop-img-manager-webelement.mjs.map +1 -0
- package/img-manager-webelement.scss +1 -0
- package/lib/img-manager-webelement.component.d.ts +2 -2
- package/lib/img-manager-webelement.module.d.ts +0 -3
- package/package.json +20 -25
- package/esm2020/lib/img-manager-webelement.component.mjs +0 -122
- package/esm2020/lib/img-manager-webelement.module.mjs +0 -58
- package/esm2020/lib/services/event.service.mjs +0 -37
- package/esm2020/lib/services/fiche_products.service.mjs +0 -242
- package/esm2020/lib/services/icon-webelement.service.mjs +0 -17
- package/esm2020/lib/services/webelement-image-manager-api.config.mjs +0 -88
- package/fesm2015/wizishop-img-manager-webelement.mjs +0 -660
- package/fesm2015/wizishop-img-manager-webelement.mjs.map +0 -1
- package/fesm2020/wizishop-img-manager-webelement.mjs.map +0 -1
- package/img-manager-webelement.css +0 -1
- package/lib/services/icon-webelement.service.d.ts +0 -6
- /package/{esm2020 → esm2022}/wizishop-img-manager-webelement.mjs +0 -0
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { forkJoin, fromEvent, Observable } from "rxjs";
|
|
4
|
-
import { take } from 'rxjs/operators';
|
|
5
|
-
import { environment } from '../environments/environment';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
import * as i2 from "@wizishop/img-manager";
|
|
9
|
-
import * as i3 from "./event.service";
|
|
10
|
-
import * as i4 from "./auth-credentials.service";
|
|
11
|
-
export class FicheProductService {
|
|
12
|
-
constructor(http, imgSelectionService, eventService, canvaService, authCredentialsService) {
|
|
13
|
-
this.http = http;
|
|
14
|
-
this.imgSelectionService = imgSelectionService;
|
|
15
|
-
this.eventService = eventService;
|
|
16
|
-
this.canvaService = canvaService;
|
|
17
|
-
this.authCredentialsService = authCredentialsService;
|
|
18
|
-
this.image_manager_api = environment.wizi_api + "/image-manager/shops/";
|
|
19
|
-
this.shopToken = this.authCredentialsService.getSync().data.token;
|
|
20
|
-
this.shopId = this.authCredentialsService.getSync().data.shop_id;
|
|
21
|
-
this.isPhotosTab = false; // State of the Photos tabs in fiche product page
|
|
22
|
-
this.isPreviousTabPhotos = false;
|
|
23
|
-
this.isVariantsTab = false;
|
|
24
|
-
this.loadProductImgSelection = false;
|
|
25
|
-
this.expectedMediaDto = {
|
|
26
|
-
id: '',
|
|
27
|
-
image_url: '',
|
|
28
|
-
image_width: '900',
|
|
29
|
-
image_height: '900',
|
|
30
|
-
};
|
|
31
|
-
this.subscriptions = [];
|
|
32
|
-
}
|
|
33
|
-
setApiConfig() {
|
|
34
|
-
const matches = window.location.pathname.match(/\/(\w+)\/products\/(\d+)\/edit/);
|
|
35
|
-
const lang = matches && matches[1] ? matches[1] : 'fr';
|
|
36
|
-
this.productSheetApiRoute = environment.wizi_admin_api + lang + environment.product_sheet_endpoint;
|
|
37
|
-
this.productId = matches && matches[2] ? matches[2] : "0";
|
|
38
|
-
this.isProductCreation = /\/products\/create/.test(window.location.pathname);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* There is only one instance of this img manager.
|
|
42
|
-
* But it is called with different config, by Photos tab and Variation tab, on fiche product page.
|
|
43
|
-
* The method handle the switch config between Photos and Variation tab.
|
|
44
|
-
* Return an observable : true => Photos tab / false => Variation tab.
|
|
45
|
-
* */
|
|
46
|
-
handleTabs() {
|
|
47
|
-
return new Observable(observer => {
|
|
48
|
-
const switchTabsSub = this.switchTabs().subscribe(data => {
|
|
49
|
-
if (!data || !data["detail"] || !data["detail"]["currentTab"]) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
// Retrieve current tab
|
|
53
|
-
const currentTab = data["detail"]["currentTab"];
|
|
54
|
-
this.isPreviousTabPhotos = this.isPhotosTab;
|
|
55
|
-
this.isPhotosTab = currentTab === 'photos';
|
|
56
|
-
this.isVariantsTab = currentTab === 'variation';
|
|
57
|
-
// The user switch to Photos tab
|
|
58
|
-
if (this.isPhotosTab) {
|
|
59
|
-
this.loadProductImgSelection = true;
|
|
60
|
-
if (!this.currentProductImgSelection || !this.currentProductImgSelection.length) {
|
|
61
|
-
this.initProductImgSelection();
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
this.applyCurrentImgSelection();
|
|
65
|
-
this.loadProductImgSelection = false;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else if (this.isPreviousTabPhotos) { // The user switch to another tab
|
|
69
|
-
// Save current img selection, in order to not lose the img selection
|
|
70
|
-
this.saveCurrentImgSelection();
|
|
71
|
-
}
|
|
72
|
-
observer.next(this.isPhotosTab);
|
|
73
|
-
});
|
|
74
|
-
this.subscriptions.push(switchTabsSub);
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
getShopImg(idFile) {
|
|
78
|
-
return this.http.get(`${this.image_manager_api}${this.shopId}/images/${idFile}`, this.getOptionsHeadersWithBearer());
|
|
79
|
-
}
|
|
80
|
-
initProductImgSelection() {
|
|
81
|
-
// Display the loader in img list selection
|
|
82
|
-
this.imgSelectionService.imgSelectedListLoading$.next(true);
|
|
83
|
-
// retrieve img selection
|
|
84
|
-
const retrieveImgSelectionSub = this.retrieveImgSelection().subscribe(data => {
|
|
85
|
-
// No image selected
|
|
86
|
-
if (!data || !data["photos"] || !data["photos"]["infos"] || !data["photos"]["infos"]["files"] || !data["photos"]["infos"]["files"].length) {
|
|
87
|
-
this.loadProductImgSelection = false;
|
|
88
|
-
this.imgSelectionService.imgSelectedListLoading$.next(false);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
const idImgSelectionList = data["photos"]["infos"]["files"];
|
|
92
|
-
const obsImg = [];
|
|
93
|
-
idImgSelectionList.forEach(idFile => obsImg.push(this.getShopImg(idFile.toString()).pipe(take(1))));
|
|
94
|
-
const allImgSub = forkJoin(obsImg).subscribe({
|
|
95
|
-
next: (photos) => {
|
|
96
|
-
// The img selection must be saved, otherwise it is lost when the user switch on variation tab
|
|
97
|
-
this.saveCurrentImgSelection(photos);
|
|
98
|
-
this.applyCurrentImgSelection();
|
|
99
|
-
this.loadProductImgSelection = false;
|
|
100
|
-
},
|
|
101
|
-
error: error => {
|
|
102
|
-
// Hide the loader in img list selection
|
|
103
|
-
this.loadProductImgSelection = false;
|
|
104
|
-
this.imgSelectionService.imgSelectedListLoading$.next(false);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
this.subscriptions.push(allImgSub);
|
|
108
|
-
});
|
|
109
|
-
this.subscriptions.push(retrieveImgSelectionSub);
|
|
110
|
-
this.canvaService.expectedImgSizesChange(this.expectedMediaDto);
|
|
111
|
-
}
|
|
112
|
-
retrieveInfoSelection() {
|
|
113
|
-
const formData = new FormData();
|
|
114
|
-
formData.append('rub', "main");
|
|
115
|
-
formData.append('action', "getInfos");
|
|
116
|
-
formData.append('prodId', this.productId);
|
|
117
|
-
formData.append('_token', '');
|
|
118
|
-
formData.append('_shid', this.shopId.toString());
|
|
119
|
-
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
120
|
-
}
|
|
121
|
-
retrieveImgSelection() {
|
|
122
|
-
const formData = new FormData();
|
|
123
|
-
formData.append('rub', "main");
|
|
124
|
-
formData.append('action', "getAllInfos");
|
|
125
|
-
formData.append('prodId', this.productId);
|
|
126
|
-
formData.append('_token', '');
|
|
127
|
-
formData.append('_shid', this.shopId.toString());
|
|
128
|
-
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
129
|
-
}
|
|
130
|
-
updateImgSelectionOnChange() {
|
|
131
|
-
// listen to the img manager change
|
|
132
|
-
const imgSelectionSub = this.imgSelectionService.imgSelection$.subscribe(imgSelectionList => {
|
|
133
|
-
if (!imgSelectionList) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
// Send the img selection
|
|
137
|
-
if (this.isPhotosTab && !this.loadProductImgSelection) {
|
|
138
|
-
// Retrieve only the img id
|
|
139
|
-
const idImgSelectedList = [];
|
|
140
|
-
imgSelectionList.forEach(img => {
|
|
141
|
-
idImgSelectedList.push(parseInt(img.id_file));
|
|
142
|
-
});
|
|
143
|
-
this.updateProductImgSelection(idImgSelectedList);
|
|
144
|
-
// On variation tab, send event with img selected
|
|
145
|
-
}
|
|
146
|
-
else if (!this.isPhotosTab && imgSelectionList.length) {
|
|
147
|
-
this.eventService.sendImgSelectedToPage(imgSelectionList[0]);
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
this.subscriptions.push(imgSelectionSub);
|
|
151
|
-
}
|
|
152
|
-
updateProductImgSelection(idsImgList) {
|
|
153
|
-
if ((!this.productId || this.productId === "0") && Wizi._produit.global.PROD_ID) {
|
|
154
|
-
this.productId = Wizi._produit.global.PROD_ID.toString();
|
|
155
|
-
}
|
|
156
|
-
Wizi._produit._dataTmp['photos'].infos = {};
|
|
157
|
-
Wizi._produit._dataTmp['photos'].infos.files = idsImgList;
|
|
158
|
-
this.emitImgSelectionChange(idsImgList);
|
|
159
|
-
if (this.productId && this.productId !== "0") {
|
|
160
|
-
const submitProd1 = this.submitProductImg(idsImgList).subscribe();
|
|
161
|
-
this.subscriptions.push(submitProd1);
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
const createProductSub = this.createProduct().subscribe((productId) => {
|
|
165
|
-
if (!productId) {
|
|
166
|
-
throw "No product id created. Can not link image(s) to the new product.";
|
|
167
|
-
}
|
|
168
|
-
Wizi._produit.global.PROD_ID = productId;
|
|
169
|
-
this.productId = productId.toString();
|
|
170
|
-
this.submitProductImg(idsImgList).subscribe();
|
|
171
|
-
});
|
|
172
|
-
this.subscriptions.push(createProductSub);
|
|
173
|
-
}
|
|
174
|
-
submitProductImg(idsImgList) {
|
|
175
|
-
const data = {
|
|
176
|
-
files: idsImgList,
|
|
177
|
-
couls: []
|
|
178
|
-
};
|
|
179
|
-
const formData = new FormData();
|
|
180
|
-
formData.append('rub', "photos");
|
|
181
|
-
formData.append('action', "save");
|
|
182
|
-
formData.append('newProd', this.isProductCreation ? "1" : "0");
|
|
183
|
-
formData.append('prodId', this.productId);
|
|
184
|
-
formData.append('_token', this.shopToken);
|
|
185
|
-
formData.append('_shid', this.shopId.toString());
|
|
186
|
-
formData.append('data', JSON.stringify(data));
|
|
187
|
-
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
188
|
-
}
|
|
189
|
-
createProduct() {
|
|
190
|
-
const formData = new FormData();
|
|
191
|
-
formData.append('rub', "main");
|
|
192
|
-
formData.append('action', "createProd");
|
|
193
|
-
formData.append('_token', '');
|
|
194
|
-
formData.append('_shid', this.shopId.toString());
|
|
195
|
-
return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
|
|
196
|
-
}
|
|
197
|
-
/* Use to know where the img manager is displayed, and to close it when switching tab */
|
|
198
|
-
switchTabs() {
|
|
199
|
-
return fromEvent(document.getElementById('imgManagerModule'), "switchTab");
|
|
200
|
-
}
|
|
201
|
-
emitImgSelectionChange(idsImgList) {
|
|
202
|
-
const value = {
|
|
203
|
-
detail: {
|
|
204
|
-
idsImgList
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
const event = new CustomEvent('onImgSelectionChange', value);
|
|
208
|
-
const imgManagerModule = document.getElementById('imgManagerModule');
|
|
209
|
-
imgManagerModule?.dispatchEvent(event);
|
|
210
|
-
}
|
|
211
|
-
saveCurrentImgSelection(imgSelection) {
|
|
212
|
-
this.currentProductImgSelection = imgSelection ? imgSelection : JSON.parse(JSON.stringify(this.imgSelectionService.getImgSelection()));
|
|
213
|
-
}
|
|
214
|
-
applyCurrentImgSelection() {
|
|
215
|
-
this.imgSelectionService.setImgSelection(this.currentProductImgSelection);
|
|
216
|
-
// Hide the loader in img list selection
|
|
217
|
-
this.imgSelectionService.imgSelectedListLoading$.next(false);
|
|
218
|
-
}
|
|
219
|
-
getOptionsHeaders() {
|
|
220
|
-
const header = { headers: new HttpHeaders({
|
|
221
|
-
'Access-Control-Allow-Origin': '*'
|
|
222
|
-
})
|
|
223
|
-
};
|
|
224
|
-
return header;
|
|
225
|
-
}
|
|
226
|
-
getOptionsHeadersWithBearer() {
|
|
227
|
-
const header = { headers: new HttpHeaders({
|
|
228
|
-
Authorization: 'Bearer ' + this.shopToken
|
|
229
|
-
})
|
|
230
|
-
};
|
|
231
|
-
return header;
|
|
232
|
-
}
|
|
233
|
-
ngOnDestroy() {
|
|
234
|
-
this.subscriptions.forEach(subscription => subscription.unsubscribe());
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
FicheProductService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FicheProductService, deps: [{ token: i1.HttpClient }, { token: i2.ImgSelectionService }, { token: i3.EventService }, { token: i2.CanvaService }, { token: i4.AuthCredentialsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
238
|
-
FicheProductService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FicheProductService });
|
|
239
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: FicheProductService, decorators: [{
|
|
240
|
-
type: Injectable
|
|
241
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ImgSelectionService }, { type: i3.EventService }, { type: i2.CanvaService }, { type: i4.AuthCredentialsService }]; } });
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmljaGVfcHJvZHVjdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYmVsZW1lbnQvc3JjL2xpYi9zZXJ2aWNlcy9maWNoZV9wcm9kdWN0cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7O0FBUTFELE1BQU0sT0FBTyxtQkFBbUI7SUFzQjlCLFlBQ1UsSUFBZ0IsRUFDaEIsbUJBQXdDLEVBQ3hDLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLHNCQUE4QztRQUo5QyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQXhCeEQsc0JBQWlCLEdBQVcsV0FBVyxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUMzRSxjQUFTLEdBQVcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckUsV0FBTSxHQUFXLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRXBFLGdCQUFXLEdBQVksS0FBSyxDQUFDLENBQUMsaURBQWlE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V0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQzs7Z0hBM1JVLG1CQUFtQjtvSEFBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsc1NlcnZpY2UgfSBmcm9tICcuL2F1dGgtY3JlZGVudGlhbHMuc2VydmljZSc7XG5pbXBvcnQgeyBJbWdQaWN0dXJlRFRPLCBJbWdTZWxlY3Rpb25TZXJ2aWNlLCBDYW52YVNlcnZpY2UgfSBmcm9tICdAd2l6aXNob3AvaW1nLW1hbmFnZXInO1xuaW1wb3J0IHsgV2l6aUJsb2NrTWVkaWFEdG8gfSBmcm9tICdAd2l6aXNob3AvaW1nLW1hbmFnZXIvbGliL2R0by93aXppLWJsb2NrLW1lZGlhLmR0byc7XG5cbmRlY2xhcmUgY29uc3QgV2l6aTogYW55O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmljaGVQcm9kdWN0U2VydmljZSB7XG5cbiAgcHJvZHVjdFNoZWV0QXBpUm91dGU6IHN0cmluZztcbiAgaW1hZ2VfbWFuYWdlcl9hcGk6IHN0cmluZyA9IGVudmlyb25tZW50LndpemlfYXBpICsgXCIvaW1hZ2UtbWFuYWdlci9zaG9wcy9cIjtcbiAgc2hvcFRva2VuOiBzdHJpbmcgPSB0aGlzLmF1dGhDcmVkZW50aWFsc1NlcnZpY2UuZ2V0U3luYygpLmRhdGEudG9rZW47XG4gIHNob3BJZDogbnVtYmVyID0gdGhpcy5hdXRoQ3JlZGVudGlhbHNTZXJ2aWNlLmdldFN5bmMoKS5kYXRhLnNob3BfaWQ7XG4gIHByb2R1Y3RJZDogc3RyaW5nO1xuICBpc1Bob3Rvc1RhYjogYm9vbGVhbiA9IGZhbHNlOyAvLyBTdGF0ZSBvZiB0aGUgUGhvdG9zIHRhYnMgaW4gZmljaGUgcHJvZHVjdCBwYWdlXG4gIGlzUHJldmlvdXNUYWJQaG90b3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNWYXJpYW50c1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2FkUHJvZHVjdEltZ1NlbGVjdGlvbjpib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRQcm9kdWN0SW1nU2VsZWN0aW9uOiBJbWdQaWN0dXJlRFRPW107XG4gIGlzUHJvZHVjdENyZWF0aW9uOiBib29sZWFuO1xuICBleHBlY3RlZE1lZGlhRHRvOldpemlCbG9ja01lZGlhRHRvID0ge1xuICAgIGlkOiAnJyxcbiAgICBpbWFnZV91cmw6ICcnLFxuICAgIGltYWdlX3dpZHRoOiAnOTAwJyxcbiAgICBpbWFnZV9oZWlnaHQ6ICc5MDAnLFxuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGltZ1NlbGVjdGlvblNlcnZpY2U6IEltZ1NlbGVjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNhbnZhU2VydmljZTogQ2FudmFTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aENyZWRlbnRpYWxzU2VydmljZTogQXV0aENyZWRlbnRpYWxzU2VydmljZVxuICAgICkge1xuICAgIH1cblxuICBzZXRBcGlDb25maWcoKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCggL1xcLyhcXHcrKVxcL3Byb2R1Y3RzXFwvKFxcZCspXFwvZWRpdC8pO1xuICAgIGNvbnN0IGxhbmcgPSBtYXRjaGVzICYmIG1hdGNoZXNbMV0gPyBtYXRjaGVzWzFdIDogJ2ZyJztcbiAgICB0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlID0gZW52aXJvbm1lbnQud2l6aV9hZG1pbl9hcGkgKyBsYW5nICsgZW52aXJvbm1lbnQucHJvZHVjdF9zaGVldF9lbmRwb2ludDtcbiAgICB0aGlzLnByb2R1Y3RJZCA9IG1hdGNoZXMgJiYgbWF0Y2hlc1syXSA/IG1hdGNoZXNbMl0gOiBcIjBcIjtcbiAgICB0aGlzLmlzUHJvZHVjdENyZWF0aW9uID0gL1xcL3Byb2R1Y3RzXFwvY3JlYXRlLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBpbWcgbWFuYWdlci5cbiAgICogQnV0IGl0IGlzIGNhbGxlZCB3aXRoIGRpZmZlcmVudCBjb25maWcsIGJ5IFBob3RvcyB0YWIgYW5kIFZhcmlhdGlvbiB0YWIsIG9uIGZpY2hlIHByb2R1Y3QgcGFnZS5cbiAgICogVGhlIG1ldGhvZCBoYW5kbGUgdGhlIHN3aXRjaCBjb25maWcgYmV0d2VlbiBQaG90b3MgYW5kIFZhcmlhdGlvbiB0YWIuXG4gICAqIFJldHVybiBhbiBvYnNlcnZhYmxlIDogdHJ1ZSA9PiBQaG90b3MgdGFiIC8gZmFsc2UgPT4gVmFyaWF0aW9uIHRhYi5cbiAgICogICovXG4gIGhhbmRsZVRhYnMoKTpPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuXG4gICAgICBjb25zdCBzd2l0Y2hUYWJzU3ViID1cbiAgICAgICAgdGhpcy5zd2l0Y2hUYWJzKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuXG4gICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhW1wiZGV0YWlsXCJdIHx8ICFkYXRhW1wiZGV0YWlsXCJdW1wiY3VycmVudFRhYlwiXSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmV0cmlldmUgY3VycmVudCB0YWJcbiAgICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gZGF0YVtcImRldGFpbFwiXVtcImN1cnJlbnRUYWJcIl07XG4gICAgICAgICAgdGhpcy5pc1ByZXZpb3VzVGFiUGhvdG9zID0gdGhpcy5pc1Bob3Rvc1RhYjtcbiAgICAgICAgICB0aGlzLmlzUGhvdG9zVGFiID0gY3VycmVudFRhYiA9PT0gJ3Bob3Rvcyc7XG4gICAgICAgICAgdGhpcy5pc1ZhcmlhbnRzVGFiID0gY3VycmVudFRhYiA9PT0gJ3ZhcmlhdGlvbic7XG5cbiAgICAgICAgICAvLyBUaGUgdXNlciBzd2l0Y2ggdG8gUGhvdG9zIHRhYlxuICAgICAgICAgIGlmICh0aGlzLmlzUGhvdG9zVGFiKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRQcm9kdWN0SW1nU2VsZWN0aW9uID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRQcm9kdWN0SW1nU2VsZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRQcm9kdWN0SW1nU2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLmluaXRQcm9kdWN0SW1nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudEltZ1NlbGVjdGlvbigpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRQcm9kdWN0SW1nU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQcmV2aW91c1RhYlBob3RvcykgeyAvLyBUaGUgdXNlciBzd2l0Y2ggdG8gYW5vdGhlciB0YWJcbiAgICAgICAgICAgIC8vIFNhdmUgY3VycmVudCBpbWcgc2VsZWN0aW9uLCBpbiBvcmRlciB0byBub3QgbG9zZSB0aGUgaW1nIHNlbGVjdGlvblxuICAgICAgICAgICAgdGhpcy5zYXZlQ3VycmVudEltZ1NlbGVjdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHRoaXMuaXNQaG90b3NUYWIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3dpdGNoVGFic1N1Yik7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTaG9wSW1nKGlkRmlsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmltYWdlX21hbmFnZXJfYXBpfSR7dGhpcy5zaG9wSWR9L2ltYWdlcy8ke2lkRmlsZX1gLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzV2l0aEJlYXJlcigpKTtcbiAgfVxuXG4gIGluaXRQcm9kdWN0SW1nU2VsZWN0aW9uKCkge1xuXG4gICAgLy8gRGlzcGxheSB0aGUgbG9hZGVyIGluIGltZyBsaXN0IHNlbGVjdGlvblxuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5pbWdTZWxlY3RlZExpc3RMb2FkaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgLy8gcmV0cmlldmUgaW1nIHNlbGVjdGlvblxuICAgIGNvbnN0IHJldHJpZXZlSW1nU2VsZWN0aW9uU3ViID1cbiAgICAgIHRoaXMucmV0cmlldmVJbWdTZWxlY3Rpb24oKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG5cbiAgICAgICAgLy8gTm8gaW1hZ2Ugc2VsZWN0ZWRcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhW1wicGhvdG9zXCJdIHx8ICFkYXRhW1wicGhvdG9zXCJdW1wiaW5mb3NcIl0gfHwgIWRhdGFbXCJwaG90b3NcIl1bXCJpbmZvc1wiXVtcImZpbGVzXCJdIHx8ICFkYXRhW1wicGhvdG9zXCJdW1wiaW5mb3NcIl1bXCJmaWxlc1wiXS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmxvYWRQcm9kdWN0SW1nU2VsZWN0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgICB0aGlzLmltZ1NlbGVjdGlvblNlcnZpY2UuaW1nU2VsZWN0ZWRMaXN0TG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWRJbWdTZWxlY3Rpb25MaXN0OiBudW1iZXJbXSA9IGRhdGFbXCJwaG90b3NcIl1bXCJpbmZvc1wiXVtcImZpbGVzXCJdO1xuICAgICAgICBjb25zdCBvYnNJbWc6IE9ic2VydmFibGU8YW55PltdID0gW107XG5cbiAgICAgICAgaWRJbWdTZWxlY3Rpb25MaXN0LmZvckVhY2goaWRGaWxlID0+XG4gICAgICAgICAgb2JzSW1nLnB1c2goXG4gICAgICAgICAgICB0aGlzLmdldFNob3BJbWcoaWRGaWxlLnRvU3RyaW5nKCkpLnBpcGUodGFrZSgxKSlcbiAgICAgICAgKSk7XG4gICAgICAgIGNvbnN0IGFsbEltZ1N1YiA9XG4gICAgICAgICAgZm9ya0pvaW4ob2JzSW1nKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHBob3RvczogSW1nUGljdHVyZURUT1tdKSA9PiB7XG4gICAgICAgICAgICAvLyBUaGUgaW1nIHNlbGVjdGlvbiBtdXN0IGJlIHNhdmVkLCBvdGhlcndpc2UgaXQgaXMgbG9zdCB3aGVuIHRoZSB1c2VyIHN3aXRjaCBvbiB2YXJpYXRpb24gdGFiXG4gICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50SW1nU2VsZWN0aW9uKHBob3Rvcyk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudEltZ1NlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5sb2FkUHJvZHVjdEltZ1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGxvYWRlciBpbiBpbWcgbGlzdCBzZWxlY3Rpb25cbiAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmltZ1NlbGVjdGVkTGlzdExvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgIH19KTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goYWxsSW1nU3ViKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gocmV0cmlldmVJbWdTZWxlY3Rpb25TdWIpO1xuICAgIHRoaXMuY2FudmFTZXJ2aWNlLmV4cGVjdGVkSW1nU2l6ZXNDaGFuZ2UodGhpcy5leHBlY3RlZE1lZGlhRHRvKTtcbiAgfVxuXG4gIHJldHJpZXZlSW5mb1NlbGVjdGlvbigpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgncnViJywgXCJtYWluXCIpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnYWN0aW9uJywgXCJnZXRJbmZvc1wiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3Byb2RJZCcsIHRoaXMucHJvZHVjdElkKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ190b2tlbicsICcnKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ19zaGlkJywgdGhpcy5zaG9wSWQudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5wcm9kdWN0U2hlZXRBcGlSb3V0ZSwgZm9ybURhdGEsIHRoaXMuZ2V0T3B0aW9uc0hlYWRlcnMoKSk7XG4gIH1cblxuICByZXRyaWV2ZUltZ1NlbGVjdGlvbigpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgncnViJywgXCJtYWluXCIpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnYWN0aW9uJywgXCJnZXRBbGxJbmZvc1wiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3Byb2RJZCcsIHRoaXMucHJvZHVjdElkKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ190b2tlbicsICcnKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ19zaGlkJywgdGhpcy5zaG9wSWQudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgfVxuXG4gIHVwZGF0ZUltZ1NlbGVjdGlvbk9uQ2hhbmdlKCkge1xuICAgIC8vIGxpc3RlbiB0byB0aGUgaW1nIG1hbmFnZXIgY2hhbmdlXG4gICAgY29uc3QgaW1nU2VsZWN0aW9uU3ViID1cbiAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5pbWdTZWxlY3Rpb24kLnN1YnNjcmliZShpbWdTZWxlY3Rpb25MaXN0ID0+IHtcbiAgICAgICAgaWYgKCFpbWdTZWxlY3Rpb25MaXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgaW1nIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5pc1Bob3Rvc1RhYiAmJiAhdGhpcy5sb2FkUHJvZHVjdEltZ1NlbGVjdGlvbikge1xuICAgICAgICAgIC8vIFJldHJpZXZlIG9ubHkgdGhlIGltZyBpZFxuICAgICAgICAgIGNvbnN0IGlkSW1nU2VsZWN0ZWRMaXN0OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGltZ1NlbGVjdGlvbkxpc3QuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgICAgICAgaWRJbWdTZWxlY3RlZExpc3QucHVzaChwYXJzZUludChpbWcuaWRfZmlsZSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0SW1nU2VsZWN0aW9uKGlkSW1nU2VsZWN0ZWRMaXN0KTtcblxuICAgICAgICAvLyBPbiB2YXJpYXRpb24gdGFiLCBzZW5kIGV2ZW50IHdpdGggaW1nIHNlbGVjdGVkXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNQaG90b3NUYWIgJiYgaW1nU2VsZWN0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zZW5kSW1nU2VsZWN0ZWRUb1BhZ2UoaW1nU2VsZWN0aW9uTGlzdFswXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGltZ1NlbGVjdGlvblN1Yik7XG4gIH1cblxuICB1cGRhdGVQcm9kdWN0SW1nU2VsZWN0aW9uKGlkc0ltZ0xpc3Q6IG51bWJlcltdKSB7XG4gICAgaWYgKCghdGhpcy5wcm9kdWN0SWQgfHwgdGhpcy5wcm9kdWN0SWQgPT09IFwiMFwiKSAmJiBXaXppLl9wcm9kdWl0Lmdsb2JhbC5QUk9EX0lEKSB7XG4gICAgICB0aGlzLnByb2R1Y3RJZCA9IFdpemkuX3Byb2R1aXQuZ2xvYmFsLlBST0RfSUQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBXaXppLl9wcm9kdWl0Ll9kYXRhVG1wWydwaG90b3MnXS5pbmZvcyA9IHt9O1xuICAgIFdpemkuX3Byb2R1aXQuX2RhdGFUbXBbJ3Bob3RvcyddLmluZm9zLmZpbGVzID0gaWRzSW1nTGlzdDtcbiAgICB0aGlzLmVtaXRJbWdTZWxlY3Rpb25DaGFuZ2UoaWRzSW1nTGlzdCk7XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0SWQgJiYgdGhpcy5wcm9kdWN0SWQgIT09IFwiMFwiKSB7XG4gICAgICBjb25zdCBzdWJtaXRQcm9kMSA9XG4gICAgICAgIHRoaXMuc3VibWl0UHJvZHVjdEltZyhpZHNJbWdMaXN0KS5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1Ym1pdFByb2QxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlUHJvZHVjdFN1YiA9XG4gICAgICB0aGlzLmNyZWF0ZVByb2R1Y3QoKS5zdWJzY3JpYmUoXG4gICAgICAgIChwcm9kdWN0SWQ6bnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKCFwcm9kdWN0SWQpIHtcbiAgICAgICAgICAgIHRocm93IFwiTm8gcHJvZHVjdCBpZCBjcmVhdGVkLiBDYW4gbm90IGxpbmsgaW1hZ2UocykgdG8gdGhlIG5ldyBwcm9kdWN0LlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBXaXppLl9wcm9kdWl0Lmdsb2JhbC5QUk9EX0lEID0gcHJvZHVjdElkO1xuXG4gICAgICAgICAgdGhpcy5wcm9kdWN0SWQgPSBwcm9kdWN0SWQudG9TdHJpbmcoKTtcbiAgICAgICAgICB0aGlzLnN1Ym1pdFByb2R1Y3RJbWcoaWRzSW1nTGlzdCkuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goY3JlYXRlUHJvZHVjdFN1Yik7XG5cbiAgfVxuXG4gIHN1Ym1pdFByb2R1Y3RJbWcoaWRzSW1nTGlzdDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgZmlsZXMgOiBpZHNJbWdMaXN0LFxuICAgICAgY291bHM6IFtdXG4gICAgfTtcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcInBob3Rvc1wiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FjdGlvbicsIFwic2F2ZVwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ25ld1Byb2QnLCB0aGlzLmlzUHJvZHVjdENyZWF0aW9uID8gXCIxXCIgOiBcIjBcIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdwcm9kSWQnLCB0aGlzLnByb2R1Y3RJZCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdfdG9rZW4nLCB0aGlzLnNob3BUb2tlbik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdfc2hpZCcsIHRoaXMuc2hvcElkLnRvU3RyaW5nKCkpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZGF0YScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgfVxuXG4gIGNyZWF0ZVByb2R1Y3QoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3J1YicsIFwibWFpblwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FjdGlvbicsIFwiY3JlYXRlUHJvZFwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ190b2tlbicsICcnKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ19zaGlkJywgdGhpcy5zaG9wSWQudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVtYmVyPih0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcblxuICB9XG5cbiAgLyogVXNlIHRvIGtub3cgd2hlcmUgdGhlIGltZyBtYW5hZ2VyIGlzIGRpc3BsYXllZCwgYW5kIHRvIGNsb3NlIGl0IHdoZW4gc3dpdGNoaW5nIHRhYiAqL1xuICBzd2l0Y2hUYWJzKCkge1xuICAgIHJldHVybiBmcm9tRXZlbnQ8YW55Pihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1nTWFuYWdlck1vZHVsZScpIGFzIGFueSwgXCJzd2l0Y2hUYWJcIik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbWdTZWxlY3Rpb25DaGFuZ2UoaWRzSW1nTGlzdDogbnVtYmVyW10pIHtcbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBpZHNJbWdMaXN0XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdvbkltZ1NlbGVjdGlvbkNoYW5nZScsIHZhbHVlKTtcbiAgICBjb25zdCBpbWdNYW5hZ2VyTW9kdWxlPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1nTWFuYWdlck1vZHVsZScpO1xuICAgIGltZ01hbmFnZXJNb2R1bGU/LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQ3VycmVudEltZ1NlbGVjdGlvbihpbWdTZWxlY3Rpb24/OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9kdWN0SW1nU2VsZWN0aW9uID0gaW1nU2VsZWN0aW9uID8gaW1nU2VsZWN0aW9uIDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmltZ1NlbGVjdGlvblNlcnZpY2UuZ2V0SW1nU2VsZWN0aW9uKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDdXJyZW50SW1nU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5zZXRJbWdTZWxlY3Rpb24odGhpcy5jdXJyZW50UHJvZHVjdEltZ1NlbGVjdGlvbik7XG4gICAgLy8gSGlkZSB0aGUgbG9hZGVyIGluIGltZyBsaXN0IHNlbGVjdGlvblxuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5pbWdTZWxlY3RlZExpc3RMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3B0aW9uc0hlYWRlcnMoKSB7XG4gICAgY29uc3QgaGVhZGVyID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6JyonXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIGhlYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3B0aW9uc0hlYWRlcnNXaXRoQmVhcmVyKCkge1xuICAgIGNvbnN0IGhlYWRlciA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgJyArIHRoaXMuc2hvcFRva2VuXG4gICAgICB9KVxuICAgIH07XG4gICAgcmV0dXJuIGhlYWRlcjtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gIH1cbn0iXX0=
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class IconWebelementService {
|
|
4
|
-
loadIconLib() {
|
|
5
|
-
const link = document.createElement('link');
|
|
6
|
-
link.href = 'https://pro.fontawesome.com/releases/v5.12.1/css/all.css';
|
|
7
|
-
link.rel = 'stylesheet';
|
|
8
|
-
link.crossOrigin = "anonymous";
|
|
9
|
-
document.getElementsByTagName('head')[0].appendChild(link);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
IconWebelementService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: IconWebelementService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
13
|
-
IconWebelementService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: IconWebelementService });
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: IconWebelementService, decorators: [{
|
|
15
|
-
type: Injectable
|
|
16
|
-
}] });
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi13ZWJlbGVtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbWctbWFuYWdlci13ZWJlbGVtZW50L3NyYy9saWIvc2VydmljZXMvaWNvbi13ZWJlbGVtZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUU5QixXQUFXO1FBQ0wsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLDBEQUEwRCxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7a0hBUk0scUJBQXFCO3NIQUFyQixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEljb25XZWJlbGVtZW50U2VydmljZSB7XG5cbiAgICBsb2FkSWNvbkxpYigpIHtcbiAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICAgIGxpbmsuaHJlZiA9ICdodHRwczovL3Byby5mb250YXdlc29tZS5jb20vcmVsZWFzZXMvdjUuMTIuMS9jc3MvYWxsLmNzcyc7XG4gICAgICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgICAgbGluay5jcm9zc09yaWdpbiA9IFwiYW5vbnltb3VzXCI7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIH1cblxufSJdfQ==
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { HttpHeaders } from "@angular/common/http";
|
|
2
|
-
import { Injectable, inject } from "@angular/core";
|
|
3
|
-
import { map, tap } from "rxjs";
|
|
4
|
-
import { environment } from '../environments/environment';
|
|
5
|
-
import { AuthCredentialsService } from "./auth-credentials.service";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
export class WebelementImageManagerApiService {
|
|
9
|
-
constructor(http) {
|
|
10
|
-
this.http = http;
|
|
11
|
-
this.authCredentialsService = inject(AuthCredentialsService);
|
|
12
|
-
this.shopId = this.authCredentialsService.getSync().data.shop_id;
|
|
13
|
-
this.shopToken = this.authCredentialsService.getSync().data.token;
|
|
14
|
-
this.CONFIG = {
|
|
15
|
-
image_manager_route: environment.wizi_api + "/image-manager/shops/" + this.shopId,
|
|
16
|
-
canva_token: 'wdByHayF5v57nj2ZSLvu055O',
|
|
17
|
-
canva_url: 'https://sdk.canva.com/designbutton/v2/api.js',
|
|
18
|
-
pexels_token: environment.pexels_token,
|
|
19
|
-
pexels_route: 'https://api.pexels.com/v1',
|
|
20
|
-
shop_category: 'other',
|
|
21
|
-
assets_route: environment.assets_route,
|
|
22
|
-
};
|
|
23
|
-
this.IMG_SIZE = {
|
|
24
|
-
url_raw_image: `${environment.CDN_URL}${this.shopId}/RAW-`,
|
|
25
|
-
url_100_image: `${environment.CDN_URL}${this.shopId}/m100-`,
|
|
26
|
-
url_200_image: `${environment.CDN_URL}${this.shopId}/cs200-`,
|
|
27
|
-
url_400_image: `${environment.CDN_URL}${this.shopId}/cs400-`,
|
|
28
|
-
url_800_image: `${environment.CDN_URL}${this.shopId}/cs800-`
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
getOptionsHeaders(params) {
|
|
32
|
-
const header = { headers: new HttpHeaders({
|
|
33
|
-
Authorization: 'Bearer ' + this.shopToken
|
|
34
|
-
})
|
|
35
|
-
};
|
|
36
|
-
if (params) {
|
|
37
|
-
header['params'] = params;
|
|
38
|
-
}
|
|
39
|
-
return header;
|
|
40
|
-
}
|
|
41
|
-
getShopCategory() {
|
|
42
|
-
return 'other';
|
|
43
|
-
}
|
|
44
|
-
getShopImgList(params) {
|
|
45
|
-
return this.http.get(`${this.CONFIG.image_manager_route}/images`, this.getOptionsHeaders(params));
|
|
46
|
-
}
|
|
47
|
-
getShopTotalImgList(params) {
|
|
48
|
-
return this.http.get(`${this.CONFIG.image_manager_route}/total/images`, this.getOptionsHeaders(params)).pipe(map(res => res.totalRecords));
|
|
49
|
-
}
|
|
50
|
-
getShopImg(idFile) {
|
|
51
|
-
return this.http.get(`${this.CONFIG.image_manager_route}/images/${idFile}`, this.getOptionsHeaders());
|
|
52
|
-
}
|
|
53
|
-
uploadFile(formData) {
|
|
54
|
-
return this.http.post(`${this.CONFIG.image_manager_route}/images/template`, formData, this.getOptionsHeaders());
|
|
55
|
-
}
|
|
56
|
-
uploadFileByUrl(url, fileName) {
|
|
57
|
-
return this.http.post(`${this.CONFIG.image_manager_route}/images/template`, { url, fileName }, this.getOptionsHeaders());
|
|
58
|
-
}
|
|
59
|
-
replaceImg(imageBase64, id_file) {
|
|
60
|
-
const body = {
|
|
61
|
-
imageBase64,
|
|
62
|
-
type: "RAW"
|
|
63
|
-
};
|
|
64
|
-
return this.http.put(`${this.CONFIG.image_manager_route}/images/${id_file}/replace`, body, this.getOptionsHeaders());
|
|
65
|
-
}
|
|
66
|
-
changeImgName(fileName, id_file) {
|
|
67
|
-
return this.http.put(`${this.CONFIG.image_manager_route}/images/${id_file}?file_name=${fileName}`, null, this.getOptionsHeaders());
|
|
68
|
-
}
|
|
69
|
-
removeImg(id_file) {
|
|
70
|
-
return this.http.delete(`${this.CONFIG.image_manager_route}/images/${id_file}`, this.getOptionsHeaders());
|
|
71
|
-
}
|
|
72
|
-
removeMultipleImg(id_array) {
|
|
73
|
-
return this.http.post(`${this.CONFIG.image_manager_route}/images-multiple-delete`, { id_array }, this.getOptionsHeaders());
|
|
74
|
-
}
|
|
75
|
-
setShopCategory(shopId) {
|
|
76
|
-
return this.http.get(`${environment.wizi_api}/shops/${shopId}`, this.getOptionsHeaders()).pipe(tap((shop => {
|
|
77
|
-
if (shop && shop['category']) {
|
|
78
|
-
this.CONFIG.shop_category = shop['category'];
|
|
79
|
-
}
|
|
80
|
-
})));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
WebelementImageManagerApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: WebelementImageManagerApiService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
84
|
-
WebelementImageManagerApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: WebelementImageManagerApiService });
|
|
85
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: WebelementImageManagerApiService, decorators: [{
|
|
86
|
-
type: Injectable
|
|
87
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZWxlbWVudC1pbWFnZS1tYW5hZ2VyLWFwaS5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbWctbWFuYWdlci13ZWJlbGVtZW50L3NyYy9saWIvc2VydmljZXMvd2ViZWxlbWVudC1pbWFnZS1tYW5hZ2VyLWFwaS5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBR3BFLE1BQU0sT0FBTyxnQ0FBZ0M7SUF3QnpDLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUF0Qm5CLDJCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3pFLFdBQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1RCxjQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFN0QsV0FBTSxHQUFHO1lBQ0wsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUNqRixXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLFNBQVMsRUFBRSw4Q0FBOEM7WUFDekQsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO1lBQ3RDLFlBQVksRUFBRSwyQkFBMkI7WUFDekMs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VUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQXBpU2VydmljZSwgSW1nUGljdHVyZXNEVE8sIEltZ1BpY3R1cmVEVE8gfSBmcm9tIFwiQHdpemlzaG9wL2ltZy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbHNTZXJ2aWNlIH0gZnJvbSBcIi4vYXV0aC1jcmVkZW50aWFscy5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXZWJlbGVtZW50SW1hZ2VNYW5hZ2VyQXBpU2VydmljZSBpbXBsZW1lbnRzIEFwaVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoQ3JlZGVudGlhbHNTZXJ2aWNlID0gaW5qZWN0KEF1dGhDcmVkZW50aWFsc1NlcnZpY2UpO1xuICAgIHNob3BJZCA9IHRoaXMuYXV0aENyZWRlbnRpYWxzU2VydmljZS5nZXRTeW5jKCkuZGF0YS5zaG9wX2lkO1xuICAgIHNob3BUb2tlbiA9IHRoaXMuYXV0aENyZWRlbnRpYWxzU2VydmljZS5nZXRTeW5jKCkuZGF0YS50b2tlbjtcblxuICAgIENPTkZJRyA9IHtcbiAgICAgICAgaW1hZ2VfbWFuYWdlcl9yb3V0ZTogZW52aXJvbm1lbnQud2l6aV9hcGkgKyBcIi9pbWFnZS1tYW5hZ2VyL3Nob3BzL1wiICsgdGhpcy5zaG9wSWQsXG4gICAgICAgIGNhbnZhX3Rva2VuOiAnd2RCeUhheUY1djU3bmoyWlNMdnUwNTVPJyxcbiAgICAgICAgY2FudmFfdXJsOiAnaHR0cHM6Ly9zZGsuY2FudmEuY29tL2Rlc2lnbmJ1dHRvbi92Mi9hcGkuanMnLFxuICAgICAgICBwZXhlbHNfdG9rZW46IGVudmlyb25tZW50LnBleGVsc190b2tlbixcbiAgICAgICAgcGV4ZWxzX3JvdXRlOiAnaHR0cHM6Ly9hcGkucGV4ZWxzLmNvbS92MScsXG4gICAgICAgIHNob3BfY2F0ZWdvcnk6ICdvdGhlcicsIC8vIFRoZSBzaG9wIGNhdGVnb3J5IGlzIHJldHJpZXZlIGxhdGVyIHdpdGggdGhlIHNldFNob3BDYXRlZ29yeSBtZXRob2RlXG4gICAgICAgIGFzc2V0c19yb3V0ZTogZW52aXJvbm1lbnQuYXNzZXRzX3JvdXRlLFxuICAgIH1cblxuICAgIElNR19TSVpFID0ge1xuICAgICAgICB1cmxfcmF3X2ltYWdlOiBgJHtlbnZpcm9ubWVudC5DRE5fVVJMfSR7dGhpcy5zaG9wSWR9L1JBVy1gLFxuICAgICAgICB1cmxfMTAwX2ltYWdlOiBgJHtlbnZpcm9ubWVudC5DRE5fVVJMfSR7dGhpcy5zaG9wSWR9L20xMDAtYCxcbiAgICAgICAgdXJsXzIwMF9pbWFnZTogYCR7ZW52aXJvbm1lbnQuQ0ROX1VSTH0ke3RoaXMuc2hvcElkfS9jczIwMC1gLFxuICAgICAgICB1cmxfNDAwX2ltYWdlOiBgJHtlbnZpcm9ubWVudC5DRE5fVVJMfSR7dGhpcy5zaG9wSWR9L2NzNDAwLWAsXG4gICAgICAgIHVybF84MDBfaW1hZ2U6IGAke2Vudmlyb25tZW50LkNETl9VUkx9JHt0aGlzLnNob3BJZH0vY3M4MDAtYFxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uc0hlYWRlcnMocGFyYW1zPzogSHR0cFBhcmFtcykge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAnICsgdGhpcy5zaG9wVG9rZW5cbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgICAgaGVhZGVyWydwYXJhbXMnXSA9IHBhcmFtc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXI7XG4gICAgfVxuXG4gICAgZ2V0U2hvcENhdGVnb3J5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgIH1cblxuICAgIGdldFNob3BJbWdMaXN0KHBhcmFtcz86IEh0dHBQYXJhbXMpOiBPYnNlcnZhYmxlPEltZ1BpY3R1cmVzRFRPPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEltZ1BpY3R1cmVzRFRPPihgJHt0aGlzLkNPTkZJRy5pbWFnZV9tYW5hZ2VyX3JvdXRlfS9pbWFnZXNgLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKHBhcmFtcykpO1xuICAgIH1cblxuICAgIGdldFNob3BUb3RhbEltZ0xpc3QocGFyYW1zPzogSHR0cFBhcmFtcykge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7dG90YWxSZWNvcmRzOiBudW1iZXJ9PihgJHt0aGlzLkNPTkZJRy5pbWFnZV9tYW5hZ2VyX3JvdXRlfS90b3RhbC9pbWFnZXNgLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKHBhcmFtcykpLnBpcGUobWFwKHJlcyA9PiByZXMudG90YWxSZWNvcmRzKSk7XG4gICAgfVxuXG4gICAgZ2V0U2hvcEltZyhpZEZpbGU6IHN0cmluZyk6IE9ic2VydmFibGU8SW1nUGljdHVyZURUTz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJbWdQaWN0dXJlRFRPPihgJHt0aGlzLkNPTkZJRy5pbWFnZV9tYW5hZ2VyX3JvdXRlfS9pbWFnZXMvJHtpZEZpbGV9YCwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgICB9XG5cbiAgICB1cGxvYWRGaWxlKGZvcm1EYXRhOiBGb3JtRGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SW1nUGljdHVyZURUTz4oYCR7dGhpcy5DT05GSUcuaW1hZ2VfbWFuYWdlcl9yb3V0ZX0vaW1hZ2VzL3RlbXBsYXRlYCwgZm9ybURhdGEsIHRoaXMuZ2V0T3B0aW9uc0hlYWRlcnMoKSk7XG4gICAgfVxuXG4gICAgdXBsb2FkRmlsZUJ5VXJsKHVybDogc3RyaW5nLCBmaWxlTmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SW1nUGljdHVyZURUTz4oYCR7dGhpcy5DT05GSUcuaW1hZ2VfbWFuYWdlcl9yb3V0ZX0vaW1hZ2VzL3RlbXBsYXRlYCwgeyB1cmwsIGZpbGVOYW1lIH0sIHRoaXMuZ2V0T3B0aW9uc0hlYWRlcnMoKSk7XG4gICAgfVxuXG4gICAgcmVwbGFjZUltZyhpbWFnZUJhc2U2NDogc3RyaW5nLCBpZF9maWxlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgIGltYWdlQmFzZTY0LFxuICAgICAgICAgICAgdHlwZSA6IFwiUkFXXCJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxJbWdQaWN0dXJlRFRPPihgJHt0aGlzLkNPTkZJRy5pbWFnZV9tYW5hZ2VyX3JvdXRlfS9pbWFnZXMvJHtpZF9maWxlfS9yZXBsYWNlYCwgYm9keSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VJbWdOYW1lKGZpbGVOYW1lOiBzdHJpbmcsIGlkX2ZpbGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxJbWdQaWN0dXJlRFRPPihgJHt0aGlzLkNPTkZJRy5pbWFnZV9tYW5hZ2VyX3JvdXRlfS9pbWFnZXMvJHtpZF9maWxlfT9maWxlX25hbWU9JHtmaWxlTmFtZX1gLCBudWxsLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKCkpO1xuICAgIH1cblxuICAgIHJlbW92ZUltZyhpZF9maWxlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8SW1nUGljdHVyZURUTz4oYCR7dGhpcy5DT05GSUcuaW1hZ2VfbWFuYWdlcl9yb3V0ZX0vaW1hZ2VzLyR7aWRfZmlsZX1gLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKCkpO1xuICAgIH1cblxuICAgIHJlbW92ZU11bHRpcGxlSW1nKGlkX2FycmF5OiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8SW1nUGljdHVyZURUT1tdPihgJHt0aGlzLkNPTkZJRy5pbWFnZV9tYW5hZ2VyX3JvdXRlfS9pbWFnZXMtbXVsdGlwbGUtZGVsZXRlYCwgeyBpZF9hcnJheSB9LCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKCkpO1xuICAgIH1cblxuICAgIHNldFNob3BDYXRlZ29yeShzaG9wSWQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7XG4gICAgICAgICAgICBjYXRlZ29yeTogc3RyaW5nXG4gICAgICAgIH0+KGAke2Vudmlyb25tZW50LndpemlfYXBpfS9zaG9wcy8ke3Nob3BJZH1gLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKCkpLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHNob3AgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG9wICYmIHNob3BbJ2NhdGVnb3J5J10pIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuQ09ORklHLnNob3BfY2F0ZWdvcnkgPSBzaG9wWydjYXRlZ29yeSddO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG59Il19
|