@sumaris-net/ngx-components 18.27.2 → 18.27.4
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/doc/changelog.md +14 -0
- package/esm2022/public_api.mjs +2 -1
- package/esm2022/src/app/core/about/about.modal.mjs +61 -17
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +2 -2
- package/esm2022/src/app/core/table/async-table.class.mjs +16 -10
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +1 -1
- package/esm2022/src/app/core/table/table.class.mjs +8 -8
- package/esm2022/src/app/shared/alerts.mjs +42 -8
- package/esm2022/src/app/shared/gitlab/gitlab.utils.mjs +170 -0
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +3 -3
- package/esm2022/src/app/shared/markdown/markdown.component.mjs +4 -3
- package/esm2022/src/app/shared/markdown/markdown.utils.mjs +3 -12
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +10 -4
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +41 -4
- package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +1 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +335 -54
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/src/app/core/about/about.modal.d.ts +8 -3
- package/src/app/core/form/entity/entity-editor.class.d.ts +4 -1
- package/src/app/core/table/async-table.class.d.ts +12 -2
- package/src/app/core/table/table.class.d.ts +10 -2
- package/src/app/shared/alerts.d.ts +39 -4
- package/src/app/shared/gitlab/gitlab.utils.d.ts +109 -0
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +4 -0
- package/src/app/shared/inputs.d.ts +1 -1
- package/src/app/shared/markdown/markdown.utils.d.ts +0 -2
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +5 -1
- package/src/app/shared/upload-file/upload-file.component.d.ts +6 -2
- package/src/app/shared/upload-file/upload-file.model.d.ts +7 -0
- package/src/assets/i18n/en-US.json +2 -0
- package/src/assets/i18n/en.json +2 -0
- package/src/assets/i18n/fr.json +2 -0
- package/src/assets/manifest.json +1 -1
- package/testing/package.json +0 -3
|
@@ -7,8 +7,11 @@ export class Alerts {
|
|
|
7
7
|
* @param alertCtrl
|
|
8
8
|
* @param translate
|
|
9
9
|
* @param event
|
|
10
|
+
* @param opts
|
|
11
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
12
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
10
13
|
*/
|
|
11
|
-
static async askSaveBeforeLeave(alertCtrl, translate, event) {
|
|
14
|
+
static async askSaveBeforeLeave(alertCtrl, translate, event, opts) {
|
|
12
15
|
let confirm = false;
|
|
13
16
|
let cancel = false;
|
|
14
17
|
const translations = translate.instant([
|
|
@@ -42,6 +45,8 @@ export class Alerts {
|
|
|
42
45
|
},
|
|
43
46
|
},
|
|
44
47
|
],
|
|
48
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
49
|
+
keyboardClose: opts?.keyboardClose,
|
|
45
50
|
});
|
|
46
51
|
await alert.present();
|
|
47
52
|
await alert.onDidDismiss();
|
|
@@ -63,10 +68,13 @@ export class Alerts {
|
|
|
63
68
|
* @param immediate is action has an immediate effect ?
|
|
64
69
|
* @param event
|
|
65
70
|
* @param interpolateParams
|
|
71
|
+
* @param opts
|
|
72
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
73
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
66
74
|
*/
|
|
67
|
-
static async askActionConfirmation(alertCtrl, translate, immediate, event, interpolateParams) {
|
|
75
|
+
static async askActionConfirmation(alertCtrl, translate, immediate, event, opts, interpolateParams) {
|
|
68
76
|
const messageKey = immediate === true ? 'CONFIRM.ACTION_IMMEDIATE' : 'CONFIRM.ACTION';
|
|
69
|
-
return Alerts.askConfirmation(messageKey, alertCtrl, translate, event, interpolateParams);
|
|
77
|
+
return Alerts.askConfirmation(messageKey, alertCtrl, translate, event, opts, interpolateParams);
|
|
70
78
|
}
|
|
71
79
|
/**
|
|
72
80
|
* Ask the user to confirm. If return undefined: user has cancelled
|
|
@@ -77,13 +85,21 @@ export class Alerts {
|
|
|
77
85
|
* @param translate
|
|
78
86
|
* @param event
|
|
79
87
|
* @param interpolateParams
|
|
88
|
+
* @param opts
|
|
89
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
90
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
91
|
+
*
|
|
92
|
+
* Note: interpolateParams and opts are merged for translation for compatibility
|
|
80
93
|
*/
|
|
81
|
-
static async askConfirmation(messageKey, alertCtrl, translate, event, interpolateParams) {
|
|
94
|
+
static async askConfirmation(messageKey, alertCtrl, translate, event, opts, interpolateParams) {
|
|
82
95
|
if (!alertCtrl || !translate)
|
|
83
96
|
throw new Error("Missing required argument 'alertCtrl' or 'translate'");
|
|
84
97
|
let confirm = false;
|
|
85
98
|
let cancel = false;
|
|
86
|
-
const translations = translate.instant(['COMMON.BTN_YES_CONTINUE', 'COMMON.BTN_CANCEL', messageKey, 'CONFIRM.ALERT_HEADER'],
|
|
99
|
+
const translations = translate.instant(['COMMON.BTN_YES_CONTINUE', 'COMMON.BTN_CANCEL', messageKey, 'CONFIRM.ALERT_HEADER'], {
|
|
100
|
+
...interpolateParams,
|
|
101
|
+
...opts,
|
|
102
|
+
});
|
|
87
103
|
const alert = await alertCtrl.create({
|
|
88
104
|
header: translations['CONFIRM.ALERT_HEADER'],
|
|
89
105
|
message: translations[messageKey],
|
|
@@ -103,6 +119,8 @@ export class Alerts {
|
|
|
103
119
|
},
|
|
104
120
|
},
|
|
105
121
|
],
|
|
122
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
123
|
+
keyboardClose: opts?.keyboardClose,
|
|
106
124
|
});
|
|
107
125
|
await alert.present();
|
|
108
126
|
await alert.onDidDismiss();
|
|
@@ -123,11 +141,19 @@ export class Alerts {
|
|
|
123
141
|
* @param translate
|
|
124
142
|
* @param event
|
|
125
143
|
* @param interpolateParams
|
|
144
|
+
* @param opts
|
|
145
|
+
* @param opts.backdropDismiss Whether the alert can be dismissed by clicking the backdrop (default: true)
|
|
146
|
+
* @param opts.keyboardClose Whether the alert can be dismissed by pressing the back button (default: true)
|
|
147
|
+
*
|
|
148
|
+
* Note: interpolateParams and opts are merged for translation for compatibility
|
|
126
149
|
*/
|
|
127
|
-
static async askDeleteConfirmation(alertCtrl, translate, event, interpolateParams) {
|
|
150
|
+
static async askDeleteConfirmation(alertCtrl, translate, event, opts, interpolateParams) {
|
|
128
151
|
let confirm = false;
|
|
129
152
|
let cancel = false;
|
|
130
|
-
const translations = translate.instant(['COMMON.BTN_YES_DELETE', 'COMMON.BTN_CANCEL', 'CONFIRM.DELETE', 'CONFIRM.ALERT_HEADER'],
|
|
153
|
+
const translations = translate.instant(['COMMON.BTN_YES_DELETE', 'COMMON.BTN_CANCEL', 'CONFIRM.DELETE', 'CONFIRM.ALERT_HEADER'], {
|
|
154
|
+
...interpolateParams,
|
|
155
|
+
...opts,
|
|
156
|
+
});
|
|
131
157
|
const alert = await alertCtrl.create({
|
|
132
158
|
header: translations['CONFIRM.ALERT_HEADER'],
|
|
133
159
|
message: translations['CONFIRM.DELETE'],
|
|
@@ -147,6 +173,8 @@ export class Alerts {
|
|
|
147
173
|
},
|
|
148
174
|
},
|
|
149
175
|
],
|
|
176
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
177
|
+
keyboardClose: opts?.keyboardClose,
|
|
150
178
|
});
|
|
151
179
|
await alert.present();
|
|
152
180
|
await alert.onDidDismiss();
|
|
@@ -194,6 +222,8 @@ export class Alerts {
|
|
|
194
222
|
},
|
|
195
223
|
},
|
|
196
224
|
],
|
|
225
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
226
|
+
keyboardClose: opts?.keyboardClose,
|
|
197
227
|
});
|
|
198
228
|
}
|
|
199
229
|
else {
|
|
@@ -215,6 +245,8 @@ export class Alerts {
|
|
|
215
245
|
handler: () => { },
|
|
216
246
|
},
|
|
217
247
|
],
|
|
248
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
249
|
+
keyboardClose: opts?.keyboardClose,
|
|
218
250
|
});
|
|
219
251
|
}
|
|
220
252
|
await alert.present();
|
|
@@ -235,9 +267,11 @@ export class Alerts {
|
|
|
235
267
|
role: 'cancel',
|
|
236
268
|
},
|
|
237
269
|
],
|
|
270
|
+
backdropDismiss: opts?.backdropDismiss,
|
|
271
|
+
keyboardClose: opts?.keyboardClose,
|
|
238
272
|
});
|
|
239
273
|
await alert.present();
|
|
240
274
|
await alert.onDidDismiss();
|
|
241
275
|
}
|
|
242
276
|
}
|
|
243
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvYWxlcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxNQUFNO0lBQ2pCOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUEwQixFQUFFLFNBQTJCLEVBQUUsS0FBYTtRQUNwRyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDckMsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQiwwQkFBMEI7WUFDMUIsY0FBYztZQUNkLHNCQUFzQjtTQUN2QixDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkMsTUFBTSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQztZQUM1QyxPQUFPLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztvQkFDdkMsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLE9BQU8sRUFBRSxHQUFHLEVBQUU7d0JBQ1osTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDaEIsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsWUFBWSxDQUFDLDBCQUEwQixDQUFDO29CQUM5QyxRQUFRLEVBQUUsV0FBVztvQkFDckIsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7aUJBQ2xCO2dCQUNEO29CQUNFLElBQUksRUFBRSxZQUFZLENBQUMsaUJBQWlCLENBQUM7b0JBQ3JDLE9BQU8sRUFBRSxHQUFHLEVBQUU7d0JBQ1osT0FBTyxHQUFHLElB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U0FBMkIsRUFDM0IsSUFFQyxFQUNELGlCQUF1QjtRQUV2QixJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztRQUN2SSxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksb0JBQW9CLENBQUM7UUFDakUsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNuRyxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkMsTUFBTSxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUM7WUFDOUIsT0FBTyxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDakMsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxZQUFZLENBQUMsZUFBZSxDQUFDO29CQUNuQyxJQUFJLEVBQUUsUUFBUTtpQkFDZjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEIsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgQWxlcnRzIHtcbiAgLyoqXG4gICAqIEFzayB0aGUgdXNlciB0byBzYXZlIGJlZm9yZSBsZWF2aW5nLiBJZiByZXR1cm4gdW5kZWZpbmVkOiB1c2VyIGhhcyBjYW5jZWxsZWRcbiAgICogPHA+XG4gICAqICAgZnJvbSBhIHJvdXRlZCBwYWdlLCBwcmVmZXIgdXNpbmcgQ29tcG9uZW50RGlydHlHdWFyZFxuICAgKlxuICAgKiBAcGFyYW0gYWxlcnRDdHJsXG4gICAqIEBwYXJhbSB0cmFuc2xhdGVcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrU2F2ZUJlZm9yZUxlYXZlKGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsIGV2ZW50PzogRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgY29uZmlybSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWwgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGUuaW5zdGFudChbXG4gICAgICAnQ09NTU9OLkJUTl9TQVZFJyxcbiAgICAgICdDT01NT04uQlROX0NBTkNFTCcsXG4gICAgICAnQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJyxcbiAgICAgICdDT05GSVJNLlNBVkUnLFxuICAgICAgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJyxcbiAgICBdKTtcbiAgICBjb25zdCBhbGVydCA9IGF3YWl0IGFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0cmFuc2xhdGlvbnNbJ0NPTkZJUk0uQUxFUlRfSEVBREVSJ10sXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbJ0NPTkZJUk0uU0FWRSddLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQUJPUlRfQ0hBTkdFUyddLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9TQVZFJ10sXG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uZmlybSA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmIChjb25maXJtKSByZXR1cm4gdHJ1ZTsgLy8gPSBEbyBzYXZlIGFuZCBsZWF2ZVxuXG4gICAgaWYgKGNhbmNlbCkge1xuICAgICAgLy8gU3RvcCB0aGUgZXZlbnRcbiAgICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gVXNlciBjYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIExlYXZlIHdpdGhvdXQgc2F2aW5nXG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSB1c2VyIHRvIGNvbmZvcm0gYW4gYWN0aW9uLiBJZiByZXR1cm4gdW5kZWZpbmVkOiB1c2VyIGhhcyBjYW5jZWxsZWRcbiAgICpcbiAgICogQHBhcmFtIGFsZXJ0Q3RybFxuICAgKiBAcGFyYW0gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSBpbW1lZGlhdGUgaXMgYWN0aW9uIGhhcyBhbiBpbW1lZGlhdGUgZWZmZWN0ID9cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBpbnRlcnBvbGF0ZVBhcmFtc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza0FjdGlvbkNvbmZpcm1hdGlvbihcbiAgICBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgaW1tZWRpYXRlPzogYm9vbGVhbixcbiAgICBldmVudD86IEV2ZW50LFxuICAgIGludGVycG9sYXRlUGFyYW1zPzogYW55XG4gICk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1lc3NhZ2VLZXkgPSBpbW1lZGlhdGUgPT09IHRydWUgPyAnQ09ORklSTS5BQ1RJT05fSU1NRURJQVRFJyA6ICdDT05GSVJNLkFDVElPTic7XG4gICAgcmV0dXJuIEFsZXJ0cy5hc2tDb25maXJtYXRpb24obWVzc2FnZUtleSwgYWxlcnRDdHJsLCB0cmFuc2xhdGUsIGV2ZW50LCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSB1c2VyIHRvIGNvbmZpcm0uIElmIHJldHVybiB1bmRlZmluZWQ6IHVzZXIgaGFzIGNhbmNlbGxlZFxuICAgKlxuICAgKiBAcHJhbSBtZXNzYWdlS2V5IGkxOG4gbWVzc2FnZSBrZXlcbiAgICogQHBhcmFtIG1lc3NhZ2VLZXlcbiAgICogQHBhcmFtIGFsZXJ0Q3RybFxuICAgKiBAcGFyYW0gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gaW50ZXJwb2xhdGVQYXJhbXNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tDb25maXJtYXRpb24oXG4gICAgbWVzc2FnZUtleTogc3RyaW5nLFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBldmVudD86IEV2ZW50LFxuICAgIGludGVycG9sYXRlUGFyYW1zPzogYW55XG4gICk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYWxlcnRDdHJsIHx8ICF0cmFuc2xhdGUpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgJ2FsZXJ0Q3RybCcgb3IgJ3RyYW5zbGF0ZSdcIik7XG4gICAgbGV0IGNvbmZpcm0gPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdHJhbnNsYXRlLmluc3RhbnQoWydDT01NT04uQlROX1lFU19DT05USU5VRScsICdDT01NT04uQlROX0NBTkNFTCcsIG1lc3NhZ2VLZXksICdDT05GSVJNLkFMRVJUX0hFQURFUiddLCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCBhbGVydEN0cmwuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydDT05GSVJNLkFMRVJUX0hFQURFUiddLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zW21lc3NhZ2VLZXldLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fWUVTX0NPTlRJTlVFJ10sXG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uZmlybSA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmIChjb25maXJtKSByZXR1cm4gdHJ1ZTsgLy8gPSBEbyBzYXZlIGFuZCBsZWF2ZVxuXG4gICAgaWYgKGNhbmNlbCkge1xuICAgICAgLy8gU3RvcCB0aGUgZXZlbnRcbiAgICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gVXNlciBjYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIExlYXZlIHdpdGhvdXQgc2F2aW5nXG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSB1c2VyIHRvIHNhdmUgYmVmb3JlIGxlYXZpbmcuIElmIHJldHVybiB1bmRlZmluZWQ6IHVzZXIgaGFzIGNhbmNlbGxlZFxuICAgKlxuICAgKiBAcGFyYW0gYWxlcnRDdHJsXG4gICAqIEBwYXJhbSB0cmFuc2xhdGVcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBpbnRlcnBvbGF0ZVBhcmFtc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza0RlbGV0ZUNvbmZpcm1hdGlvbihcbiAgICBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgZXZlbnQ/OiBFdmVudCxcbiAgICBpbnRlcnBvbGF0ZVBhcmFtcz86IGFueVxuICApOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgY29uZmlybSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWwgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGUuaW5zdGFudChcbiAgICAgIFsnQ09NTU9OLkJUTl9ZRVNfREVMRVRFJywgJ0NPTU1PTi5CVE5fQ0FOQ0VMJywgJ0NPTkZJUk0uREVMRVRFJywgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJ10sXG4gICAgICBpbnRlcnBvbGF0ZVBhcmFtc1xuICAgICk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCBhbGVydEN0cmwuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydDT05GSVJNLkFMRVJUX0hFQURFUiddLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydDT05GSVJNLkRFTEVURSddLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fWUVTX0RFTEVURSddLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbmZpcm0gPSB0cnVlOyAvLyB1cGRhdGUgdXBwZXIgdmFsdWVcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoY29uZmlybSkgcmV0dXJuIHRydWU7IC8vID0gRG8gc2F2ZSBhbmQgbGVhdmVcblxuICAgIGlmIChjYW5jZWwpIHtcbiAgICAgIC8vIFN0b3AgdGhlIGV2ZW50XG4gICAgICBpZiAoZXZlbnQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlOyAvLyBMZWF2ZSB3aXRob3V0IHNhdmluZ1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGFza1NhdmVCZWZvcmVBY3Rpb24oXG4gICAgYWxlcnRDdHJsOiBBbGVydENvbnRyb2xsZXIsXG4gICAgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIG9wdHM/OiB7IHZhbGlkPzogYm9vbGVhbjsgdmFsaWRNZXNzYWdlSTE4bj86IHN0cmluZzsgaW52YWxpZE1lc3NhZ2VJMThuPzogc3RyaW5nIH0sXG4gICAgaW50ZXJwb2xhdGVQYXJhbXM/OiBhbnlcbiAgKTogUHJvbWlzZTx7IGNvbmZpcm1lZDogYm9vbGVhbjsgc2F2ZTogYm9vbGVhbiB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHNhdmUgPSBmYWxzZTtcbiAgICBsZXQgY29uZmlybWVkID0gZmFsc2U7XG4gICAgbGV0IGFsZXJ0OiBIVE1MSW9uQWxlcnRFbGVtZW50O1xuICAgIGNvbnN0IHZhbGlkTWVzc2FnZUkxOG4gPSBvcHRzPy52YWxpZE1lc3NhZ2VJMThuIHx8ICdDT05GSVJNLlNBVkVfQkVGT1JFX0NPTlRJTlVFJztcbiAgICBjb25zdCBpbnZhbGlkTWVzc2FnZUkxOG4gPSBvcHRzPy5pbnZhbGlkTWVzc2FnZUkxOG4gfHwgJ0NPTkZJUk0uQ0FOQ0VMX0NIQU5HRVMnO1xuXG4gICAgLy8gQXNrIHVzZXIgYmVmb3JlIHNhdmVcbiAgICBpZiAob3B0cz8udmFsaWQpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICBbJ0NPTU1PTi5CVE5fQ0FOQ0VMJywgJ0NPTU1PTi5CVE5fU0FWRScsICdDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnLCAnQ09ORklSTS5BTEVSVF9IRUFERVInLCB2YWxpZE1lc3NhZ2VJMThuXSxcbiAgICAgICAgaW50ZXJwb2xhdGVQYXJhbXNcbiAgICAgICk7XG4gICAgICBhbGVydCA9IGF3YWl0IGFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zW3ZhbGlkTWVzc2FnZUkxOG5dLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgICAgcm9sZTogJ2NhbmNlbCcsXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJ10sXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX1NBVkUnXSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgc2F2ZSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gdHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIFsnQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJywgJ0NPTU1PTi5CVE5fQ0FOQ0VMJywgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJywgaW52YWxpZE1lc3NhZ2VJMThuXSxcbiAgICAgICAgaW50ZXJwb2xhdGVQYXJhbXNcbiAgICAgICk7XG5cbiAgICAgIGFsZXJ0ID0gYXdhaXQgYWxlcnRDdHJsLmNyZWF0ZSh7XG4gICAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydDT05GSVJNLkFMRVJUX0hFQURFUiddLFxuICAgICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbaW52YWxpZE1lc3NhZ2VJMThuXSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJ10sXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgICAgcm9sZTogJ2NhbmNlbCcsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICAgIGF3YWl0IGFsZXJ0Lm9uRGlkRGlzbWlzcygpO1xuXG4gICAgcmV0dXJuIHsgY29uZmlybWVkLCBzYXZlIH07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2hvd0Vycm9yKFxuICAgIG1lc3NhZ2VLZXk6IHN0cmluZyxcbiAgICBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgb3B0cz86IHtcbiAgICAgIHRpdGxlS2V5Pzogc3RyaW5nO1xuICAgIH0sXG4gICAgaW50ZXJwb2xhdGVQYXJhbXM/OiBhbnlcbiAgKSB7XG4gICAgaWYgKCFtZXNzYWdlS2V5IHx8ICFhbGVydEN0cmwgfHwgIXRyYW5zbGF0ZSkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBhIHJlcXVpcmVkIGFyZ3VtZW50ICgnbWVzc2FnZUtleScsICdhbGVydEN0cmwnIG9yICd0cmFuc2xhdGUnKVwiKTtcbiAgICBjb25zdCB0aXRsZUtleSA9IChvcHRzICYmIG9wdHMudGl0bGVLZXkpIHx8ICdFUlJPUi5BTEVSVF9IRUFERVInO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0ZS5pbnN0YW50KFsnQ09NTU9OLkJUTl9PSycsIG1lc3NhZ2VLZXksIHRpdGxlS2V5XSwgaW50ZXJwb2xhdGVQYXJhbXMpO1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgYWxlcnRDdHJsLmNyZWF0ZSh7XG4gICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1t0aXRsZUtleV0sXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbbWVzc2FnZUtleV0sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fT0snXSxcbiAgICAgICAgICByb2xlOiAnY2FuY2VsJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICAgIGF3YWl0IGFsZXJ0Lm9uRGlkRGlzbWlzcygpO1xuICB9XG59XG4iXX0=
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvYWxlcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxNQUFNO0lBQ2pCOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsU0FBMEIsRUFDMUIsU0FBMkIsRUFDM0IsS0FBYSxFQUNiLElBR0M7UUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDckMsaUJBQWlCO1lBQ2pCLG1CQUFtQjtZQUNuQiwwQkFBMEI7WUFDMUIsY0FBYztZQUNkLHNCQUFzQjtTQUN2QixDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkMsTUFBTSxFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQztZQUM1QyxPQUFPLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztvQkFDdkMsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLE9BQU8sRUFBRSxHQUFHLEVBQUU7d0JBQ1osTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDaEIsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsWUFBWSxDQUFDLDBCQUEwQixDQUFDO29CQUM5QyxRQUFRLEVBQUUsV0FBVztvQkFDckIsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7aUJBQ2xCO2dCQUNEO29CQUNFLElBQUksRUFBRSxZQUFZLENBQUMsaUJBQWlCLENBQUM7b0JBQ3JDLE9BQU8sRUFBRSxHQUFHLEVBQUU7d0JB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QUFlLENBQUM7b0JBQ25DLElBQUksRUFBRSxRQUFRO2lCQUNmO2FBQ0Y7WUFDRCxlQUFlLEVBQUUsSUFBSSxFQUFFLGVBQWU7WUFDdEMsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhO1NBQ25DLENBQUMsQ0FBQztRQUNILE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEFsZXJ0cyB7XG4gIC8qKlxuICAgKiBBc2sgdGhlIHVzZXIgdG8gc2F2ZSBiZWZvcmUgbGVhdmluZy4gSWYgcmV0dXJuIHVuZGVmaW5lZDogdXNlciBoYXMgY2FuY2VsbGVkXG4gICAqIDxwPlxuICAgKiAgIGZyb20gYSByb3V0ZWQgcGFnZSwgcHJlZmVyIHVzaW5nIENvbXBvbmVudERpcnR5R3VhcmRcbiAgICpcbiAgICogQHBhcmFtIGFsZXJ0Q3RybFxuICAgKiBAcGFyYW0gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gb3B0c1xuICAgKiBAcGFyYW0gb3B0cy5iYWNrZHJvcERpc21pc3MgV2hldGhlciB0aGUgYWxlcnQgY2FuIGJlIGRpc21pc3NlZCBieSBjbGlja2luZyB0aGUgYmFja2Ryb3AgKGRlZmF1bHQ6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRzLmtleWJvYXJkQ2xvc2UgV2hldGhlciB0aGUgYWxlcnQgY2FuIGJlIGRpc21pc3NlZCBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrU2F2ZUJlZm9yZUxlYXZlKFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBldmVudD86IEV2ZW50LFxuICAgIG9wdHM/OiB7XG4gICAgICBiYWNrZHJvcERpc21pc3M/OiBib29sZWFuO1xuICAgICAga2V5Ym9hcmRDbG9zZT86IGJvb2xlYW47XG4gICAgfVxuICApOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgY29uZmlybSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWwgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGUuaW5zdGFudChbXG4gICAgICAnQ09NTU9OLkJUTl9TQVZFJyxcbiAgICAgICdDT01NT04uQlROX0NBTkNFTCcsXG4gICAgICAnQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJyxcbiAgICAgICdDT05GSVJNLlNBVkUnLFxuICAgICAgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJyxcbiAgICBdKTtcbiAgICBjb25zdCBhbGVydCA9IGF3YWl0IGFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0cmFuc2xhdGlvbnNbJ0NPTkZJUk0uQUxFUlRfSEVBREVSJ10sXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbJ0NPTkZJUk0uU0FWRSddLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQUJPUlRfQ0hBTkdFUyddLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9TQVZFJ10sXG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uZmlybSA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBvcHRzPy5iYWNrZHJvcERpc21pc3MsXG4gICAgICBrZXlib2FyZENsb3NlOiBvcHRzPy5rZXlib2FyZENsb3NlLFxuICAgIH0pO1xuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmIChjb25maXJtKSByZXR1cm4gdHJ1ZTsgLy8gPSBEbyBzYXZlIGFuZCBsZWF2ZVxuXG4gICAgaWYgKGNhbmNlbCkge1xuICAgICAgLy8gU3RvcCB0aGUgZXZlbnRcbiAgICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gVXNlciBjYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIExlYXZlIHdpdGhvdXQgc2F2aW5nXG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSB1c2VyIHRvIGNvbmZvcm0gYW4gYWN0aW9uLiBJZiByZXR1cm4gdW5kZWZpbmVkOiB1c2VyIGhhcyBjYW5jZWxsZWRcbiAgICpcbiAgICogQHBhcmFtIGFsZXJ0Q3RybFxuICAgKiBAcGFyYW0gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSBpbW1lZGlhdGUgaXMgYWN0aW9uIGhhcyBhbiBpbW1lZGlhdGUgZWZmZWN0ID9cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBpbnRlcnBvbGF0ZVBhcmFtc1xuICAgKiBAcGFyYW0gb3B0c1xuICAgKiBAcGFyYW0gb3B0cy5iYWNrZHJvcERpc21pc3MgV2hldGhlciB0aGUgYWxlcnQgY2FuIGJlIGRpc21pc3NlZCBieSBjbGlja2luZyB0aGUgYmFja2Ryb3AgKGRlZmF1bHQ6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRzLmtleWJvYXJkQ2xvc2UgV2hldGhlciB0aGUgYWxlcnQgY2FuIGJlIGRpc21pc3NlZCBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrQWN0aW9uQ29uZmlybWF0aW9uKFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBpbW1lZGlhdGU/OiBib29sZWFuLFxuICAgIGV2ZW50PzogRXZlbnQsXG4gICAgb3B0cz86IHtcbiAgICAgIGJhY2tkcm9wRGlzbWlzcz86IGJvb2xlYW47XG4gICAgICBrZXlib2FyZENsb3NlPzogYm9vbGVhbjtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9LFxuICAgIGludGVycG9sYXRlUGFyYW1zPzogYW55XG4gICk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1lc3NhZ2VLZXkgPSBpbW1lZGlhdGUgPT09IHRydWUgPyAnQ09ORklSTS5BQ1RJT05fSU1NRURJQVRFJyA6ICdDT05GSVJNLkFDVElPTic7XG4gICAgcmV0dXJuIEFsZXJ0cy5hc2tDb25maXJtYXRpb24obWVzc2FnZUtleSwgYWxlcnRDdHJsLCB0cmFuc2xhdGUsIGV2ZW50LCBvcHRzLCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSB1c2VyIHRvIGNvbmZpcm0uIElmIHJldHVybiB1bmRlZmluZWQ6IHVzZXIgaGFzIGNhbmNlbGxlZFxuICAgKlxuICAgKiBAcHJhbSBtZXNzYWdlS2V5IGkxOG4gbWVzc2FnZSBrZXlcbiAgICogQHBhcmFtIG1lc3NhZ2VLZXlcbiAgICogQHBhcmFtIGFsZXJ0Q3RybFxuICAgKiBAcGFyYW0gdHJhbnNsYXRlXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0gaW50ZXJwb2xhdGVQYXJhbXNcbiAgICogQHBhcmFtIG9wdHNcbiAgICogQHBhcmFtIG9wdHMuYmFja2Ryb3BEaXNtaXNzIFdoZXRoZXIgdGhlIGFsZXJ0IGNhbiBiZSBkaXNtaXNzZWQgYnkgY2xpY2tpbmcgdGhlIGJhY2tkcm9wIChkZWZhdWx0OiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0cy5rZXlib2FyZENsb3NlIFdoZXRoZXIgdGhlIGFsZXJ0IGNhbiBiZSBkaXNtaXNzZWQgYnkgcHJlc3NpbmcgdGhlIGJhY2sgYnV0dG9uIChkZWZhdWx0OiB0cnVlKVxuICAgKlxuICAgKiBOb3RlOiBpbnRlcnBvbGF0ZVBhcmFtcyBhbmQgb3B0cyBhcmUgbWVyZ2VkIGZvciB0cmFuc2xhdGlvbiBmb3IgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza0NvbmZpcm1hdGlvbihcbiAgICBtZXNzYWdlS2V5OiBzdHJpbmcsXG4gICAgYWxlcnRDdHJsOiBBbGVydENvbnRyb2xsZXIsXG4gICAgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIGV2ZW50PzogRXZlbnQsXG4gICAgb3B0cz86IHtcbiAgICAgIGJhY2tkcm9wRGlzbWlzcz86IGJvb2xlYW47XG4gICAgICBrZXlib2FyZENsb3NlPzogYm9vbGVhbjtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9LFxuICAgIGludGVycG9sYXRlUGFyYW1zPzogYW55XG4gICk6IFByb21pc2U8Ym9vbGVhbiB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYWxlcnRDdHJsIHx8ICF0cmFuc2xhdGUpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgJ2FsZXJ0Q3RybCcgb3IgJ3RyYW5zbGF0ZSdcIik7XG4gICAgbGV0IGNvbmZpcm0gPSBmYWxzZTtcbiAgICBsZXQgY2FuY2VsID0gZmFsc2U7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdHJhbnNsYXRlLmluc3RhbnQoWydDT01NT04uQlROX1lFU19DT05USU5VRScsICdDT01NT04uQlROX0NBTkNFTCcsIG1lc3NhZ2VLZXksICdDT05GSVJNLkFMRVJUX0hFQURFUiddLCB7XG4gICAgICAuLi5pbnRlcnBvbGF0ZVBhcmFtcyxcbiAgICAgIC4uLm9wdHMsXG4gICAgfSk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCBhbGVydEN0cmwuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydDT05GSVJNLkFMRVJUX0hFQURFUiddLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zW21lc3NhZ2VLZXldLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fWUVTX0NPTlRJTlVFJ10sXG4gICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uZmlybSA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBvcHRzPy5iYWNrZHJvcERpc21pc3MsXG4gICAgICBrZXlib2FyZENsb3NlOiBvcHRzPy5rZXlib2FyZENsb3NlLFxuICAgIH0pO1xuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgIGlmIChjb25maXJtKSByZXR1cm4gdHJ1ZTsgLy8gPSBEbyBzYXZlIGFuZCBsZWF2ZVxuXG4gICAgaWYgKGNhbmNlbCkge1xuICAgICAgLy8gU3RvcCB0aGUgZXZlbnRcbiAgICAgIGlmIChldmVudCkgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gVXNlciBjYW5jZWxsZWRcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7IC8vIExlYXZlIHdpdGhvdXQgc2F2aW5nXG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSB1c2VyIHRvIHNhdmUgYmVmb3JlIGxlYXZpbmcuIElmIHJldHVybiB1bmRlZmluZWQ6IHVzZXIgaGFzIGNhbmNlbGxlZFxuICAgKlxuICAgKiBAcGFyYW0gYWxlcnRDdHJsXG4gICAqIEBwYXJhbSB0cmFuc2xhdGVcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBpbnRlcnBvbGF0ZVBhcmFtc1xuICAgKiBAcGFyYW0gb3B0c1xuICAgKiBAcGFyYW0gb3B0cy5iYWNrZHJvcERpc21pc3MgV2hldGhlciB0aGUgYWxlcnQgY2FuIGJlIGRpc21pc3NlZCBieSBjbGlja2luZyB0aGUgYmFja2Ryb3AgKGRlZmF1bHQ6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRzLmtleWJvYXJkQ2xvc2UgV2hldGhlciB0aGUgYWxlcnQgY2FuIGJlIGRpc21pc3NlZCBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gKGRlZmF1bHQ6IHRydWUpXG4gICAqXG4gICAqIE5vdGU6IGludGVycG9sYXRlUGFyYW1zIGFuZCBvcHRzIGFyZSBtZXJnZWQgZm9yIHRyYW5zbGF0aW9uIGZvciBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrRGVsZXRlQ29uZmlybWF0aW9uKFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBldmVudD86IEV2ZW50LFxuICAgIG9wdHM/OiB7XG4gICAgICBiYWNrZHJvcERpc21pc3M/OiBib29sZWFuO1xuICAgICAga2V5Ym9hcmRDbG9zZT86IGJvb2xlYW47XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgfSxcbiAgICBpbnRlcnBvbGF0ZVBhcmFtcz86IGFueVxuICApOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgY29uZmlybSA9IGZhbHNlO1xuICAgIGxldCBjYW5jZWwgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGUuaW5zdGFudChbJ0NPTU1PTi5CVE5fWUVTX0RFTEVURScsICdDT01NT04uQlROX0NBTkNFTCcsICdDT05GSVJNLkRFTEVURScsICdDT05GSVJNLkFMRVJUX0hFQURFUiddLCB7XG4gICAgICAuLi5pbnRlcnBvbGF0ZVBhcmFtcyxcbiAgICAgIC4uLm9wdHMsXG4gICAgfSk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCBhbGVydEN0cmwuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydDT05GSVJNLkFMRVJUX0hFQURFUiddLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydDT05GSVJNLkRFTEVURSddLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fWUVTX0RFTEVURSddLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbmZpcm0gPSB0cnVlOyAvLyB1cGRhdGUgdXBwZXIgdmFsdWVcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogb3B0cz8uYmFja2Ryb3BEaXNtaXNzLFxuICAgICAga2V5Ym9hcmRDbG9zZTogb3B0cz8ua2V5Ym9hcmRDbG9zZSxcbiAgICB9KTtcbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoY29uZmlybSkgcmV0dXJuIHRydWU7IC8vID0gRG8gc2F2ZSBhbmQgbGVhdmVcblxuICAgIGlmIChjYW5jZWwpIHtcbiAgICAgIC8vIFN0b3AgdGhlIGV2ZW50XG4gICAgICBpZiAoZXZlbnQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFVzZXIgY2FuY2VsbGVkXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlOyAvLyBMZWF2ZSB3aXRob3V0IHNhdmluZ1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGFza1NhdmVCZWZvcmVBY3Rpb24oXG4gICAgYWxlcnRDdHJsOiBBbGVydENvbnRyb2xsZXIsXG4gICAgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIG9wdHM/OiB7XG4gICAgICB2YWxpZD86IGJvb2xlYW47XG4gICAgICB2YWxpZE1lc3NhZ2VJMThuPzogc3RyaW5nO1xuICAgICAgaW52YWxpZE1lc3NhZ2VJMThuPzogc3RyaW5nO1xuICAgICAgYmFja2Ryb3BEaXNtaXNzPzogYm9vbGVhbjtcbiAgICAgIGtleWJvYXJkQ2xvc2U/OiBib29sZWFuO1xuICAgIH0sXG4gICAgaW50ZXJwb2xhdGVQYXJhbXM/OiBhbnlcbiAgKTogUHJvbWlzZTx7IGNvbmZpcm1lZDogYm9vbGVhbjsgc2F2ZTogYm9vbGVhbiB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHNhdmUgPSBmYWxzZTtcbiAgICBsZXQgY29uZmlybWVkID0gZmFsc2U7XG4gICAgbGV0IGFsZXJ0OiBIVE1MSW9uQWxlcnRFbGVtZW50O1xuICAgIGNvbnN0IHZhbGlkTWVzc2FnZUkxOG4gPSBvcHRzPy52YWxpZE1lc3NhZ2VJMThuIHx8ICdDT05GSVJNLlNBVkVfQkVGT1JFX0NPTlRJTlVFJztcbiAgICBjb25zdCBpbnZhbGlkTWVzc2FnZUkxOG4gPSBvcHRzPy5pbnZhbGlkTWVzc2FnZUkxOG4gfHwgJ0NPTkZJUk0uQ0FOQ0VMX0NIQU5HRVMnO1xuXG4gICAgLy8gQXNrIHVzZXIgYmVmb3JlIHNhdmVcbiAgICBpZiAob3B0cz8udmFsaWQpIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICBbJ0NPTU1PTi5CVE5fQ0FOQ0VMJywgJ0NPTU1PTi5CVE5fU0FWRScsICdDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnLCAnQ09ORklSTS5BTEVSVF9IRUFERVInLCB2YWxpZE1lc3NhZ2VJMThuXSxcbiAgICAgICAgaW50ZXJwb2xhdGVQYXJhbXNcbiAgICAgICk7XG4gICAgICBhbGVydCA9IGF3YWl0IGFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zW3ZhbGlkTWVzc2FnZUkxOG5dLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NBTkNFTCddLFxuICAgICAgICAgICAgcm9sZTogJ2NhbmNlbCcsXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7fSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9BQk9SVF9DSEFOR0VTJ10sXG4gICAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeScsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX1NBVkUnXSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgc2F2ZSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGJhY2tkcm9wRGlzbWlzczogb3B0cz8uYmFja2Ryb3BEaXNtaXNzLFxuICAgICAgICBrZXlib2FyZENsb3NlOiBvcHRzPy5rZXlib2FyZENsb3NlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICBbJ0NPTU1PTi5CVE5fQUJPUlRfQ0hBTkdFUycsICdDT01NT04uQlROX0NBTkNFTCcsICdDT05GSVJNLkFMRVJUX0hFQURFUicsIGludmFsaWRNZXNzYWdlSTE4bl0sXG4gICAgICAgIGludGVycG9sYXRlUGFyYW1zXG4gICAgICApO1xuXG4gICAgICBhbGVydCA9IGF3YWl0IGFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zW2ludmFsaWRNZXNzYWdlSTE4bl0sXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQUJPUlRfQ0hBTkdFUyddLFxuICAgICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25maXJtZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9DQU5DRUwnXSxcbiAgICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge30sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYmFja2Ryb3BEaXNtaXNzOiBvcHRzPy5iYWNrZHJvcERpc21pc3MsXG4gICAgICAgIGtleWJvYXJkQ2xvc2U6IG9wdHM/LmtleWJvYXJkQ2xvc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG5cbiAgICByZXR1cm4geyBjb25maXJtZWQsIHNhdmUgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBzaG93RXJyb3IoXG4gICAgbWVzc2FnZUtleTogc3RyaW5nLFxuICAgIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBvcHRzPzoge1xuICAgICAgdGl0bGVLZXk/OiBzdHJpbmc7XG4gICAgICBiYWNrZHJvcERpc21pc3M/OiBib29sZWFuO1xuICAgICAga2V5Ym9hcmRDbG9zZT86IGJvb2xlYW47XG4gICAgfSxcbiAgICBpbnRlcnBvbGF0ZVBhcmFtcz86IGFueVxuICApIHtcbiAgICBpZiAoIW1lc3NhZ2VLZXkgfHwgIWFsZXJ0Q3RybCB8fCAhdHJhbnNsYXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGEgcmVxdWlyZWQgYXJndW1lbnQgKCdtZXNzYWdlS2V5JywgJ2FsZXJ0Q3RybCcgb3IgJ3RyYW5zbGF0ZScpXCIpO1xuICAgIGNvbnN0IHRpdGxlS2V5ID0gKG9wdHMgJiYgb3B0cy50aXRsZUtleSkgfHwgJ0VSUk9SLkFMRVJUX0hFQURFUic7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdHJhbnNsYXRlLmluc3RhbnQoWydDT01NT04uQlROX09LJywgbWVzc2FnZUtleSwgdGl0bGVLZXldLCBpbnRlcnBvbGF0ZVBhcmFtcyk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCBhbGVydEN0cmwuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zW3RpdGxlS2V5XSxcbiAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0aW9uc1ttZXNzYWdlS2V5XSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9PSyddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogb3B0cz8uYmFja2Ryb3BEaXNtaXNzLFxuICAgICAga2V5Ym9hcmRDbG9zZTogb3B0cz8ua2V5Ym9hcmRDbG9zZSxcbiAgICB9KTtcbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { HttpUtils } from '../http/http.utils';
|
|
2
|
+
import { UrlUtils } from '../file/url.utils';
|
|
3
|
+
export class GitlabUtils {
|
|
4
|
+
static API_V4_PATH = '/api/v4/';
|
|
5
|
+
static API_V4_PROJECTS_PATH = '/api/v4/projects/';
|
|
6
|
+
/**
|
|
7
|
+
* Checks whether a URL points to a Gitlab instance.
|
|
8
|
+
*
|
|
9
|
+
* A URL is considered a Gitlab URL either when its host starts with 'gitlab.'
|
|
10
|
+
* (e.g. 'https://gitlab.ifremer.fr/...'), or when it is a repository file URL
|
|
11
|
+
* (see {@link isRepoFileUrl}) - in which case the host is NOT checked, since
|
|
12
|
+
* a self-hosted Gitlab instance may use a custom domain name.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* GitlabUtils.isGitlabUrl('https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app'); // true
|
|
16
|
+
* GitlabUtils.isGitlabUrl('https://my-custom-domain.com/foo/-/raw/master/README.md'); // true (repo file URL)
|
|
17
|
+
* GitlabUtils.isGitlabUrl('https://github.com/foo/bar'); // false
|
|
18
|
+
*/
|
|
19
|
+
static isGitlabUrl(url) {
|
|
20
|
+
if (!url)
|
|
21
|
+
return false;
|
|
22
|
+
return url.startsWith('https://gitlab.') || GitlabUtils.isRepoFileUrl(url);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Checks whether a URL is a Gitlab repository file URL, i.e. a URL used to
|
|
26
|
+
* view a single file in a repository ('/-/blob/') or to download its raw
|
|
27
|
+
* content ('/-/raw/').
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* GitlabUtils.isRepoFileUrl('https://gitlab.ifremer.fr/a/b/-/raw/master/README.md'); // true
|
|
31
|
+
* GitlabUtils.isRepoFileUrl('https://gitlab.ifremer.fr/a/b/-/blob/master/README.md'); // true
|
|
32
|
+
* GitlabUtils.isRepoFileUrl('https://gitlab.ifremer.fr/api/v4/projects/a%2Fb'); // false
|
|
33
|
+
*/
|
|
34
|
+
static isRepoFileUrl(url) {
|
|
35
|
+
if (!url)
|
|
36
|
+
return false;
|
|
37
|
+
return url.includes('/-/raw/') || url.includes('/-/blob/');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Converts a repository file URL into its 'raw content' equivalent, by
|
|
41
|
+
* replacing the '/-/blob/' (file viewer) or '/-/tree/' (directory viewer)
|
|
42
|
+
* segment with '/-/raw/'.
|
|
43
|
+
*
|
|
44
|
+
* If the URL is not a repository file URL (see {@link isRepoFileUrl}), it is
|
|
45
|
+
* returned unchanged.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* GitlabUtils.getRawRepoFileUrl('https://gitlab.ifremer.fr/a/b/-/blob/master/README.md');
|
|
49
|
+
* // 'https://gitlab.ifremer.fr/a/b/-/raw/master/README.md'
|
|
50
|
+
*/
|
|
51
|
+
static getRawRepoFileUrl(url) {
|
|
52
|
+
if (!GitlabUtils.isRepoFileUrl(url))
|
|
53
|
+
return url;
|
|
54
|
+
return url.replace('/-/blob/', '/-/raw/').replace('/-/tree/', '/-/raw/');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Checks whether a URL targets the Gitlab REST API (any endpoint under
|
|
58
|
+
* '/api/v4/'). Repository file URLs (see {@link isRepoFileUrl}) are always
|
|
59
|
+
* excluded, even if they happen to contain '/api/v4/' somewhere in their path.
|
|
60
|
+
*/
|
|
61
|
+
static isApiUrl(url) {
|
|
62
|
+
if (!url || GitlabUtils.isRepoFileUrl(url))
|
|
63
|
+
return false;
|
|
64
|
+
return url.includes(GitlabUtils.API_V4_PATH);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Checks whether a URL targets the Gitlab 'projects' REST API (any endpoint
|
|
68
|
+
* under '/api/v4/projects/'), e.g. project releases, branches, etc.
|
|
69
|
+
*/
|
|
70
|
+
static isApiProjectsUrl(url) {
|
|
71
|
+
if (!url || GitlabUtils.isRepoFileUrl(url))
|
|
72
|
+
return false;
|
|
73
|
+
return url.includes(GitlabUtils.API_V4_PROJECTS_PATH);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Checks whether a URL targets the Gitlab project releases REST API, e.g.
|
|
77
|
+
* 'https://gitlab.ifremer.fr/api/v4/projects/{id}/releases' (all releases)
|
|
78
|
+
* or 'https://gitlab.ifremer.fr/api/v4/projects/{id}/releases/{tag_name}'
|
|
79
|
+
* (a single release).
|
|
80
|
+
*/
|
|
81
|
+
static isProjectReleasesApiUrl(url) {
|
|
82
|
+
return GitlabUtils.isApiProjectsUrl(url) && url.includes('/releases');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Fetches releases from the Gitlab project releases REST API.
|
|
86
|
+
*
|
|
87
|
+
* The given URL can either target the collection endpoint
|
|
88
|
+
* ('.../releases', returning all releases), or a single release endpoint
|
|
89
|
+
* ('.../releases/{tag_name}', returning one release, wrapped into an array).
|
|
90
|
+
*
|
|
91
|
+
* @return the list of releases, an empty array if the API call failed for a
|
|
92
|
+
* single release, or `null` if the URL is not a project releases API URL.
|
|
93
|
+
*/
|
|
94
|
+
static async getProjectReleases(http, url) {
|
|
95
|
+
if (!GitlabUtils.isProjectReleasesApiUrl(url))
|
|
96
|
+
return null;
|
|
97
|
+
// Many releases API urls end with /releases
|
|
98
|
+
if (url.trim().endsWith('/releases')) {
|
|
99
|
+
return await HttpUtils.getJson(http, url);
|
|
100
|
+
}
|
|
101
|
+
// One release API url
|
|
102
|
+
try {
|
|
103
|
+
const release = await HttpUtils.getJson(http, url);
|
|
104
|
+
return release ? [release] : [];
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error('Failed to fetch release from the Gitlab API ' + url, err);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Extracts the URL-encoded project path (e.g. 'group%2Fsubgroup%2Fproject')
|
|
113
|
+
* from a Gitlab 'projects' API URL. The returned value is NOT decoded, so it
|
|
114
|
+
* still contains '%2F' in place of '/'.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* GitlabUtils.getProjectNameFromApiUrl('https://gitlab.ifremer.fr/api/v4/projects/sih-public%2Fsumaris%2Fsumaris-app/releases');
|
|
118
|
+
* // 'sih-public%2Fsumaris%2Fsumaris-app'
|
|
119
|
+
*/
|
|
120
|
+
static getProjectNameFromApiUrl(url) {
|
|
121
|
+
if (!url?.includes(GitlabUtils.API_V4_PROJECTS_PATH))
|
|
122
|
+
return null;
|
|
123
|
+
return url.slice(url.indexOf(GitlabUtils.API_V4_PROJECTS_PATH) + GitlabUtils.API_V4_PROJECTS_PATH.length)
|
|
124
|
+
.split('/', 2)[0];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Resolves the Gitlab web page associated to a URL:
|
|
128
|
+
* - for an API 'projects' URL (see {@link isApiUrl}), this is the project's
|
|
129
|
+
* home page, e.g. 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app';
|
|
130
|
+
* - for a repository file URL (see {@link isRepoFileUrl}), this is the
|
|
131
|
+
* project's raw content base path (e.g. '.../my-project/-/raw/'), since
|
|
132
|
+
* the project path cannot be reliably distinguished from the file path
|
|
133
|
+
* once slashes are un-encoded.
|
|
134
|
+
*
|
|
135
|
+
* @return `null` if the project page cannot be resolved from the given URL.
|
|
136
|
+
*/
|
|
137
|
+
static getProjectPage(url) {
|
|
138
|
+
if (GitlabUtils.isRepoFileUrl(url)) {
|
|
139
|
+
const fixUrl = GitlabUtils.getRawRepoFileUrl(url);
|
|
140
|
+
const index = fixUrl.indexOf('/-/raw/');
|
|
141
|
+
if (index >= 0)
|
|
142
|
+
return fixUrl.slice(0, index + '/-/raw/'.length);
|
|
143
|
+
}
|
|
144
|
+
else if (GitlabUtils.isApiUrl(url)) {
|
|
145
|
+
const index = url.indexOf(GitlabUtils.API_V4_PROJECTS_PATH);
|
|
146
|
+
if (index >= 0) {
|
|
147
|
+
const baseUrl = url.slice(0, index);
|
|
148
|
+
const projectName = GitlabUtils.getProjectNameFromApiUrl(url);
|
|
149
|
+
return UrlUtils.concat(baseUrl, projectName.replace(/%2F/g, '/'));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Builds the URL of the Gitlab web page listing a project's releases (e.g.
|
|
156
|
+
* 'https://gitlab.ifremer.fr/sih-public/sumaris/sumaris-app/-/releases'),
|
|
157
|
+
* optionally anchored on a specific version/tag.
|
|
158
|
+
*
|
|
159
|
+
* @param url any URL from which the project page can be resolved (see {@link getProjectPage})
|
|
160
|
+
* @param version optional tag name (e.g. '2.16.2') appended to the releases page
|
|
161
|
+
* @return `null` if the project page cannot be resolved from the given URL.
|
|
162
|
+
*/
|
|
163
|
+
static getProjectReleasePage(url, version) {
|
|
164
|
+
const basePath = GitlabUtils.getProjectPage(url);
|
|
165
|
+
if (!basePath)
|
|
166
|
+
return null;
|
|
167
|
+
return UrlUtils.concat(UrlUtils.concat(basePath, '/-/releases'), version);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZ2l0bGFiL2dpdGxhYi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBUTdDLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztJQUVsRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQVc7UUFDNUIsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN2QixPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQVc7UUFDOUIsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN2QixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBVztRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUNoRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFD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QUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDNUQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBVyxFQUFFLE9BQWdCO1FBQ3hELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUzQixPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUN4QyxPQUFPLENBQ1IsQ0FBQztJQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBVdGlsc30gZnJvbSAnLi4vaHR0cC9odHRwLnV0aWxzJztcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVXJsVXRpbHMgfSBmcm9tICcuLi9maWxlL3VybC51dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdpdGxhYlJlbGVhc2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhZ19uYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEdpdGxhYlV0aWxzIHtcbiAgc3RhdGljIEFQSV9WNF9QQVRIID0gJy9hcGkvdjQvJztcbiAgc3RhdGljIEFQSV9WNF9QUk9KRUNUU19QQVRIID0gJy9hcGkvdjQvcHJvamVjdHMvJztcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBVUkwgcG9pbnRzIHRvIGEgR2l0bGFiIGluc3RhbmNlLlxuICAgKlxuICAgKiBBIFVSTCBpcyBjb25zaWRlcmVkIGEgR2l0bGFiIFVSTCBlaXRoZXIgd2hlbiBpdHMgaG9zdCBzdGFydHMgd2l0aCAnZ2l0bGFiLidcbiAgICogKGUuZy4gJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvLi4uJyksIG9yIHdoZW4gaXQgaXMgYSByZXBvc2l0b3J5IGZpbGUgVVJMXG4gICAqIChzZWUge0BsaW5rIGlzUmVwb0ZpbGVVcmx9KSAtIGluIHdoaWNoIGNhc2UgdGhlIGhvc3QgaXMgTk9UIGNoZWNrZWQsIHNpbmNlXG4gICAqIGEgc2VsZi1ob3N0ZWQgR2l0bGFiIGluc3RhbmNlIG1heSB1c2UgYSBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIEdpdGxhYlV0aWxzLmlzR2l0bGFiVXJsKCdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL3NpaC1wdWJsaWMvc3VtYXJpcy9zdW1hcmlzLWFwcCcpOyAvLyB0cnVlXG4gICAqIEdpdGxhYlV0aWxzLmlzR2l0bGFiVXJsKCdodHRwczovL215LWN1c3RvbS1kb21haW4uY29tL2Zvby8tL3Jhdy9tYXN0ZXIvUkVBRE1FLm1kJyk7IC8vIHRydWUgKHJlcG8gZmlsZSBVUkwpXG4gICAqIEdpdGxhYlV0aWxzLmlzR2l0bGFiVXJsKCdodHRwczovL2dpdGh1Yi5jb20vZm9vL2JhcicpOyAvLyBmYWxzZVxuICAgKi9cbiAgc3RhdGljIGlzR2l0bGFiVXJsKHVybDogc3RyaW5nKSB7XG4gICAgaWYgKCF1cmwpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vZ2l0bGFiLicpIHx8IEdpdGxhYlV0aWxzLmlzUmVwb0ZpbGVVcmwodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIFVSTCBpcyBhIEdpdGxhYiByZXBvc2l0b3J5IGZpbGUgVVJMLCBpLmUuIGEgVVJMIHVzZWQgdG9cbiAgICogdmlldyBhIHNpbmdsZSBmaWxlIGluIGEgcmVwb3NpdG9yeSAoJy8tL2Jsb2IvJykgb3IgdG8gZG93bmxvYWQgaXRzIHJhd1xuICAgKiBjb250ZW50ICgnLy0vcmF3LycpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBHaXRsYWJVdGlscy5pc1JlcG9GaWxlVXJsKCdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL2EvYi8tL3Jhdy9tYXN0ZXIvUkVBRE1FLm1kJyk7IC8vIHRydWVcbiAgICogR2l0bGFiVXRpbHMuaXNSZXBvRmlsZVVybCgnaHR0cHM6Ly9naXRsYWIuaWZyZW1lci5mci9hL2IvLS9ibG9iL21hc3Rlci9SRUFETUUubWQnKTsgLy8gdHJ1ZVxuICAgKiBHaXRsYWJVdGlscy5pc1JlcG9GaWxlVXJsKCdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL2FwaS92NC9wcm9qZWN0cy9hJTJGYicpOyAvLyBmYWxzZVxuICAgKi9cbiAgc3RhdGljIGlzUmVwb0ZpbGVVcmwodXJsOiBzdHJpbmcpIHtcbiAgICBpZiAoIXVybCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB1cmwuaW5jbHVkZXMoJy8tL3Jhdy8nKSB8fCB1cmwuaW5jbHVkZXMoJy8tL2Jsb2IvJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSByZXBvc2l0b3J5IGZpbGUgVVJMIGludG8gaXRzICdyYXcgY29udGVudCcgZXF1aXZhbGVudCwgYnlcbiAgICogcmVwbGFjaW5nIHRoZSAnLy0vYmxvYi8nIChmaWxlIHZpZXdlcikgb3IgJy8tL3RyZWUvJyAoZGlyZWN0b3J5IHZpZXdlcilcbiAgICogc2VnbWVudCB3aXRoICcvLS9yYXcvJy5cbiAgICpcbiAgICogSWYgdGhlIFVSTCBpcyBub3QgYSByZXBvc2l0b3J5IGZpbGUgVVJMIChzZWUge0BsaW5rIGlzUmVwb0ZpbGVVcmx9KSwgaXQgaXNcbiAgICogcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBHaXRsYWJVdGlscy5nZXRSYXdSZXBvRmlsZVVybCgnaHR0cHM6Ly9naXRsYWIuaWZyZW1lci5mci9hL2IvLS9ibG9iL21hc3Rlci9SRUFETUUubWQnKTtcbiAgICogLy8gJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvYS9iLy0vcmF3L21hc3Rlci9SRUFETUUubWQnXG4gICAqL1xuICBzdGF0aWMgZ2V0UmF3UmVwb0ZpbGVVcmwodXJsOiBzdHJpbmcpIHtcbiAgICBpZiAoIUdpdGxhYlV0aWxzLmlzUmVwb0ZpbGVVcmwodXJsKSkgcmV0dXJuIHVybDtcbiAgICByZXR1cm4gdXJsLnJlcGxhY2UoJy8tL2Jsb2IvJywgJy8tL3Jhdy8nKS5yZXBsYWNlKCcvLS90cmVlLycsICcvLS9yYXcvJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBVUkwgdGFyZ2V0cyB0aGUgR2l0bGFiIFJFU1QgQVBJIChhbnkgZW5kcG9pbnQgdW5kZXJcbiAgICogJy9hcGkvdjQvJykuIFJlcG9zaXRvcnkgZmlsZSBVUkxzIChzZWUge0BsaW5rIGlzUmVwb0ZpbGVVcmx9KSBhcmUgYWx3YXlzXG4gICAqIGV4Y2x1ZGVkLCBldmVuIGlmIHRoZXkgaGFwcGVuIHRvIGNvbnRhaW4gJy9hcGkvdjQvJyBzb21ld2hlcmUgaW4gdGhlaXIgcGF0aC5cbiAgICovXG4gIHN0YXRpYyBpc0FwaVVybCh1cmw6IHN0cmluZykge1xuICAgIGlmICghdXJsIHx8IEdpdGxhYlV0aWxzLmlzUmVwb0ZpbGVVcmwodXJsKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB1cmwuaW5jbHVkZXMoR2l0bGFiVXRpbHMuQVBJX1Y0X1BBVEgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgVVJMIHRhcmdldHMgdGhlIEdpdGxhYiAncHJvamVjdHMnIFJFU1QgQVBJIChhbnkgZW5kcG9pbnRcbiAgICogdW5kZXIgJy9hcGkvdjQvcHJvamVjdHMvJyksIGUuZy4gcHJvamVjdCByZWxlYXNlcywgYnJhbmNoZXMsIGV0Yy5cbiAgICovXG4gIHN0YXRpYyBpc0FwaVByb2plY3RzVXJsKHVybDogc3RyaW5nKSB7XG4gICAgaWYgKCF1cmwgfHwgR2l0bGFiVXRpbHMuaXNSZXBvRmlsZVVybCh1cmwpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHVybC5pbmNsdWRlcyhHaXRsYWJVdGlscy5BUElfVjRfUFJPSkVDVFNfUEFUSCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBVUkwgdGFyZ2V0cyB0aGUgR2l0bGFiIHByb2plY3QgcmVsZWFzZXMgUkVTVCBBUEksIGUuZy5cbiAgICogJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvYXBpL3Y0L3Byb2plY3RzL3tpZH0vcmVsZWFzZXMnIChhbGwgcmVsZWFzZXMpXG4gICAqIG9yICdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL2FwaS92NC9wcm9qZWN0cy97aWR9L3JlbGVhc2VzL3t0YWdfbmFtZX0nXG4gICAqIChhIHNpbmdsZSByZWxlYXNlKS5cbiAgICovXG4gIHN0YXRpYyBpc1Byb2plY3RSZWxlYXNlc0FwaVVybCh1cmw6IHN0cmluZykge1xuICAgIHJldHVybiBHaXRsYWJVdGlscy5pc0FwaVByb2plY3RzVXJsKHVybCkgJiYgdXJsLmluY2x1ZGVzKCcvcmVsZWFzZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHJlbGVhc2VzIGZyb20gdGhlIEdpdGxhYiBwcm9qZWN0IHJlbGVhc2VzIFJFU1QgQVBJLlxuICAgKlxuICAgKiBUaGUgZ2l2ZW4gVVJMIGNhbiBlaXRoZXIgdGFyZ2V0IHRoZSBjb2xsZWN0aW9uIGVuZHBvaW50XG4gICAqICgnLi4uL3JlbGVhc2VzJywgcmV0dXJuaW5nIGFsbCByZWxlYXNlcyksIG9yIGEgc2luZ2xlIHJlbGVhc2UgZW5kcG9pbnRcbiAgICogKCcuLi4vcmVsZWFzZXMve3RhZ19uYW1lfScsIHJldHVybmluZyBvbmUgcmVsZWFzZSwgd3JhcHBlZCBpbnRvIGFuIGFycmF5KS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgbGlzdCBvZiByZWxlYXNlcywgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIEFQSSBjYWxsIGZhaWxlZCBmb3IgYVxuICAgKiAgIHNpbmdsZSByZWxlYXNlLCBvciBgbnVsbGAgaWYgdGhlIFVSTCBpcyBub3QgYSBwcm9qZWN0IHJlbGVhc2VzIEFQSSBVUkwuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0UHJvamVjdFJlbGVhc2VzKGh0dHA6IEh0dHBDbGllbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYgKCFHaXRsYWJVdGlscy5pc1Byb2plY3RSZWxlYXNlc0FwaVVybCh1cmwpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIE1hbnkgcmVsZWFzZXMgQVBJIHVybHMgZW5kIHdpdGggL3JlbGVhc2VzXG4gICAgaWYgKHVybC50cmltKCkuZW5kc1dpdGgoJy9yZWxlYXNlcycpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgSHR0cFV0aWxzLmdldEpzb248SUdpdGxhYlJlbGVhc2VbXT4oaHR0cCwgdXJsKTtcbiAgICB9XG5cbiAgICAvLyBPbmUgcmVsZWFzZSBBUEkgdXJsXG4gICAgdHJ5IHtcbiAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgSHR0cFV0aWxzLmdldEpzb248SUdpdGxhYlJlbGVhc2U+KGh0dHAsIHVybCk7XG4gICAgcmV0dXJuIHJlbGVhc2UgPyBbcmVsZWFzZV0gOiBbXTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCByZWxlYXNlIGZyb20gdGhlIEdpdGxhYiBBUEkgJyArIHVybCwgZXJyKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgVVJMLWVuY29kZWQgcHJvamVjdCBwYXRoIChlLmcuICdncm91cCUyRnN1Ymdyb3VwJTJGcHJvamVjdCcpXG4gICAqIGZyb20gYSBHaXRsYWIgJ3Byb2plY3RzJyBBUEkgVVJMLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgTk9UIGRlY29kZWQsIHNvIGl0XG4gICAqIHN0aWxsIGNvbnRhaW5zICclMkYnIGluIHBsYWNlIG9mICcvJy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogR2l0bGFiVXRpbHMuZ2V0UHJvamVjdE5hbWVGcm9tQXBpVXJsKCdodHRwczovL2dpdGxhYi5pZnJlbWVyLmZyL2FwaS92NC9wcm9qZWN0cy9zaWgtcHVibGljJTJGc3VtYXJpcyUyRnN1bWFyaXMtYXBwL3JlbGVhc2VzJyk7XG4gICAqIC8vICdzaWgtcHVibGljJTJGc3VtYXJpcyUyRnN1bWFyaXMtYXBwJ1xuICAgKi9cbiAgc3RhdGljIGdldFByb2plY3ROYW1lRnJvbUFwaVVybCh1cmw6IHN0cmluZykge1xuICAgIGlmICghdXJsPy5pbmNsdWRlcyhHaXRsYWJVdGlscy5BUElfVjRfUFJPSkVDVFNfUEFUSCkpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHVybC5zbGljZSh1cmwuaW5kZXhPZihHaXRsYWJVdGlscy5BUElfVjRfUFJPSkVDVFNfUEFUSCkgKyBHaXRsYWJVdGlscy5BUElfVjRfUFJPSkVDVFNfUEFUSC5sZW5ndGgpXG4gICAgICAuc3BsaXQoJy8nLCAyKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgR2l0bGFiIHdlYiBwYWdlIGFzc29jaWF0ZWQgdG8gYSBVUkw6XG4gICAqIC0gZm9yIGFuIEFQSSAncHJvamVjdHMnIFVSTCAoc2VlIHtAbGluayBpc0FwaVVybH0pLCB0aGlzIGlzIHRoZSBwcm9qZWN0J3NcbiAgICogICBob21lIHBhZ2UsIGUuZy4gJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvc2loLXB1YmxpYy9zdW1hcmlzL3N1bWFyaXMtYXBwJztcbiAgICogLSBmb3IgYSByZXBvc2l0b3J5IGZpbGUgVVJMIChzZWUge0BsaW5rIGlzUmVwb0ZpbGVVcmx9KSwgdGhpcyBpcyB0aGVcbiAgICogICBwcm9qZWN0J3MgcmF3IGNvbnRlbnQgYmFzZSBwYXRoIChlLmcuICcuLi4vbXktcHJvamVjdC8tL3Jhdy8nKSwgc2luY2VcbiAgICogICB0aGUgcHJvamVjdCBwYXRoIGNhbm5vdCBiZSByZWxpYWJseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIGZpbGUgcGF0aFxuICAgKiAgIG9uY2Ugc2xhc2hlcyBhcmUgdW4tZW5jb2RlZC5cbiAgICpcbiAgICogQHJldHVybiBgbnVsbGAgaWYgdGhlIHByb2plY3QgcGFnZSBjYW5ub3QgYmUgcmVzb2x2ZWQgZnJvbSB0aGUgZ2l2ZW4gVVJMLlxuICAgKi9cbiAgc3RhdGljIGdldFByb2plY3RQYWdlKHVybDogc3RyaW5nKSB7XG4gICAgaWYgKEdpdGxhYlV0aWxzLmlzUmVwb0ZpbGVVcmwodXJsKSkge1xuICAgICAgY29uc3QgZml4VXJsID0gR2l0bGFiVXRpbHMuZ2V0UmF3UmVwb0ZpbGVVcmwodXJsKTtcbiAgICAgIGNvbnN0IGluZGV4ID0gZml4VXJsLmluZGV4T2YoJy8tL3Jhdy8nKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSByZXR1cm4gZml4VXJsLnNsaWNlKDAsIGluZGV4ICsgJy8tL3Jhdy8nLmxlbmd0aCk7XG4gICAgfSBlbHNlIGlmIChHaXRsYWJVdGlscy5pc0FwaVVybCh1cmwpKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHVybC5pbmRleE9mKEdpdGxhYlV0aWxzLkFQSV9WNF9QUk9KRUNUU19QQVRIKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB1cmwuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICBjb25zdCBwcm9qZWN0TmFtZSA9IEdpdGxhYlV0aWxzLmdldFByb2plY3ROYW1lRnJvbUFwaVVybCh1cmwpO1xuICAgICAgICByZXR1cm4gVXJsVXRpbHMuY29uY2F0KGJhc2VVcmwsIHByb2plY3ROYW1lLnJlcGxhY2UoLyUyRi9nLCAnLycpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIFVSTCBvZiB0aGUgR2l0bGFiIHdlYiBwYWdlIGxpc3RpbmcgYSBwcm9qZWN0J3MgcmVsZWFzZXMgKGUuZy5cbiAgICogJ2h0dHBzOi8vZ2l0bGFiLmlmcmVtZXIuZnIvc2loLXB1YmxpYy9zdW1hcmlzL3N1bWFyaXMtYXBwLy0vcmVsZWFzZXMnKSxcbiAgICogb3B0aW9uYWxseSBhbmNob3JlZCBvbiBhIHNwZWNpZmljIHZlcnNpb24vdGFnLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIGFueSBVUkwgZnJvbSB3aGljaCB0aGUgcHJvamVjdCBwYWdlIGNhbiBiZSByZXNvbHZlZCAoc2VlIHtAbGluayBnZXRQcm9qZWN0UGFnZX0pXG4gICAqIEBwYXJhbSB2ZXJzaW9uIG9wdGlvbmFsIHRhZyBuYW1lIChlLmcuICcyLjE2LjInKSBhcHBlbmRlZCB0byB0aGUgcmVsZWFzZXMgcGFnZVxuICAgKiBAcmV0dXJuIGBudWxsYCBpZiB0aGUgcHJvamVjdCBwYWdlIGNhbm5vdCBiZSByZXNvbHZlZCBmcm9tIHRoZSBnaXZlbiBVUkwuXG4gICAqL1xuICBzdGF0aWMgZ2V0UHJvamVjdFJlbGVhc2VQYWdlKHVybDogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBHaXRsYWJVdGlscy5nZXRQcm9qZWN0UGFnZSh1cmwpO1xuICAgIGlmICghYmFzZVBhdGgpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIFVybFV0aWxzLmNvbmNhdChcbiAgICAgIFVybFV0aWxzLmNvbmNhdChiYXNlUGF0aCwgJy8tL3JlbGVhc2VzJyksXG4gICAgICB2ZXJzaW9uXG4gICAgKTtcbiAgfVxufVxuIl19
|