@sumaris-net/ngx-components 0.25.2 → 0.25.6
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/bundles/sumaris-net.ngx-components.umd.js +169 -59
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/esm2015/src/app/core/install/install-upgrade-card.component.js +102 -52
- package/esm2015/src/app/core/services/model/peer.model.js +15 -2
- package/esm2015/src/app/core/services/platform.service.js +23 -6
- package/fesm2015/sumaris-net.ngx-components.js +133 -54
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/src/app/core/install/install-upgrade-card.component.d.ts +11 -6
- package/src/app/core/services/model/peer.model.d.ts +1 -0
- package/src/app/core/services/platform.service.d.ts +2 -0
- package/src/assets/i18n/fr.json +3 -2
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -67,6 +67,7 @@ export class PlatformService {
|
|
|
67
67
|
this.browser = browser;
|
|
68
68
|
this.downloader = downloader;
|
|
69
69
|
this._started = false;
|
|
70
|
+
this._downloadingPromise = new Map();
|
|
70
71
|
this._debug = !environment.production;
|
|
71
72
|
if (this._debug)
|
|
72
73
|
console.debug('[platform] Creating service');
|
|
@@ -182,15 +183,28 @@ export class PlatformService {
|
|
|
182
183
|
window.open(url, target, features, replace);
|
|
183
184
|
}
|
|
184
185
|
}
|
|
186
|
+
getDownloadingPromise(uri) {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
+
return this._downloadingPromise.get(uri);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
185
191
|
download(request) {
|
|
186
192
|
return __awaiter(this, void 0, void 0, function* () {
|
|
187
193
|
if (!request || !request.uri)
|
|
188
194
|
throw new Error('Missing argument \'request\' or \'request.uri\'');
|
|
189
195
|
if (this._android && this.downloader) {
|
|
190
|
-
|
|
196
|
+
// Check if not already downloading file
|
|
197
|
+
let promise = this._downloadingPromise.get(request.uri);
|
|
198
|
+
if (promise)
|
|
199
|
+
return promise;
|
|
200
|
+
request = Object.assign({ visibleInDownloadsUi: true, notificationVisibility: NotificationVisibility.VisibleNotifyCompleted, title: request.title || request.filename }, request);
|
|
191
201
|
try {
|
|
192
202
|
console.debug('[platform] Downloading, using request: ' + JSON.stringify(request));
|
|
193
|
-
|
|
203
|
+
// Start download
|
|
204
|
+
promise = this.downloader.download(request);
|
|
205
|
+
// Remember this request uri
|
|
206
|
+
this._downloadingPromise.set(request.uri, promise);
|
|
207
|
+
const location = yield promise;
|
|
194
208
|
console.info('[platform] File successfully downloaded at:' + location);
|
|
195
209
|
return location;
|
|
196
210
|
}
|
|
@@ -198,12 +212,15 @@ export class PlatformService {
|
|
|
198
212
|
console.error('[platform] Unable to download: ' + (err && err.message || err));
|
|
199
213
|
throw err;
|
|
200
214
|
}
|
|
215
|
+
finally {
|
|
216
|
+
// Forget the request
|
|
217
|
+
this._downloadingPromise.delete(request.uri);
|
|
218
|
+
}
|
|
201
219
|
}
|
|
202
|
-
// Fallback (
|
|
203
|
-
// Web mode: open URI using the browser
|
|
220
|
+
// Fallback (if not Android and Cordova): opening the URI using the browser
|
|
204
221
|
// TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)
|
|
205
222
|
else {
|
|
206
|
-
console.warn('[platform] Cannot use
|
|
223
|
+
console.warn('[platform] Cannot use Android downloader: using browser open()');
|
|
207
224
|
this.open(request.uri, '_system', 'location=no', true);
|
|
208
225
|
return undefined;
|
|
209
226
|
}
|
|
@@ -414,4 +431,4 @@ PlatformService.ctorParameters = () => [
|
|
|
414
431
|
{ type: InAppBrowser, decorators: [{ type: Optional }] },
|
|
415
432
|
{ type: Downloader, decorators: [{ type: Optional }] }
|
|
416
433
|
];
|
|
417
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxRQUFRLElBQUksV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFtQixRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssY0FBYyxNQUFNLFFBQVEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLEVBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDcEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxVQUFVLEVBQW1CLHNCQUFzQixFQUFDLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRWpHLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQztBQUc5QixNQUFNLE9BQU8sZUFBZTtJQW1CMUIsWUFDVSxRQUFrQixFQUNsQixXQUF3QixFQUN4QixlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixXQUE4QixFQUM5QixlQUFnQyxFQUNoQyxRQUE4QixFQUM5QixjQUE4QixFQUM5QixjQUE4QixFQUM5QixhQUE0QixFQUM1QixLQUFtQixFQUNuQixPQUFnQixFQUNoQixhQUE0QixFQUNMLFdBQVcsRUFDdEIsU0FBb0IsRUFDcEIsUUFBa0IsRUFDbEIsWUFBMEIsRUFDMUIsT0FBcUIsRUFDckIsVUFBc0I7UUFsQmxDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFtQjtRQUM5QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsYUFBUSxHQUFSLFFBQVEsQ0FBc0I7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDTCxnQkFBVyxHQUFYLFdBQVcsQ0FBQTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBbkNwQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBc0N2QixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFsQ0QsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUE4QkQsRUFBRSxDQUFDLFlBQXVCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDNUMsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2FBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFFVCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6RiwyQkFBMkI7WUFDM0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQ3RDO1lBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUMvQixJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDN0MsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFO1lBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO1NBQzNCLENBQUMsQ0FBQzthQUNGLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxJQUFJLENBQUMsT0FBTyxjQUFjLElBQUksQ0FBQyxPQUFPLGtCQUFrQixJQUFJLENBQUMsV0FBVyxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBRWpLLGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztZQUVyRyw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNO2lCQUN0QixJQUFJLENBQ0gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQWtCLENBQUMsRUFDeEYsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUN2QixvQkFBb0IsRUFBRSxDQUN2QjtpQkFDQSxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztZQUVMLHVEQUF1RDtZQUN2RCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLFlBQVk7b0JBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFaEQscUJBQXFCO2dCQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDO1lBQ0EsZUFBZTthQUNkLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBRUw7UUFDQyxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUM7UUFDL0MsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7YUFDekIsSUFBSTtRQUNILGNBQWM7UUFDZCx1RUFBdUU7UUFDdkUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDM0IsS0FBSyxFQUFFLENBQ1IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxDQUFDLEdBQVcsRUFBRSxNQUFlLEVBQUUsUUFBaUIsRUFBRSxPQUFpQjtRQUNyRSxPQUFPLENBQUMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbkQ7YUFDSTtZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRUssUUFBUSxDQUFDLE9BQXFFOztZQUNsRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ2pHLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNwQyxPQUFPLG1CQUNMLG9CQUFvQixFQUFFLElBQUksRUFDMUIsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUMsc0JBQXNCLElBQ2xFLE9BQU8sQ0FNWCxDQUFDO2dCQUVGLElBQUk7b0JBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBRW5GLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBRXpELE9BQU8sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLEdBQUcsUUFBUSxDQUFDLENBQUM7b0JBQ3ZFLE9BQU8sUUFBUSxDQUFDO2lCQUNqQjtnQkFDRCxPQUFNLEdBQUcsRUFBRTtvQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDL0UsTUFBTSxHQUFHLENBQUM7aUJBQ1g7YUFDRjtZQUNELHdCQUF3QjtZQUN4Qix1Q0FBdUM7WUFDdkMsbUpBQW1KO2lCQUM5STtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7Z0JBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLFNBQVMsQ0FBQzthQUNsQjtRQUNILENBQUM7S0FBQTtJQUVELDZCQUE2QjtJQUVuQix1QkFBdUIsQ0FBQyxNQUFlO1FBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUUxRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFDO1FBRUQsNkRBQTZEO1FBQzdELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixnRkFBZ0Y7WUFDaEYsMkZBQTJGO1lBQzNGLHlGQUF5RjtZQUN6Rix1REFBdUQ7WUFDdkQsbUJBQW1CO1lBQ25CLEtBQUs7U0FDTjtJQUNILENBQUM7SUFHUyxrQkFBa0I7UUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBRWhELGtHQUFrRztRQUNsRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTlELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtnQkFFdkIsd0JBQXdCO2dCQUN4QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUN2QixLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztpQkFDdEI7Z0JBRUQsb0JBQW9CO2dCQUNwQixJQUFJO29CQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7aUJBQzdEO2dCQUNDLDJCQUEyQjtnQkFDN0IsT0FBTyxHQUFHLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO2lCQUM3RTtnQkFFRCxzQkFBc0I7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO2dCQUNyRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDN0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDbEUsSUFBSSxhQUFhLElBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzt3QkFDbEIsTUFBTSxFQUFFLGFBQWE7cUJBQ3RCLENBQUMsQ0FBQztpQkFDSjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsY0FBYyxDQUFDLE1BQWdCO1FBQ3ZDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsYUFBYTtRQUN2RSxPQUFPLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxNQUFNLG1CQUFtQixRQUFRLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3JJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx1Q0FBdUM7SUFDakYsQ0FBQztJQUVlLFlBQVk7O1lBRTFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztZQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRS9CLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7Z0JBQ3pGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoQztZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsNENBQTRDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLGVBQWUsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQy9JLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVoTyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQUE7SUFFZSxjQUFjLENBQUMsTUFBbUI7O1lBQ2hELE1BQU0sVUFBVSxHQUFHLE1BQU07Z0JBQ3ZCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUsscUJBQXFCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUNwSCxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3RSxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPLENBQUMsT0FBTztZQUVoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUN0QyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUk7Z0JBQzFCLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUztnQkFDcEMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQzFDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXBDLDZDQUE2QztZQUM3QyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdEIsMkNBQTJDO2dCQUMzQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxlQUFlLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlJLE1BQU0sU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ2hDO1lBQ0QsMERBQTBEO2lCQUNyRDtnQkFFSCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQztnQkFFekQsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUMsT0FBTyxFQUFFLDZCQUE2QjtvQkFDdEUsUUFBUSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7Z0JBQ3RCLElBQUk7b0JBQ0YsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7b0JBRTNFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7b0JBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2pFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLE9BQU8sRUFBRSw2QkFBNkI7d0JBQzFELElBQUksRUFBRSxNQUFNO3dCQUNaLGVBQWUsRUFBRSxJQUFJO3FCQUN0QixDQUFDLENBQUM7b0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO29CQUUzRCx3QkFBd0I7b0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLGVBQWUsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDL0csTUFBTSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQ2hDO2dCQUNELE9BQU8sR0FBRyxFQUFFO29CQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM5QyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUMsT0FBTyxFQUFFLDZCQUE2Qjt3QkFDMUQsSUFBSSxFQUFFLE9BQU87d0JBQ2IsZUFBZSxFQUFFLElBQUk7cUJBQ3RCLENBQUMsQ0FBQztpQkFDSjthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBRVMsU0FBUyxDQUFDLElBQXNCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNsRyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLGtDQUN2RSxJQUFJLEtBQ1AsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQ2hDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFZSxjQUFjLENBQUMsR0FBRzs7WUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLE9BQU8sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDeEMsTUFBTSxjQUFjLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEYsNkdBQTZHO1lBQzdHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUU7Z0JBQy9DLE9BQU8sR0FBRywwQkFBMEIsQ0FBQzthQUN0QztZQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3hELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLE9BQU8sSUFBSSxXQUFXLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztpQkFDbkM7YUFDRjtpQkFDSTtnQkFDSCxPQUFPLEdBQUcsNkRBQTZELEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sZUFBZSxPQUFPLElBQUksQ0FBQzthQUM1SDtZQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDeEIsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLE9BQU8sSUFBSSxlQUFlLGNBQWMsVUFBVSxDQUFDO2lCQUNwRDtnQkFDRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ25CLElBQUksRUFBRSxPQUFPO29CQUNiLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ1osZUFBZSxFQUFFLElBQUk7b0JBQ3JCLE9BQU87aUJBQ1IsQ0FBQyxDQUFDO2FBQ0o7aUJBQ0ksSUFBSSxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLE9BQU8sSUFBSSxnQkFBZ0IsY0FBYyxJQUFJLENBQUM7aUJBQy9DO2dCQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkI7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU87b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdEO1FBQ0gsQ0FBQztLQUFBOzs7O1lBN1pGLFVBQVUsU0FBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OztZQTlCeEIsUUFBUTtZQVNJLFdBQVc7WUFUYixlQUFlO1lBaUJ6QixnQkFBZ0I7WUFRaEIsaUJBQWlCO1lBWGpCLGVBQWU7WUFSZixvQkFBb0I7WUFMTCxjQUFjO1lBa0I3QixjQUFjO1lBSWQsYUFBYTtZQWhCYixZQUFZO1lBTVosT0FBTztZQUxQLGFBQWE7NENBd0RoQixNQUFNLFNBQUMsV0FBVztZQTVEZixTQUFTLHVCQTZEWixRQUFRO1lBNURMLFFBQVEsdUJBNkRYLFFBQVE7WUEvREwsWUFBWSx1QkFnRWYsUUFBUTtZQXhETCxZQUFZLHVCQXlEZixRQUFRO1lBMUNMLFVBQVUsdUJBMkNiLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge0F1dGhUb2tlblR5cGUsIE5ldHdvcmtTZXJ2aWNlfSBmcm9tICcuL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge1BsYXRmb3Jtc30gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHtTcGxhc2hTY3JlZW59IGZyb20gJ0Bpb25pYy1uYXRpdmUvc3BsYXNoLXNjcmVlbi9uZ3gnO1xuaW1wb3J0IHtTdGF0dXNCYXJ9IGZyb20gJ0Bpb25pYy1uYXRpdmUvc3RhdHVzLWJhci9uZ3gnO1xuaW1wb3J0IHtLZXlib2FyZH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9rZXlib2FyZC9uZ3gnO1xuaW1wb3J0IHtMb2NhbFNldHRpbmdzU2VydmljZX0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7Q2FjaGVTZXJ2aWNlfSBmcm9tICdpb25pYy1jYWNoZSc7XG5pbXBvcnQge0F1ZGlvUHJvdmlkZXJ9IGZyb20gJy4uLy4uL3NoYXJlZC9hdWRpby9hdWRpbyc7XG5pbXBvcnQge1BsYXRmb3JtIGFzIENka1BsYXRmb3JtfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuXG5pbXBvcnQge0luQXBwQnJvd3Nlcn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9pbi1hcHAtYnJvd3Nlci9uZ3gnO1xuaW1wb3J0IHtpc0VtcHR5QXJyYXksIGlzTmlsLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmt9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtTdG9yYWdlfSBmcm9tICdAaW9uaWMvc3RvcmFnZSc7XG5pbXBvcnQge0VudGl0aWVzU3RvcmFnZX0gZnJvbSAnLi9zdG9yYWdlL2VudGl0aWVzLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQge1N0b3JhZ2VVdGlsc30gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0b3JhZ2UudXRpbHMnO1xuaW1wb3J0IHtTaG93VG9hc3RPcHRpb25zLCBUb2FzdHN9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCAqIGFzIG1vbWVudEltcG9ydGVkIGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0FjY291bnRTZXJ2aWNlfSBmcm9tICcuL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQge3RpbWVyfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3QsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQge0NPUkVfQ09ORklHX09QVElPTlN9IGZyb20gJy4vY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7TW9tZW50RGF0ZUFkYXB0ZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7RG93bmxvYWRlciwgRG93bmxvYWRSZXF1ZXN0LCBOb3RpZmljYXRpb25WaXNpYmlsaXR5fSBmcm9tICdAaW9uaWMtbmF0aXZlL2Rvd25sb2FkZXIvbmd4JztcblxuY29uc3QgbW9tZW50ID0gbW9tZW50SW1wb3J0ZWQ7XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtU2VydmljZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVidWc6IGJvb2xlYW47XG4gIHByaXZhdGUgX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc3RhcnRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIF9tb2JpbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NvcmRvdmE6IGJvb2xlYW47XG4gIHByaXZhdGUgX2FuZHJvaWQ6IGJvb2xlYW47XG5cbiAgdG91Y2hVaTogYm9vbGVhbjtcblxuICBnZXQgc3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRlZDtcbiAgfVxuXG4gIGdldCBtb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTm90TmlsKHRoaXMuX21vYmlsZSkgPyB0aGlzLl9tb2JpbGUgOiB0aGlzLnBsYXRmb3JtLmlzKCdtb2JpbGUnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgcHJpdmF0ZSBlbnRpdGllc1N0b3JhZ2U6IEVudGl0aWVzU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIG5ldHdvcmtTZXJ2aWNlOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWNoZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIGF1ZGlvUHJvdmlkZXI6IEF1ZGlvUHJvdmlkZXIsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3RhdHVzQmFyOiBTdGF0dXNCYXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBrZXlib2FyZDogS2V5Ym9hcmQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBzcGxhc2hTY3JlZW46IFNwbGFzaFNjcmVlbixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGJyb3dzZXI6IEluQXBwQnJvd3NlcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRvd25sb2FkZXI6IERvd25sb2FkZXIsXG4gICkge1xuXG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgaXMocGxhdGZvcm1OYW1lOiBQbGF0Zm9ybXMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheSBpZiBvcGVuZWQgaGFzIGJlZW4gb3BlbmVkIGZyb20gYSB3ZWIgYnJvd3NlciAoYW5kIE5PVCBpbnNpZGUgYW4gQW5kcm9pZCBvciBpT3MgQXBwKS5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzV2ViT3JEZXNrdG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJykgfHwgdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxld2ViJyk7XG4gIH1cblxuICBpc0FuZHJvaWRDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkICYmIHRoaXMuX2NvcmRvdmE7XG4gIH1cblxuICBnZXQgY2FuRG93bmxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FuZHJvaWQgJiYgISF0aGlzLmRvd25sb2FkZXI7XG4gIH1cblxuICB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLndpZHRoKCk7XG4gIH1cblxuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS5oZWlnaHQoKTtcbiAgfVxuXG4gIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9zdGFydFByb21pc2UpIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdW5kZWZpbmVkO1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybS4uLicpO1xuXG4gICAgdGhpcy5fc3RhcnRQcm9taXNlID0gdGhpcy5wbGF0Zm9ybS5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG5cbiAgICAgICAgdGhpcy5fbW9iaWxlID0gdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJyk7XG4gICAgICAgIHRoaXMuX2NvcmRvdmEgPSB0aGlzLnBsYXRmb3JtLmlzKCdjb3Jkb3ZhJyk7XG4gICAgICAgIHRoaXMuX2FuZHJvaWQgPSB0aGlzLnBsYXRmb3JtLmlzKCdhbmRyb2lkJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmVDb3Jkb3ZhUGx1Z2lucyh0aGlzLl9tb2JpbGUpO1xuICAgICAgICB0aGlzLnRvdWNoVWkgPSB0aGlzLl9tb2JpbGUgfHwgdGhpcy5wbGF0Zm9ybS5pcygndGFibGV0JykgfHwgdGhpcy5wbGF0Zm9ybS5pcygncGhhYmxldCcpO1xuXG4gICAgICAgIC8vIEZvcmNlIG1vYmlsZSBpbiBzZXR0aW5nc1xuICAgICAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5tb2JpbGUgPSB0aGlzLl9tb2JpbGU7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy50b3VjaFVpID0gdGhpcy50b3VjaFVpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmVUcmFuc2xhdGUoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHRoaXMuc3RvcmFnZVJlYWR5KCkpXG4gICAgLnRoZW4oKGZvcmFnZSkgPT4gdGhpcy5taWdyYXRlU3RvcmFnZShmb3JhZ2UpKVxuICAgIC50aGVuKCgpID0+IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZW50aXRpZXNTdG9yYWdlLnJlYWR5KCksXG4gICAgICB0aGlzLmNhY2hlLnJlYWR5KCkudGhlbigoKSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKCkpLFxuICAgICAgdGhpcy5zZXR0aW5ncy5yZWFkeSgpLFxuICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5yZWFkeSgpLFxuICAgICAgdGhpcy5hdWRpb1Byb3ZpZGVyLnJlYWR5KClcbiAgICBdKSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybSBbT0tdIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgdG91Y2hVaTogJHt0aGlzLnRvdWNoVWl9LCBjYW5Eb3dubG9hZDogJHt0aGlzLmNhbkRvd25sb2FkfX0gaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZSBjb25maWd1cmF0aW9uIHdoZW4gbmV0d29yayBjaGFuZ2VkXG4gICAgICB0aGlzLm5ldHdvcmtTZXJ2aWNlLm9uTmV0d29ya1N0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCh0eXBlKSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKHR5cGUgIT09ICdub25lJykpO1xuXG4gICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZ1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoY29uZmlnID0+IGNvbmZpZz8uZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX1RPS0VOX1RZUEUpIGFzIEF1dGhUb2tlblR5cGUpLFxuICAgICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHRva2VuVHlwZSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdG9rZW5UeXBlO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gV2FpdCAxIG1vcmUgc2Vjb25kcywgYmVmb3JlIGhpZGluZyB0aGUgc3BsYXNoIHNjcmVlblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNwbGFzaFNjcmVlbikgdGhpcy5zcGxhc2hTY3JlZW4uaGlkZSgpO1xuXG4gICAgICAgIC8vIFBsYXkgc3RhcnR1cCBzb3VuZFxuICAgICAgICB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSlcbiAgICAgIC8vIE1hbmFnZSBlcnJvclxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLm9uU3RhcnR1cEVycm9yKGVycikpO1xuICAgIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBwbGF0Zm9ybSBpcyByZWFkeS48YnIvPlxuICAgKiBJbXBvcnRhbnQ6IHRoaXMgd2lsbCBOT1Qgc3RhcnQgdGhlIHBsYXRmb3JtLCBoYXMgaXQgc2hvdWxkIGJlIHN0YXJ0ZWQgYnkgdGhlIEFwcENvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgcmVhZHkob3B0cz86IHtcbiAgICBjaGVja1BlcmlvZDogbnVtYmVyO1xuICB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBwZXJpb2QgPSBvcHRzICYmIG9wdHMuY2hlY2tQZXJpb2QgfHwgMzAwO1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIHRpbWVyKHBlcmlvZCwgcGVyaW9kKVxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIEZvciBERUJVRyA6XG4gICAgICAgIC8vdGFwKCgpID0+IHRoaXMuX2RlYnVnICYmIGNvbnNvbGUuZGVidWcoXCJXYWl0aW5nIHBsYXRmb3JtIHJlYWR5Li4uXCIpKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX3N0YXJ0ZWQpLFxuICAgICAgICBmaXJzdCgpXG4gICAgICApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgb3Blbih1cmw6IHN0cmluZywgdGFyZ2V0Pzogc3RyaW5nLCBmZWF0dXJlcz86IHN0cmluZywgcmVwbGFjZT86IGJvb2xlYW4pIHtcbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gT3BlbmluZyBsaW5rOiAke3VybH1gKTtcbiAgICBpZiAodGhpcy5icm93c2VyICYmIHRoaXMuX21vYmlsZSkge1xuICAgICAgdGhpcy5icm93c2VyLmNyZWF0ZSh1cmwsIHRhcmdldCwgZmVhdHVyZXMpLnNob3coKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB3aW5kb3cub3Blbih1cmwsIHRhcmdldCwgZmVhdHVyZXMsIHJlcGxhY2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkKHJlcXVlc3Q6IHt1cmk6IHN0cmluZzsgZmlsZW5hbWU/OiBzdHJpbmcgfSAmIFBhcnRpYWw8RG93bmxvYWRSZXF1ZXN0PiApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghcmVxdWVzdCB8fCAhcmVxdWVzdC51cmkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhcmd1bWVudCBcXCdyZXF1ZXN0XFwnIG9yIFxcJ3JlcXVlc3QudXJpXFwnJyk7XG4gICAgaWYgKHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5kb3dubG9hZGVyKSB7XG4gICAgICByZXF1ZXN0ID0ge1xuICAgICAgICB2aXNpYmxlSW5Eb3dubG9hZHNVaTogdHJ1ZSxcbiAgICAgICAgbm90aWZpY2F0aW9uVmlzaWJpbGl0eTogTm90aWZpY2F0aW9uVmlzaWJpbGl0eS5WaXNpYmxlTm90aWZ5Q29tcGxldGVkLFxuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICAvKmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyOiB7XG4gICAgICAgICAgZGlyVHlwZTogJ0Rvd25sb2FkcycsXG4gICAgICAgICAgc3ViUGF0aDogcmVxdWVzdC5maWxlbmFtZSB8fCByZXF1ZXN0LnRpdGxlIHx8ICcnLFxuICAgICAgICAgIC4uLnJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXJcbiAgICAgICAgfSovXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIERvd25sb2FkaW5nLCB1c2luZyByZXF1ZXN0OiAnICsgSlNPTi5zdHJpbmdpZnkocmVxdWVzdCkpO1xuXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgdGhpcy5kb3dubG9hZGVyLmRvd25sb2FkKHJlcXVlc3QpO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBGaWxlIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkIGF0OicgKyBsb2NhdGlvbik7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICAgIH1cbiAgICAgIGNhdGNoKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIFVuYWJsZSB0byBkb3dubG9hZDogJyArIChlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgKG5vIENvcmRvdmEpXG4gICAgLy8gV2ViIG1vZGU6IG9wZW4gVVJJIHVzaW5nIHRoZSBicm93c2VyXG4gICAgLy8gVE9ETzogZmluZCBhIHdheSB0byBkb3dubG9hZCB1bmRlciBpT1MgKHNlZSBodHRwczovL3d3dy5jLXNoYXJwY29ybmVyLmNvbS9hcnRpY2xlL2hvdy10by1kb3dubG9hZC1hLWZpbGUtdXNpbmctZmlsZS10cmFuc2Zlci1wbHVnaW4taW4taW9uaWMtMy8pXG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gQ2Fubm90IHVzZSBDb3Jkb3ZhIGRvd25sb2FkZXI6IHVzaW5nIGJyb3dzZXIgb3BlbigpJyk7XG4gICAgICB0aGlzLm9wZW4ocmVxdWVzdC51cmksICdfc3lzdGVtJywgJ2xvY2F0aW9uPW5vJywgdHJ1ZSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNvcmRvdmFQbHVnaW5zKG1vYmlsZTogYm9vbGVhbikge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBDb3Jkb3ZhIHBsdWdpbnMuLi4nKTtcblxuICAgIGlmICh0aGlzLnN0YXR1c0Jhcikge1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc3R5bGVEZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0YXR1c0Jhci5vdmVybGF5c1dlYlZpZXcoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXlib2FyZCkge1xuICAgICAgdGhpcy5rZXlib2FyZC5oaWRlRm9ybUFjY2Vzc29yeUJhcih0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBGb3JjZSB0byB1c2UgSW5BcHBCcm93c2VyIGluc3RlYWQgb2YgZGVmYXVsdCB3aW5kb3cub3BlbigpXG4gICAgaWYgKHRoaXMuYnJvd3Nlcikge1xuICAgICAgLy8gRklYTUU6IHRoaXMgY3JlYXRlIGEgaW5maW5pdGUgbG9vcCAoZS5nLiB3aGVuIGRvd25sb2FkaW5nIGFuIGV4dHJhY3Rpb24gZmlsZSlcbiAgICAgIC8vIHdpbmRvdy5vcGVuID0gKHVybD86IHN0cmluZywgdGFyZ2V0Pzogc3RyaW5nLCBmZWF0dXJlcz86IHN0cmluZywgcmVwbGFjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgIC8vICAgY29uc29sZS5kZWJ1ZyhcIltwbGF0Zm9ybV0gQ2FsbCB0byB3aW5kb3cub3BlbigpIHJlZGlyZWN0ZWQgdG8gSW5BcHBCcm93c2VyLm9wZW4oKVwiKTtcbiAgICAgIC8vICAgdGhpcy5icm93c2VyLmNyZWF0ZSh1cmwsIHRhcmdldCwgZmVhdHVyZXMpLnNob3coKTtcbiAgICAgIC8vICAgcmV0dXJuIHdpbmRvdztcbiAgICAgIC8vIH07XG4gICAgfVxuICB9XG5cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlVHJhbnNsYXRlKCkge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBpMThuIC4uLicpO1xuXG4gICAgLy8gdGhpcyBsYW5ndWFnZSB3aWxsIGJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdHJhbnNsYXRpb24gaXNuJ3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZyh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuXG4gICAgLy8gV2hlbiBsb2NhbGUgY2hhbmdlcywgYXBwbHkgdG8gZGF0ZSBhZGFwdGVyXG4gICAgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQgJiYgZXZlbnQubGFuZykge1xuXG4gICAgICAgIC8vIGZvcmNlICdlbicgYXMgJ2VuX0dCJ1xuICAgICAgICBpZiAoZXZlbnQubGFuZyA9PT0gJ2VuJykge1xuICAgICAgICAgIGV2ZW50LmxhbmcgPSAnZW5fR0InO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uZmlnIG1vbWVudCBsaWJcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtb21lbnQubG9jYWxlKGV2ZW50LmxhbmcpO1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gVXNlIGxvY2FsZSB7JyArIGV2ZW50LmxhbmcgKyAnfScpO1xuICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgZXJyb3IsIGZhbGxiYWNrIHRvIGVuXG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBtb21lbnQubG9jYWxlKCdlbicpO1xuICAgICAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBVbmtub3duIGxvY2FsIGZvciBtb21lbnQgbGliLiBVc2luZyBkZWZhdWx0IFtlbl0nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpZyBkYXRlIGFkYXB0ZXJcbiAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5zZXRMb2NhbGUobW9tZW50LmxvY2FsZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2Uuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sb2NhbGUgJiYgZGF0YS5sb2NhbGUgIT09IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nKSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShkYXRhLmxvY2FsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVc2UgYWNjb3VudCdzIGxvY2FsZSwgd2hlbiBhY2NvdW50IGluaGVyaXRhbmNlIGVuYWJsZWQgaW4gc2V0dGluZ3NcbiAgICB0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9naW4uc3Vic2NyaWJlKGFjY291bnQgPT4ge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MuYWNjb3VudEluaGVyaXRhbmNlKSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRMb2NhbGUgPSBhY2NvdW50LnNldHRpbmdzICYmIGFjY291bnQuc2V0dGluZ3MubG9jYWxlO1xuICAgICAgICBpZiAoYWNjb3VudExvY2FsZSAmJiBhY2NvdW50TG9jYWxlICE9PSB0aGlzLnNldHRpbmdzLmxvY2FsZSkge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MuYXBwbHkoe1xuICAgICAgICAgICAgbG9jYWxlOiBhY2NvdW50TG9jYWxlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVDYWNoZShvbmxpbmU/OiBib29sZWFuKSB7XG4gICAgb25saW5lID0gaXNOb3ROaWwob25saW5lKSA/IG9ubGluZSA6IHRoaXMuY2FjaGUuaXNPbmxpbmUoKTtcbiAgICBjb25zdCBjYWNoZVRUTCA9IG9ubGluZSA/IDM2MDAgLyogMWggKi8gOiAzNjAwICogMjQgKiAzMDsgLyogMSBtb250aCAqL1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBDb25maWd1cmluZyBjYWNoZSBbT0tdIHtvbmxpbmU6ICR7b25saW5lfX0sIHt0aW1lVG9MaXZlOiAke2NhY2hlVFRMIC8gMzYwMH1ofSwge29mZmxpbmVJbnZhbGlkYXRlOiBmYWxzZX1gKTtcbiAgICB0aGlzLmNhY2hlLnNldERlZmF1bHRUVEwoY2FjaGVUVEwpO1xuICAgIHRoaXMuY2FjaGUuc2V0T2ZmbGluZUludmFsaWRhdGUoZmFsc2UpOyAvLyBEbyBub3QgaW52YWxpZGF0ZSBjYWNoZSB3aGVuIG9mZmxpbmVcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzdG9yYWdlUmVhZHkoKTogUHJvbWlzZTxMb2NhbEZvcmFnZT4ge1xuXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UuLi5gKTtcbiAgICBjb25zdCBmb3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UucmVhZHkoKTtcbiAgICBjb25zdCBkcml2ZXIgPSBmb3JhZ2UuZHJpdmVyKCk7XG5cbiAgICBpZiAoaXNOaWwoZHJpdmVyKSkge1xuICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBOTyBEUklWRVIgREVGSU5FRCBJTiBTVE9SQUdFLiBMb2NhbCBzdG9yYWdlIGNhbm5vdCBiZSB1c2VkICEnKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZm9yYWdlKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBbT0tdIHtuYW1lOiAnJHtmb3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke2ZvcmFnZS5kcml2ZXIoKX0nLCBzaXplOiAke2ZvcmFnZS5jb25maWcoKS5zaXplfWApO1xuICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gU3RvcmFnZSBzdXBwb3J0czogeyR7Zm9yYWdlLldFQlNRTH06ICR7Zm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5XRUJTUUwpfSwgJHtmb3JhZ2UuSU5ERVhFRERCfTogJHtmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLklOREVYRUREQil9LCAke2ZvcmFnZS5MT0NBTFNUT1JBR0V9OiAke2ZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuTE9DQUxTVE9SQUdFKX19YCk7XG5cbiAgICByZXR1cm4gZm9yYWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG1pZ3JhdGVTdG9yYWdlKGZvcmFnZTogTG9jYWxGb3JhZ2UpIHtcbiAgICBjb25zdCBjYW5NaWdyYXRlID0gZm9yYWdlICYmXG4gICAgICAoKGZvcmFnZS5kcml2ZXIoKSA9PT0gJ2NvcmRvdmFTUUxpdGVEcml2ZXInICYmIChmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLklOREVYRUREQikgfHwgZm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5XRUJTUUwpKSkgfHxcbiAgICAgICAoZm9yYWdlLmRyaXZlcigpID09PSBmb3JhZ2UuV0VCU1FMICYmIGZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuSU5ERVhFRERCKSkpO1xuXG4gICAgaWYgKCFjYW5NaWdyYXRlKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnN0IG9sZEZvcmFnZSA9IGZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBuYW1lOiBmb3JhZ2UuY29uZmlnKCkubmFtZSxcbiAgICAgIHN0b3JlTmFtZTogZm9yYWdlLmNvbmZpZygpLnN0b3JlTmFtZSxcbiAgICAgIGRyaXZlcjogW2ZvcmFnZS5JTkRFWEVEREIsIGZvcmFnZS5XRUJTUUxdXG4gICAgfSk7XG5cbiAgICBjb25zdCBrZXlzID0gYXdhaXQgb2xkRm9yYWdlLmtleXMoKTtcblxuICAgIC8vIE5vIGRhdGEgaW4gdGhlIG9kbCBzdG9yYWdlOiBza2lwIG1pZ3JhdGlvblxuICAgIGlmIChpc0VtcHR5QXJyYXkoa2V5cykpIHtcbiAgICAgIC8vIERyb3AgdGhlIG9sZCBpbnN0YW5jZSAobm90IG5lZWQgYW55bW9yZSlcbiAgICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gT2xkIHN0b3JhZ2UgaXMgZW1wdHk6IGRyb3BwaW5nIHVudXNlZCBpbnN0YW5jZSB7bmFtZTogJyR7Zm9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtvbGRGb3JhZ2UuZHJpdmVyKCl9J31gKTtcbiAgICAgIGF3YWl0IG9sZEZvcmFnZS5kcm9wSW5zdGFuY2UoKTtcbiAgICB9XG4gICAgLy8gSUYgc29tZSBkYXRhIHN0b3JlZCBpbiB0aGUgT0xEIHN0b3JhZ2U6IHN0YXJ0IG1pZ3JhdGlvblxuICAgIGVsc2Uge1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UgbWlncmF0aW9uLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRvYXN0ID0gYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdJTkZPLkRBVEFfTUlHUkFUSU9OX1NUQVJURUQnLFxuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwMH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgU3RvcmFnZVV0aWxzLmNvcHkob2xkRm9yYWdlLCBmb3JhZ2UsIHtrZXlzLCBkZWxldGVBZnRlckNvcHk6IGZhbHNlfSk7XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gbm93O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRvYXN0LmRpc21pc3MoKSwgIE1hdGgubWF4KDIwMDAgLSBkdXJhdGlvbiwgMCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0lORk8uREFUQV9NSUdSQVRJT05fU1VDQ0VFRCcsXG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UgbWlncmF0aW9uIFtPS10nKTtcblxuICAgICAgICAvLyBEcm9wIHRoZSBvbGQgaW5zdGFuY2VcbiAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIERyb3Agb2xkIHN0b3JhZ2Uge25hbWU6ICcke2ZvcmFnZS5jb25maWcoKS5uYW1lfScsIGRyaXZlcjogJyR7b2xkRm9yYWdlLmRyaXZlcigpfSd9YCk7XG4gICAgICAgIGF3YWl0IG9sZEZvcmFnZS5kcm9wSW5zdGFuY2UoKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyLCBlcnIpO1xuICAgICAgICBhd2FpdCB0b2FzdC5kaXNtaXNzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHttZXNzYWdlOiAnRVJST1IuREFUQV9NSUdSQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPEhUTUxJb25Ub2FzdEVsZW1lbnQ+IHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgb25XaWxsUHJlc2VudDogKHQpID0+IHJlc29sdmUodClcbiAgICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvblN0YXJ0dXBFcnJvcihlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIEZhaWxlZCBzdGFydGluZyB0aGUgcGxhdGZvcm0hICcsIGVycik7XG4gICAgbGV0IG1lc3NhZ2UgPSBlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyO1xuICAgIGNvbnN0IGRldGFpbHNNZXNzYWdlID0gZXJyICYmIChlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5tZXNzYWdlIHx8IGVyci5kZXRhaWxzKTtcbiAgICAvLyBTZXQgc3BlY2lmaWMgZXJyb3Igd2hlbiBGaXJlZm94IGlzIGluIHByaXZhdGUgbW9kZSBvciBoaXN0b3J5IG5ldmVyIHJlbWVtYmVyZWQgKHNlZSBNYW50aXMgSWZyZW1lciAjNTY0NDEpXG4gICAgaWYgKGVyci5jb2RlID09PSAxMSAmJiB0aGlzLmNka1BsYXRmb3JtLkZJUkVGT1gpIHtcbiAgICAgIG1lc3NhZ2UgPSAnRVJST1IuRklSRUZPWF9OT19TVE9SQUdFJztcbiAgICB9XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlKSB7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuZ2V0KG1lc3NhZ2UpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSkge1xuICAgICAgICBtZXNzYWdlICs9IGAge2NvZGU6ICR7ZXJyLmNvZGV9fWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbWVzc2FnZSA9IGBGYXRhbCBlcnJvcjogUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLlxcblxcbntjb2RlOiAke2VyciAmJiBlcnIuY29kZSB8fCAnbnVsbCd9LCBtZXNzYWdlOiBcIiR7bWVzc2FnZX1cIn1gO1xuICAgIH1cbiAgICBpZiAodGhpcy50b2FzdENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGA8YnIvPjxzbWFsbD4ke2RldGFpbHNNZXNzYWdlfTwvc21hbGw+YDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgZHVyYXRpb246IC0xLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG57Y2F1c2U6IFwiJHtkZXRhaWxzTWVzc2FnZX1cIn1gO1xuICAgICAgfVxuICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICBpZiAoZXJyICYmIGVyci5kZXRhaWxzKSBjb25zb2xlLmVycm9yKCdjYXVzZScsIGVyci5kZXRhaWxzKTtcbiAgICB9XG4gIH1cbn1cblxuIl19
|
|
434
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxRQUFRLElBQUksV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFtQixRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFB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cHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BsYXRmb3JtLCBUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7QXV0aFRva2VuVHlwZSwgTmV0d29ya1NlcnZpY2V9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7UGxhdGZvcm1zfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge1NwbGFzaFNjcmVlbn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9zcGxhc2gtc2NyZWVuL25neCc7XG5pbXBvcnQge1N0YXR1c0Jhcn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9zdGF0dXMtYmFyL25neCc7XG5pbXBvcnQge0tleWJvYXJkfSBmcm9tICdAaW9uaWMtbmF0aXZlL2tleWJvYXJkL25neCc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHtDYWNoZVNlcnZpY2V9IGZyb20gJ2lvbmljLWNhY2hlJztcbmltcG9ydCB7QXVkaW9Qcm92aWRlcn0gZnJvbSAnLi4vLi4vc2hhcmVkL2F1ZGlvL2F1ZGlvJztcbmltcG9ydCB7UGxhdGZvcm0gYXMgQ2RrUGxhdGZvcm19IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5cbmltcG9ydCB7SW5BcHBCcm93c2VyfSBmcm9tICdAaW9uaWMtbmF0aXZlL2luLWFwcC1icm93c2VyL25neCc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0Bpb25pYy9zdG9yYWdlJztcbmltcG9ydCB7RW50aXRpZXNTdG9yYWdlfSBmcm9tICcuL3N0b3JhZ2UvZW50aXRpZXMtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7U3RvcmFnZVV0aWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RvcmFnZS51dGlscyc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7QWNjb3VudFNlcnZpY2V9IGZyb20gJy4vYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7dGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7Q09SRV9DT05GSUdfT1BUSU9OU30gZnJvbSAnLi9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHtNb21lbnREYXRlQWRhcHRlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHtEb3dubG9hZGVyLCBEb3dubG9hZFJlcXVlc3QsIE5vdGlmaWNhdGlvblZpc2liaWxpdHl9IGZyb20gJ0Bpb25pYy1uYXRpdmUvZG93bmxvYWRlci9uZ3gnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1TZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWJ1ZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9zdGFydFByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgX21vYmlsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29yZG92YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfYW5kcm9pZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZG93bmxvYWRpbmdQcm9taXNlOiBNYXA8c3RyaW5nLCBQcm9taXNlPHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuXG4gIHRvdWNoVWk6IGJvb2xlYW47XG5cbiAgZ2V0IHN0YXJ0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQ7XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcml2YXRlIGNka1BsYXRmb3JtOiBDZGtQbGF0Zm9ybSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IE1vbWVudERhdGVBZGFwdGVyLFxuICAgIHByaXZhdGUgZW50aXRpZXNTdG9yYWdlOiBFbnRpdGllc1N0b3JhZ2UsXG4gICAgcHJpdmF0ZSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZXR3b3JrU2VydmljZTogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FjaGU6IENhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgcHJpdmF0ZSBhdWRpb1Byb3ZpZGVyOiBBdWRpb1Byb3ZpZGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHN0YXR1c0JhcjogU3RhdHVzQmFyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUga2V5Ym9hcmQ6IEtleWJvYXJkLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3BsYXNoU2NyZWVuOiBTcGxhc2hTY3JlZW4sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBicm93c2VyOiBJbkFwcEJyb3dzZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkb3dubG9hZGVyOiBEb3dubG9hZGVyLFxuICApIHtcblxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIENyZWF0aW5nIHNlcnZpY2UnKTtcblxuICAgIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIGlzKHBsYXRmb3JtTmFtZTogUGxhdGZvcm1zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXkgaWYgb3BlbmVkIGhhcyBiZWVuIG9wZW5lZCBmcm9tIGEgd2ViIGJyb3dzZXIgKGFuZCBOT1QgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcCkuXG4gICAqIFRoaXMgaXMgdXNlZCB0byBrbm93biBpZiB0aGVyZSBpcyBjb3Jkb3ZhIGZlYXR1cmVzXG4gICAqL1xuICBpc1dlYk9yRGVza3RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZScpIHx8IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZXdlYicpO1xuICB9XG5cbiAgaXNBbmRyb2lkQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYW5kcm9pZCAmJiB0aGlzLl9jb3Jkb3ZhO1xuICB9XG5cbiAgZ2V0IGNhbkRvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkICYmICEhdGhpcy5kb3dubG9hZGVyO1xuICB9XG5cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS53aWR0aCgpO1xuICB9XG5cbiAgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaGVpZ2h0KCk7XG4gIH1cblxuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fc3RhcnRQcm9taXNlKSByZXR1cm4gdGhpcy5fc3RhcnRQcm9taXNlO1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcblxuICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHRoaXMucGxhdGZvcm0ucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgIHRoaXMuX21vYmlsZSA9IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZScpO1xuICAgICAgICB0aGlzLl9jb3Jkb3ZhID0gdGhpcy5wbGF0Zm9ybS5pcygnY29yZG92YScpO1xuICAgICAgICB0aGlzLl9hbmRyb2lkID0gdGhpcy5wbGF0Zm9ybS5pcygnYW5kcm9pZCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJlQ29yZG92YVBsdWdpbnModGhpcy5fbW9iaWxlKTtcbiAgICAgICAgdGhpcy50b3VjaFVpID0gdGhpcy5fbW9iaWxlIHx8IHRoaXMucGxhdGZvcm0uaXMoJ3RhYmxldCcpIHx8IHRoaXMucGxhdGZvcm0uaXMoJ3BoYWJsZXQnKTtcblxuICAgICAgICAvLyBGb3JjZSBtb2JpbGUgaW4gc2V0dGluZ3NcbiAgICAgICAgaWYgKHRoaXMuX21vYmlsZSkge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MubW9iaWxlID0gdGhpcy5fbW9iaWxlO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MudG91Y2hVaSA9IHRoaXMudG91Y2hVaTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlndXJlVHJhbnNsYXRlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB0aGlzLnN0b3JhZ2VSZWFkeSgpKVxuICAgIC50aGVuKChmb3JhZ2UpID0+IHRoaXMubWlncmF0ZVN0b3JhZ2UoZm9yYWdlKSlcbiAgICAudGhlbigoKSA9PiBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLmVudGl0aWVzU3RvcmFnZS5yZWFkeSgpLFxuICAgICAgdGhpcy5jYWNoZS5yZWFkeSgpLnRoZW4oKCkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSgpKSxcbiAgICAgIHRoaXMuc2V0dGluZ3MucmVhZHkoKSxcbiAgICAgIHRoaXMubmV0d29ya1NlcnZpY2UucmVhZHkoKSxcbiAgICAgIHRoaXMuYXVkaW9Qcm92aWRlci5yZWFkeSgpXG4gICAgXSkpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9zdGFydFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0gW09LXSB7bW9iaWxlOiAke3RoaXMuX21vYmlsZX0sIHRvdWNoVWk6ICR7dGhpcy50b3VjaFVpfSwgY2FuRG93bmxvYWQ6ICR7dGhpcy5jYW5Eb3dubG9hZH19IGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBVcGRhdGUgY2FjaGUgY29uZmlndXJhdGlvbiB3aGVuIG5ldHdvcmsgY2hhbmdlZFxuICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSh0eXBlICE9PSAnbm9uZScpKTtcblxuICAgICAgLy8gVXBkYXRlIGF1dGhlbnRpY2F0aW9uIHR5cGVcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWdcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKGNvbmZpZyA9PiBjb25maWc/LmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlKSxcbiAgICAgICAgICBmaWx0ZXIoaXNOb3ROaWxPckJsYW5rKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh0b2tlblR5cGUgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBVc2luZyBhdXRoIHRva2VuIHR5cGUgeyR7dG9rZW5UeXBlfX1gKTtcbiAgICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHRva2VuVHlwZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIFdhaXQgMSBtb3JlIHNlY29uZHMsIGJlZm9yZSBoaWRpbmcgdGhlIHNwbGFzaCBzY3JlZW5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zcGxhc2hTY3JlZW4pIHRoaXMuc3BsYXNoU2NyZWVuLmhpZGUoKTtcblxuICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmRcbiAgICAgICAgdGhpcy5hdWRpb1Byb3ZpZGVyLnBsYXlTdGFydHVwU291bmQoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pXG4gICAgICAvLyBNYW5hZ2UgZXJyb3JcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5vblN0YXJ0dXBFcnJvcihlcnIpKTtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgcGxhdGZvcm0gaXMgcmVhZHkuPGJyLz5cbiAgICogSW1wb3J0YW50OiB0aGlzIHdpbGwgTk9UIHN0YXJ0IHRoZSBwbGF0Zm9ybSwgaGFzIGl0IHNob3VsZCBiZSBzdGFydGVkIGJ5IHRoZSBBcHBDb21wb25lbnRcbiAgICpcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHJlYWR5KG9wdHM/OiB7XG4gICAgY2hlY2tQZXJpb2Q6IG51bWJlcjtcbiAgfSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGVyaW9kID0gb3B0cyAmJiBvcHRzLmNoZWNrUGVyaW9kIHx8IDMwMDtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHJldHVybiB0aW1lcihwZXJpb2QsIHBlcmlvZClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBGb3IgREVCVUcgOlxuICAgICAgICAvL3RhcCgoKSA9PiB0aGlzLl9kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKFwiV2FpdGluZyBwbGF0Zm9ybSByZWFkeS4uLlwiKSksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9zdGFydGVkKSxcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIG9wZW4odXJsOiBzdHJpbmcsIHRhcmdldD86IHN0cmluZywgZmVhdHVyZXM/OiBzdHJpbmcsIHJlcGxhY2U/OiBib29sZWFuKSB7XG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIE9wZW5pbmcgbGluazogJHt1cmx9YCk7XG4gICAgaWYgKHRoaXMuYnJvd3NlciAmJiB0aGlzLl9tb2JpbGUpIHtcbiAgICAgIHRoaXMuYnJvd3Nlci5jcmVhdGUodXJsLCB0YXJnZXQsIGZlYXR1cmVzKS5zaG93KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQsIGZlYXR1cmVzLCByZXBsYWNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXREb3dubG9hZGluZ1Byb21pc2UodXJpOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kb3dubG9hZGluZ1Byb21pc2UuZ2V0KHVyaSk7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZChyZXF1ZXN0OiB7dXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4gKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXJlcXVlc3QudXJpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXFwncmVxdWVzdFxcJyBvciBcXCdyZXF1ZXN0LnVyaVxcJycpO1xuXG4gICAgaWYgKHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5kb3dubG9hZGVyKSB7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5vdCBhbHJlYWR5IGRvd25sb2FkaW5nIGZpbGVcbiAgICAgIGxldCBwcm9taXNlID0gdGhpcy5fZG93bmxvYWRpbmdQcm9taXNlLmdldChyZXF1ZXN0LnVyaSk7XG4gICAgICBpZiAocHJvbWlzZSkgcmV0dXJuIHByb21pc2U7XG5cbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIHZpc2libGVJbkRvd25sb2Fkc1VpOiB0cnVlLFxuICAgICAgICBub3RpZmljYXRpb25WaXNpYmlsaXR5OiBOb3RpZmljYXRpb25WaXNpYmlsaXR5LlZpc2libGVOb3RpZnlDb21wbGV0ZWQsXG4gICAgICAgIHRpdGxlOiByZXF1ZXN0LnRpdGxlIHx8IHJlcXVlc3QuZmlsZW5hbWUsXG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIC8qZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXI6IHtcbiAgICAgICAgICBkaXJUeXBlOiAnRG93bmxvYWRzJyxcbiAgICAgICAgICBzdWJQYXRoOiByZXF1ZXN0LmZpbGVuYW1lIHx8IHJlcXVlc3QudGl0bGUgfHwgJycsXG4gICAgICAgICAgLi4ucmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpclxuICAgICAgICB9Ki9cbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gRG93bmxvYWRpbmcsIHVzaW5nIHJlcXVlc3Q6ICcgKyBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSk7XG5cbiAgICAgICAgLy8gU3RhcnQgZG93bmxvYWRcbiAgICAgICAgcHJvbWlzZSA9IHRoaXMuZG93bmxvYWRlci5kb3dubG9hZChyZXF1ZXN0KTtcblxuICAgICAgICAvLyBSZW1lbWJlciB0aGlzIHJlcXVlc3QgdXJpXG4gICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nUHJvbWlzZS5zZXQocmVxdWVzdC51cmksIHByb21pc2UpO1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGF3YWl0IHByb21pc2U7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIEZpbGUgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgYXQ6JyArIGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgICAgfVxuICAgICAgY2F0Y2goZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gVW5hYmxlIHRvIGRvd25sb2FkOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7XG4gICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICB0aGlzLl9kb3dubG9hZGluZ1Byb21pc2UuZGVsZXRlKHJlcXVlc3QudXJpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAoaWYgbm90IEFuZHJvaWQgYW5kIENvcmRvdmEpOiBvcGVuaW5nIHRoZSBVUkkgdXNpbmcgdGhlIGJyb3dzZXJcbiAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGRvd25sb2FkIHVuZGVyIGlPUyAoc2VlIGh0dHBzOi8vd3d3LmMtc2hhcnBjb3JuZXIuY29tL2FydGljbGUvaG93LXRvLWRvd25sb2FkLWEtZmlsZS11c2luZy1maWxlLXRyYW5zZmVyLXBsdWdpbi1pbi1pb25pYy0zLylcbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBDYW5ub3QgdXNlIEFuZHJvaWQgZG93bmxvYWRlcjogdXNpbmcgYnJvd3NlciBvcGVuKCknKTtcbiAgICAgIHRoaXMub3BlbihyZXF1ZXN0LnVyaSwgJ19zeXN0ZW0nLCAnbG9jYXRpb249bm8nLCB0cnVlKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlQ29yZG92YVBsdWdpbnMobW9iaWxlOiBib29sZWFuKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIENvcmRvdmEgcGx1Z2lucy4uLicpO1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzQmFyKSB7XG4gICAgICB0aGlzLnN0YXR1c0Jhci5zdHlsZURlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFyLm92ZXJsYXlzV2ViVmlldyhmYWxzZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWJvYXJkKSB7XG4gICAgICB0aGlzLmtleWJvYXJkLmhpZGVGb3JtQWNjZXNzb3J5QmFyKHRydWUpO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIHRvIHVzZSBJbkFwcEJyb3dzZXIgaW5zdGVhZCBvZiBkZWZhdWx0IHdpbmRvdy5vcGVuKClcbiAgICBpZiAodGhpcy5icm93c2VyKSB7XG4gICAgICAvLyBGSVhNRTogdGhpcyBjcmVhdGUgYSBpbmZpbml0ZSBsb29wIChlLmcuIHdoZW4gZG93bmxvYWRpbmcgYW4gZXh0cmFjdGlvbiBmaWxlKVxuICAgICAgLy8gd2luZG93Lm9wZW4gPSAodXJsPzogc3RyaW5nLCB0YXJnZXQ/OiBzdHJpbmcsIGZlYXR1cmVzPzogc3RyaW5nLCByZXBsYWNlPzogYm9vbGVhbikgPT4ge1xuICAgICAgLy8gICBjb25zb2xlLmRlYnVnKFwiW3BsYXRmb3JtXSBDYWxsIHRvIHdpbmRvdy5vcGVuKCkgcmVkaXJlY3RlZCB0byBJbkFwcEJyb3dzZXIub3BlbigpXCIpO1xuICAgICAgLy8gICB0aGlzLmJyb3dzZXIuY3JlYXRlKHVybCwgdGFyZ2V0LCBmZWF0dXJlcykuc2hvdygpO1xuICAgICAgLy8gICByZXR1cm4gd2luZG93O1xuICAgICAgLy8gfTtcbiAgICB9XG4gIH1cblxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmFuc2xhdGUoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGkxOG4gLi4uJyk7XG5cbiAgICAvLyB0aGlzIGxhbmd1YWdlIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0cmFuc2xhdGlvbiBpc24ndCBmb3VuZCBpbiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG5cbiAgICAvLyBXaGVuIGxvY2FsZSBjaGFuZ2VzLCBhcHBseSB0byBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5sYW5nKSB7XG5cbiAgICAgICAgLy8gZm9yY2UgJ2VuJyBhcyAnZW5fR0InXG4gICAgICAgIGlmIChldmVudC5sYW5nID09PSAnZW4nKSB7XG4gICAgICAgICAgZXZlbnQubGFuZyA9ICdlbl9HQic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25maWcgbW9tZW50IGxpYlxuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoZXZlbnQubGFuZyk7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgZXZlbnQubGFuZyArICd9Jyk7XG4gICAgICAgIH1cbiAgICAgICAgICAvLyBJZiBlcnJvciwgZmFsbGJhY2sgdG8gZW5cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoJ2VuJyk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIFVua25vd24gbG9jYWwgZm9yIG1vbWVudCBsaWIuIFVzaW5nIGRlZmF1bHQgW2VuXScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlnIGRhdGUgYWRhcHRlclxuICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShtb21lbnQubG9jYWxlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxvY2FsZSAmJiBkYXRhLmxvY2FsZSAhPT0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGRhdGEubG9jYWxlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBhY2NvdW50J3MgbG9jYWxlLCB3aGVuIGFjY291bnQgaW5oZXJpdGFuY2UgZW5hYmxlZCBpbiBzZXR0aW5nc1xuICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbi5zdWJzY3JpYmUoYWNjb3VudCA9PiB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5hY2NvdW50SW5oZXJpdGFuY2UpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudExvY2FsZSA9IGFjY291bnQuc2V0dGluZ3MgJiYgYWNjb3VudC5zZXR0aW5ncy5sb2NhbGU7XG4gICAgICAgIGlmIChhY2NvdW50TG9jYWxlICYmIGFjY291bnRMb2NhbGUgIT09IHRoaXMuc2V0dGluZ3MubG9jYWxlKSB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5hcHBseSh7XG4gICAgICAgICAgICBsb2NhbGU6IGFjY291bnRMb2NhbGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNhY2hlKG9ubGluZT86IGJvb2xlYW4pIHtcbiAgICBvbmxpbmUgPSBpc05vdE5pbChvbmxpbmUpID8gb25saW5lIDogdGhpcy5jYWNoZS5pc09ubGluZSgpO1xuICAgIGNvbnN0IGNhY2hlVFRMID0gb25saW5lID8gMzYwMCAvKiAxaCAqLyA6IDM2MDAgKiAyNCAqIDMwOyAvKiAxIG1vbnRoICovXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGNhY2hlIFtPS10ge29ubGluZTogJHtvbmxpbmV9fSwge3RpbWVUb0xpdmU6ICR7Y2FjaGVUVEwgLyAzNjAwfWh9LCB7b2ZmbGluZUludmFsaWRhdGU6IGZhbHNlfWApO1xuICAgIHRoaXMuY2FjaGUuc2V0RGVmYXVsdFRUTChjYWNoZVRUTCk7XG4gICAgdGhpcy5jYWNoZS5zZXRPZmZsaW5lSW52YWxpZGF0ZShmYWxzZSk7IC8vIERvIG5vdCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gb2ZmbGluZVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN0b3JhZ2VSZWFkeSgpOiBQcm9taXNlPExvY2FsRm9yYWdlPiB7XG5cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZS4uLmApO1xuICAgIGNvbnN0IGZvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZS5yZWFkeSgpO1xuICAgIGNvbnN0IGRyaXZlciA9IGZvcmFnZS5kcml2ZXIoKTtcblxuICAgIGlmIChpc05pbChkcml2ZXIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIE5PIERSSVZFUiBERUZJTkVEIElOIFNUT1JBR0UuIExvY2FsIHN0b3JhZ2UgY2Fubm90IGJlIHVzZWQgIScpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmb3JhZ2UpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlIFtPS10ge25hbWU6ICcke2ZvcmFnZS5jb25maWcoKS5uYW1lfScsIGRyaXZlcjogJyR7Zm9yYWdlLmRyaXZlcigpfScsIHNpemU6ICR7Zm9yYWdlLmNvbmZpZygpLnNpemV9YCk7XG4gICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSBTdG9yYWdlIHN1cHBvcnRzOiB7JHtmb3JhZ2UuV0VCU1FMfTogJHtmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLldFQlNRTCl9LCAke2ZvcmFnZS5JTkRFWEVEREJ9OiAke2ZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuSU5ERVhFRERCKX0sICR7Zm9yYWdlLkxPQ0FMU1RPUkFHRX06ICR7Zm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5MT0NBTFNUT1JBR0UpfX1gKTtcblxuICAgIHJldHVybiBmb3JhZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbWlncmF0ZVN0b3JhZ2UoZm9yYWdlOiBMb2NhbEZvcmFnZSkge1xuICAgIGNvbnN0IGNhbk1pZ3JhdGUgPSBmb3JhZ2UgJiZcbiAgICAgICgoZm9yYWdlLmRyaXZlcigpID09PSAnY29yZG92YVNRTGl0ZURyaXZlcicgJiYgKGZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuSU5ERVhFRERCKSB8fCBmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLldFQlNRTCkpKSB8fFxuICAgICAgIChmb3JhZ2UuZHJpdmVyKCkgPT09IGZvcmFnZS5XRUJTUUwgJiYgZm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5JTkRFWEVEREIpKSk7XG5cbiAgICBpZiAoIWNhbk1pZ3JhdGUpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc3Qgb2xkRm9yYWdlID0gZm9yYWdlLmNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIG5hbWU6IGZvcmFnZS5jb25maWcoKS5uYW1lLFxuICAgICAgc3RvcmVOYW1lOiBmb3JhZ2UuY29uZmlnKCkuc3RvcmVOYW1lLFxuICAgICAgZHJpdmVyOiBbZm9yYWdlLklOREVYRUREQiwgZm9yYWdlLldFQlNRTF1cbiAgICB9KTtcblxuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBvbGRGb3JhZ2Uua2V5cygpO1xuXG4gICAgLy8gTm8gZGF0YSBpbiB0aGUgb2RsIHN0b3JhZ2U6IHNraXAgbWlncmF0aW9uXG4gICAgaWYgKGlzRW1wdHlBcnJheShrZXlzKSkge1xuICAgICAgLy8gRHJvcCB0aGUgb2xkIGluc3RhbmNlIChub3QgbmVlZCBhbnltb3JlKVxuICAgICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSBPbGQgc3RvcmFnZSBpcyBlbXB0eTogZHJvcHBpbmcgdW51c2VkIGluc3RhbmNlIHtuYW1lOiAnJHtmb3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke29sZEZvcmFnZS5kcml2ZXIoKX0nfWApO1xuICAgICAgYXdhaXQgb2xkRm9yYWdlLmRyb3BJbnN0YW5jZSgpO1xuICAgIH1cbiAgICAvLyBJRiBzb21lIGRhdGEgc3RvcmVkIGluIHRoZSBPTEQgc3RvcmFnZTogc3RhcnQgbWlncmF0aW9uXG4gICAgZWxzZSB7XG5cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBtaWdyYXRpb24uLi5gKTtcblxuICAgICAgY29uc3QgdG9hc3QgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0lORk8uREFUQV9NSUdSQVRJT05fU1RBUlRFRCcsXG4gICAgICAgICAgZHVyYXRpb246IDMwMDAwfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBTdG9yYWdlVXRpbHMuY29weShvbGRGb3JhZ2UsIGZvcmFnZSwge2tleXMsIGRlbGV0ZUFmdGVyQ29weTogZmFsc2V9KTtcblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBub3c7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9hc3QuZGlzbWlzcygpLCAgTWF0aC5tYXgoMjAwMCAtIGR1cmF0aW9uLCAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHttZXNzYWdlOiAnSU5GTy5EQVRBX01JR1JBVElPTl9TVUNDRUVEJyxcbiAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBtaWdyYXRpb24gW09LXScpO1xuXG4gICAgICAgIC8vIERyb3AgdGhlIG9sZCBpbnN0YW5jZVxuICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gRHJvcCBvbGQgc3RvcmFnZSB7bmFtZTogJyR7Zm9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtvbGRGb3JhZ2UuZHJpdmVyKCl9J31gKTtcbiAgICAgICAgYXdhaXQgb2xkRm9yYWdlLmRyb3BJbnN0YW5jZSgpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIGF3YWl0IHRvYXN0LmRpc21pc3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdFUlJPUi5EQVRBX01JR1JBVElPTl9GQUlMRUQnLFxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8SFRNTElvblRvYXN0RWxlbWVudD4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50XFwncyBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBvbldpbGxQcmVzZW50OiAodCkgPT4gcmVzb2x2ZSh0KVxuICAgICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU3RhcnR1cEVycm9yKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRmFpbGVkIHN0YXJ0aW5nIHRoZSBwbGF0Zm9ybSEgJywgZXJyKTtcbiAgICBsZXQgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnI7XG4gICAgY29uc3QgZGV0YWlsc01lc3NhZ2UgPSBlcnIgJiYgKGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLm1lc3NhZ2UgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5nZXQobWVzc2FnZSkudG9Qcm9taXNlKCk7XG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCB7Y29kZTogJHtlcnIuY29kZX19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtZXNzYWdlID0gYEZhdGFsIGVycm9yOiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuXFxuXFxue2NvZGU6ICR7ZXJyICYmIGVyci5jb2RlIHx8ICdudWxsJ30sIG1lc3NhZ2U6IFwiJHttZXNzYWdlfVwifWA7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvYXN0Q29udHJvbGxlcikge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDxici8+PHNtYWxsPiR7ZGV0YWlsc01lc3NhZ2V9PC9zbWFsbD5gO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICBkdXJhdGlvbjogLTEsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbntjYXVzZTogXCIke2RldGFpbHNNZXNzYWdlfVwifWA7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmRldGFpbHMpIGNvbnNvbGUuZXJyb3IoJ2NhdXNlJywgZXJyLmRldGFpbHMpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
|
|
@@ -8168,6 +8168,19 @@ let Peer = Peer_1 = class Peer extends Entity {
|
|
|
8168
8168
|
path: noTrailingSlash(url.pathname)
|
|
8169
8169
|
});
|
|
8170
8170
|
}
|
|
8171
|
+
static path(peer, ...paths) {
|
|
8172
|
+
if (!peer)
|
|
8173
|
+
throw new Error('Missing required argument \'peer\'!');
|
|
8174
|
+
// Remove starting slashes
|
|
8175
|
+
paths = (paths || []).map(path => {
|
|
8176
|
+
if (path.startsWith('./'))
|
|
8177
|
+
return path.substring(2);
|
|
8178
|
+
if (path.startsWith('/'))
|
|
8179
|
+
return path.substring(1);
|
|
8180
|
+
return path;
|
|
8181
|
+
}).filter(isNotNilOrBlank);
|
|
8182
|
+
return [noTrailingSlash(Peer_1.fromObject(peer).url)].concat(...paths).join('/');
|
|
8183
|
+
}
|
|
8171
8184
|
asObject(options) {
|
|
8172
8185
|
return super.asObject(options);
|
|
8173
8186
|
}
|
|
@@ -13646,6 +13659,7 @@ class PlatformService {
|
|
|
13646
13659
|
this.browser = browser;
|
|
13647
13660
|
this.downloader = downloader;
|
|
13648
13661
|
this._started = false;
|
|
13662
|
+
this._downloadingPromise = new Map();
|
|
13649
13663
|
this._debug = !environment.production;
|
|
13650
13664
|
if (this._debug)
|
|
13651
13665
|
console.debug('[platform] Creating service');
|
|
@@ -13761,15 +13775,28 @@ class PlatformService {
|
|
|
13761
13775
|
window.open(url, target, features, replace);
|
|
13762
13776
|
}
|
|
13763
13777
|
}
|
|
13778
|
+
getDownloadingPromise(uri) {
|
|
13779
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
13780
|
+
return this._downloadingPromise.get(uri);
|
|
13781
|
+
});
|
|
13782
|
+
}
|
|
13764
13783
|
download(request) {
|
|
13765
13784
|
return __awaiter(this, void 0, void 0, function* () {
|
|
13766
13785
|
if (!request || !request.uri)
|
|
13767
13786
|
throw new Error('Missing argument \'request\' or \'request.uri\'');
|
|
13768
13787
|
if (this._android && this.downloader) {
|
|
13769
|
-
|
|
13788
|
+
// Check if not already downloading file
|
|
13789
|
+
let promise = this._downloadingPromise.get(request.uri);
|
|
13790
|
+
if (promise)
|
|
13791
|
+
return promise;
|
|
13792
|
+
request = Object.assign({ visibleInDownloadsUi: true, notificationVisibility: NotificationVisibility.VisibleNotifyCompleted, title: request.title || request.filename }, request);
|
|
13770
13793
|
try {
|
|
13771
13794
|
console.debug('[platform] Downloading, using request: ' + JSON.stringify(request));
|
|
13772
|
-
|
|
13795
|
+
// Start download
|
|
13796
|
+
promise = this.downloader.download(request);
|
|
13797
|
+
// Remember this request uri
|
|
13798
|
+
this._downloadingPromise.set(request.uri, promise);
|
|
13799
|
+
const location = yield promise;
|
|
13773
13800
|
console.info('[platform] File successfully downloaded at:' + location);
|
|
13774
13801
|
return location;
|
|
13775
13802
|
}
|
|
@@ -13777,12 +13804,15 @@ class PlatformService {
|
|
|
13777
13804
|
console.error('[platform] Unable to download: ' + (err && err.message || err));
|
|
13778
13805
|
throw err;
|
|
13779
13806
|
}
|
|
13807
|
+
finally {
|
|
13808
|
+
// Forget the request
|
|
13809
|
+
this._downloadingPromise.delete(request.uri);
|
|
13810
|
+
}
|
|
13780
13811
|
}
|
|
13781
|
-
// Fallback (
|
|
13782
|
-
// Web mode: open URI using the browser
|
|
13812
|
+
// Fallback (if not Android and Cordova): opening the URI using the browser
|
|
13783
13813
|
// TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)
|
|
13784
13814
|
else {
|
|
13785
|
-
console.warn('[platform] Cannot use
|
|
13815
|
+
console.warn('[platform] Cannot use Android downloader: using browser open()');
|
|
13786
13816
|
this.open(request.uri, '_system', 'location=no', true);
|
|
13787
13817
|
return undefined;
|
|
13788
13818
|
}
|
|
@@ -18450,10 +18480,11 @@ const MimeTypes = Object.freeze({
|
|
|
18450
18480
|
ANDROID_APK: 'application/vnd.android.package-archive'
|
|
18451
18481
|
});
|
|
18452
18482
|
class AppInstallUpgradeCard {
|
|
18453
|
-
constructor(modalCtrl, configService, toastController, translate, cd, platform, network, environment) {
|
|
18483
|
+
constructor(modalCtrl, configService, toastController, alertController, translate, cd, platform, network, environment) {
|
|
18454
18484
|
this.modalCtrl = modalCtrl;
|
|
18455
18485
|
this.configService = configService;
|
|
18456
18486
|
this.toastController = toastController;
|
|
18487
|
+
this.alertController = alertController;
|
|
18457
18488
|
this.translate = translate;
|
|
18458
18489
|
this.cd = cd;
|
|
18459
18490
|
this.platform = platform;
|
|
@@ -18484,7 +18515,7 @@ class AppInstallUpgradeCard {
|
|
|
18484
18515
|
this.offline = this.network.offline;
|
|
18485
18516
|
// Listen pod config
|
|
18486
18517
|
this._subscription.add(this.configService.config
|
|
18487
|
-
.pipe(debounceTime(1000))
|
|
18518
|
+
.pipe(debounceTime(1000), filter(() => this.network.online))
|
|
18488
18519
|
.subscribe(config => this.checkNeedInstallOrUpdate(config)));
|
|
18489
18520
|
// Listen network changes
|
|
18490
18521
|
this._subscription.add(this.network.onNetworkStatusChanges
|
|
@@ -18502,6 +18533,10 @@ class AppInstallUpgradeCard {
|
|
|
18502
18533
|
}
|
|
18503
18534
|
ngOnDestroy() {
|
|
18504
18535
|
this._subscription.unsubscribe();
|
|
18536
|
+
this._subscription = null;
|
|
18537
|
+
this.onUpdateOfflineModeClick.complete();
|
|
18538
|
+
this.installLinks = null;
|
|
18539
|
+
this.upgradeLinks = null;
|
|
18505
18540
|
}
|
|
18506
18541
|
download(event, link) {
|
|
18507
18542
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -18509,37 +18544,12 @@ class AppInstallUpgradeCard {
|
|
|
18509
18544
|
console.error('[install-upgrade-card] Missing required argument \'link.url\'');
|
|
18510
18545
|
return; // Skip
|
|
18511
18546
|
}
|
|
18512
|
-
this.
|
|
18513
|
-
|
|
18514
|
-
|
|
18515
|
-
|
|
18516
|
-
|
|
18517
|
-
|
|
18518
|
-
filename: link.downloadFilename,
|
|
18519
|
-
mimeType: link.mimeType
|
|
18520
|
-
});
|
|
18521
|
-
console.info('[install-upgrade-card] File downloaded at: ' + location);
|
|
18522
|
-
}
|
|
18523
|
-
// Failed: display a toast
|
|
18524
|
-
catch (err) {
|
|
18525
|
-
console.error('[install-upgrade] Download failed: ' + (err && err.message || err));
|
|
18526
|
-
this.showToast({
|
|
18527
|
-
message: 'ERROR.DOWNLOAD_FAILED',
|
|
18528
|
-
messageParams: { error: err },
|
|
18529
|
-
type: 'error',
|
|
18530
|
-
showCloseButton: true
|
|
18531
|
-
});
|
|
18532
|
-
return; // Stop here
|
|
18533
|
-
}
|
|
18534
|
-
finally {
|
|
18535
|
-
this.downloading = false;
|
|
18536
|
-
this.markForCheck();
|
|
18537
|
-
}
|
|
18538
|
-
this.showToast({
|
|
18539
|
-
message: 'INFO.DOWNLOAD_UPDATE_SUCCEED',
|
|
18540
|
-
type: 'info',
|
|
18541
|
-
showCloseButton: true
|
|
18542
|
-
});
|
|
18547
|
+
return this.listenDownloadPromise(link.url, this.platform.download({
|
|
18548
|
+
uri: link.url,
|
|
18549
|
+
title: link.title,
|
|
18550
|
+
filename: link.filename,
|
|
18551
|
+
mimeType: link.mimeType
|
|
18552
|
+
}));
|
|
18543
18553
|
});
|
|
18544
18554
|
}
|
|
18545
18555
|
tryOnline() {
|
|
@@ -18577,17 +18587,23 @@ class AppInstallUpgradeCard {
|
|
|
18577
18587
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18578
18588
|
console.info('[install] Check if need to install or upgrade...');
|
|
18579
18589
|
try {
|
|
18580
|
-
const
|
|
18590
|
+
const links = this.getLinks(config);
|
|
18581
18591
|
// Check for upgrade
|
|
18582
|
-
this.
|
|
18592
|
+
this.upgradeLinks = this.getCompatibleUpgradeLinks(links, config);
|
|
18583
18593
|
// Check for install links (if no upgrade need)
|
|
18584
|
-
this.installLinks = !this.
|
|
18585
|
-
yield sleep(
|
|
18594
|
+
this.installLinks = !this.upgradeLinks && this.getCompatibleInstallLinks(links);
|
|
18595
|
+
yield sleep(1000); // Add a delay, for animation
|
|
18586
18596
|
}
|
|
18587
18597
|
finally {
|
|
18588
18598
|
this.loading = false;
|
|
18589
18599
|
this.markForCheck();
|
|
18590
18600
|
}
|
|
18601
|
+
// Listening downloading promise, if exists
|
|
18602
|
+
(this.upgradeLinks || []).forEach(link => {
|
|
18603
|
+
const promise = this.platform.getDownloadingPromise(link.url);
|
|
18604
|
+
if (promise)
|
|
18605
|
+
this.listenDownloadPromise(link.url, promise);
|
|
18606
|
+
});
|
|
18591
18607
|
});
|
|
18592
18608
|
}
|
|
18593
18609
|
getCompatibleInstallLinks(installLinks) {
|
|
@@ -18618,7 +18634,7 @@ class AppInstallUpgradeCard {
|
|
|
18618
18634
|
});
|
|
18619
18635
|
return isNotEmptyArray(upgradeLinks) ? upgradeLinks : undefined;
|
|
18620
18636
|
}
|
|
18621
|
-
|
|
18637
|
+
getLinks(config) {
|
|
18622
18638
|
const result = [];
|
|
18623
18639
|
// Android
|
|
18624
18640
|
{
|
|
@@ -18626,16 +18642,20 @@ class AppInstallUpgradeCard {
|
|
|
18626
18642
|
let url = config.getProperty(CORE_CONFIG_OPTIONS.ANDROID_INSTALL_URL);
|
|
18627
18643
|
if (isNilOrBlank(url))
|
|
18628
18644
|
url = this.environment.defaultAndroidInstallUrl || null;
|
|
18645
|
+
// Resolve relative URL
|
|
18646
|
+
const peer = this.network.peer;
|
|
18647
|
+
if (peer && (url.startsWith('./') || url.startsWith('/'))) {
|
|
18648
|
+
url = Peer.path(peer, url);
|
|
18649
|
+
}
|
|
18629
18650
|
const minVersion = config.getProperty(CORE_CONFIG_OPTIONS.APP_MIN_VERSION);
|
|
18630
18651
|
// Compute App name
|
|
18631
18652
|
const name = isNotNilOrBlank(url) && config.label || this.environment.defaultAppName || 'SUMARiS';
|
|
18632
18653
|
if (url) {
|
|
18633
|
-
let
|
|
18634
|
-
let version;
|
|
18654
|
+
let title;
|
|
18635
18655
|
let mimeType;
|
|
18636
18656
|
// Get file name
|
|
18637
|
-
|
|
18638
|
-
version = minVersion || 'latest';
|
|
18657
|
+
let filename = this.getFilename(url);
|
|
18658
|
+
let version = minVersion || 'latest';
|
|
18639
18659
|
// OK, this is a downloadable APK file (e.g. NOT a link to a playstore)
|
|
18640
18660
|
if (filename === null || filename === void 0 ? void 0 : filename.endsWith('.apk')) {
|
|
18641
18661
|
// Define mime type
|
|
@@ -18644,18 +18664,18 @@ class AppInstallUpgradeCard {
|
|
|
18644
18664
|
const versionMatches = /-v([1-9][0-9]*\.[0-9]+\.(:?(:?alpha|beta|rc)?[0-9]*))/i.exec(filename);
|
|
18645
18665
|
version = versionMatches && versionMatches[1] || version;
|
|
18646
18666
|
// Compute a new file name, with the version
|
|
18647
|
-
if (isNotNilOrBlank(name)) {
|
|
18648
|
-
|
|
18667
|
+
if (isNotNilOrBlank(name) && version !== 'latest') {
|
|
18668
|
+
filename = `${name}-v${version}.apk`.toLowerCase();
|
|
18669
|
+
title = `${name} v${version}`;
|
|
18649
18670
|
}
|
|
18650
18671
|
else {
|
|
18651
|
-
downloadFilename = filename;
|
|
18652
18672
|
// Replace 'latest' with the app version, if present
|
|
18653
|
-
if (
|
|
18654
|
-
|
|
18673
|
+
if (filename.indexOf('latest')) {
|
|
18674
|
+
filename = filename.replace('latest', version);
|
|
18655
18675
|
}
|
|
18656
18676
|
}
|
|
18657
18677
|
}
|
|
18658
|
-
result.push({ name, url, platform: 'android', version,
|
|
18678
|
+
result.push({ name, url, platform: 'android', version, filename, title, mimeType });
|
|
18659
18679
|
}
|
|
18660
18680
|
}
|
|
18661
18681
|
// iOS - TODO
|
|
@@ -18684,11 +18704,69 @@ class AppInstallUpgradeCard {
|
|
|
18684
18704
|
yield Toasts.show(this.toastController, this.translate, opts);
|
|
18685
18705
|
});
|
|
18686
18706
|
}
|
|
18707
|
+
listenDownloadPromise(url, promise) {
|
|
18708
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18709
|
+
if (!url || !promise)
|
|
18710
|
+
return; // Skip
|
|
18711
|
+
try {
|
|
18712
|
+
// Mark as downloading
|
|
18713
|
+
if (!this.downloading) {
|
|
18714
|
+
console.info(`[install-upgrade-card] Platform is downloading \'${url}\' ...`);
|
|
18715
|
+
this.downloading = true;
|
|
18716
|
+
this.markForCheck();
|
|
18717
|
+
}
|
|
18718
|
+
const location = yield promise;
|
|
18719
|
+
console.info('[install-upgrade-card] File downloaded at: ' + location);
|
|
18720
|
+
}
|
|
18721
|
+
// Failed: display a toast
|
|
18722
|
+
catch (err) {
|
|
18723
|
+
console.error('[install-upgrade] Download failed: ' + (err && err.message || err));
|
|
18724
|
+
return this.showDownloadFailedToast(err);
|
|
18725
|
+
}
|
|
18726
|
+
finally {
|
|
18727
|
+
this.downloading = false;
|
|
18728
|
+
this.markForCheck();
|
|
18729
|
+
}
|
|
18730
|
+
return this.showDownloadCompleteDialog();
|
|
18731
|
+
});
|
|
18732
|
+
}
|
|
18733
|
+
showDownloadFailedToast(err) {
|
|
18734
|
+
return this.showToast({
|
|
18735
|
+
message: 'ERROR.DOWNLOAD_FAILED',
|
|
18736
|
+
messageParams: { error: err },
|
|
18737
|
+
type: 'error',
|
|
18738
|
+
showCloseButton: true
|
|
18739
|
+
});
|
|
18740
|
+
}
|
|
18741
|
+
showDownloadCompleteDialog() {
|
|
18742
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18743
|
+
if (!this._subscription)
|
|
18744
|
+
return; // Skip if component has been destroyed
|
|
18745
|
+
const translations = yield this.translate.get([
|
|
18746
|
+
'INFO.ALERT_HEADER',
|
|
18747
|
+
'INFO.DOWNLOAD_UPDATE_SUCCEED',
|
|
18748
|
+
'COMMON.BTN_CLOSE'
|
|
18749
|
+
]).toPromise();
|
|
18750
|
+
const alert = yield this.alertController.create({
|
|
18751
|
+
header: translations['INFO.ALERT_HEADER'],
|
|
18752
|
+
message: translations['INFO.DOWNLOAD_UPDATE_SUCCEED'],
|
|
18753
|
+
buttons: [
|
|
18754
|
+
{
|
|
18755
|
+
text: translations['COMMON.BTN_CLOSE'],
|
|
18756
|
+
role: 'cancel',
|
|
18757
|
+
cssClass: 'secondary'
|
|
18758
|
+
}
|
|
18759
|
+
]
|
|
18760
|
+
});
|
|
18761
|
+
yield alert.present();
|
|
18762
|
+
yield alert.onDidDismiss();
|
|
18763
|
+
});
|
|
18764
|
+
}
|
|
18687
18765
|
}
|
|
18688
18766
|
AppInstallUpgradeCard.decorators = [
|
|
18689
18767
|
{ type: Component, args: [{
|
|
18690
18768
|
selector: 'app-install-upgrade-card',
|
|
18691
|
-
template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n
|
|
18769
|
+
template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && upgradeLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of upgradeLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Update offline feature card-->\n<ion-card *ngIf=\"showUpdateOfflineFeature && !loading && !offline\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h4>\n <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE'| translate\"></b>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"onUpdateOfflineModeClick.emit($event)\">\n <span translate>NETWORK.BTN_UPDATE</span>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.downloadFilename; else redirectButton\">\n\n <ng-container *ngIf=\"platform.canDownload; else webDownloadButton\">\n <!-- Download using platform -->\n <ion-button (click)=\"download($event, asLink(link))\"\n [disabled]=\"link.downloading\"\n color=\"tertiary\" class=\"ion-float-end\">\n <ion-icon slot=\"start\" *ngIf=\"!link.downloading\" name=\"download\"></ion-icon>\n <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"link.downloading\"></ion-spinner>\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-container>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n\n\n<!-- Waiting spinner -->\n<ng-template #waitingSpinner>\n <ion-spinner color=\"light\"></ion-spinner>\n</ng-template>\n",
|
|
18692
18770
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
18693
18771
|
animations: [slideUpDownAnimation],
|
|
18694
18772
|
styles: ["ion-text small{font-size:85%}"]
|
|
@@ -18698,6 +18776,7 @@ AppInstallUpgradeCard.ctorParameters = () => [
|
|
|
18698
18776
|
{ type: ModalController },
|
|
18699
18777
|
{ type: ConfigService },
|
|
18700
18778
|
{ type: ToastController },
|
|
18779
|
+
{ type: AlertController },
|
|
18701
18780
|
{ type: TranslateService },
|
|
18702
18781
|
{ type: ChangeDetectorRef },
|
|
18703
18782
|
{ type: PlatformService },
|