@idea-ionic/agenda 8.0.1 → 8.0.3

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.
@@ -1,10 +1,9 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
+ import { AlertController, ModalController } from '@ionic/angular';
2
3
  import { Browser } from '@capacitor/browser';
3
4
  import { Calendar, ExternalCalendarSources, Suggestion } from 'idea-toolbox';
4
- import { IDEAEnvironment, IDEASuggestionsComponent } from '@idea-ionic/common';
5
+ import { IDEAEnvironment, IDEALoadingService, IDEAAWSAPIService, IDEATranslationsService, IDEASuggestionsComponent } from '@idea-ionic/common';
5
6
  import * as i0 from "@angular/core";
6
- import * as i1 from "@ionic/angular";
7
- import * as i2 from "@idea-ionic/common";
8
7
  /**
9
8
  * Note: to test locally, you need to temporarily change the redirect URI:
10
9
  * - in the lambda `idea_calendars`, e.g. `SCARLETT_URL`;
@@ -12,14 +11,13 @@ import * as i2 from "@idea-ionic/common";
12
11
  * In both cases, the value should be set to `http://localhost:8100` (or according to the local URL).
13
12
  */
14
13
  export class IDEACalendarsService {
15
- constructor(modalCtrl, alertCtrl, message, loading, API, t) {
16
- this.modalCtrl = modalCtrl;
17
- this.alertCtrl = alertCtrl;
18
- this.message = message;
19
- this.loading = loading;
20
- this.API = API;
21
- this.t = t;
22
- this.env = inject(IDEAEnvironment);
14
+ constructor() {
15
+ this._env = inject(IDEAEnvironment);
16
+ this._modal = inject(ModalController);
17
+ this._alert = inject(AlertController);
18
+ this._loading = inject(IDEALoadingService);
19
+ this._API = inject(IDEAAWSAPIService);
20
+ this._translate = inject(IDEATranslationsService);
23
21
  }
24
22
  /**
25
23
  * Get the ion-icon of an external service from its name.
@@ -43,184 +41,140 @@ export class IDEACalendarsService {
43
41
  /**
44
42
  * Create a new calendar.
45
43
  */
46
- postCalendar(cal) {
47
- return new Promise((resolve, reject) => {
48
- this.API.postResource(this.getRequestURL(cal), { idea: true, body: cal })
49
- .then((res) => resolve(new Calendar(res)))
50
- .catch(err => reject(err));
51
- });
44
+ async postCalendar(cal) {
45
+ const calendar = await this._API.postResource(this.getRequestURL(cal), { idea: true, body: cal });
46
+ return new Calendar(calendar);
52
47
  }
53
48
  /**
54
49
  * Update an existing calendar.
55
50
  */
56
- putCalendar(cal) {
57
- return new Promise((resolve, reject) => {
58
- this.API.putResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId, body: cal })
59
- .then((res) => resolve(new Calendar(res)))
60
- .catch(err => reject(err));
61
- });
51
+ async putCalendar(cal) {
52
+ const body = { idea: true, resourceId: cal.calendarId, body: cal };
53
+ const calendar = await this._API.putResource(this.getRequestURL(cal), body);
54
+ return new Calendar(calendar);
62
55
  }
63
56
  /**
64
57
  * Delete a calendar.
65
58
  */
66
- deleteCalendar(cal) {
67
- return new Promise((resolve, reject) => {
68
- this.API.deleteResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId })
69
- .then(() => resolve())
70
- .catch(err => reject(err));
71
- });
59
+ async deleteCalendar(cal) {
60
+ await this._API.deleteResource(this.getRequestURL(cal), { idea: true, resourceId: cal.calendarId });
72
61
  }
73
62
  /**
74
63
  * Associate an external calendar with the given calendar.
75
64
  */
76
- setExternalCalendar(cal, externalId) {
77
- return new Promise((resolve, reject) => {
78
- this.API.patchResource(this.getRequestURL(cal), {
79
- idea: true,
80
- resourceId: cal.calendarId,
81
- body: { action: 'SET_EXTERNAL_CALENDAR', externalId }
82
- })
83
- .then(res => resolve(new Calendar(res)))
84
- .catch(err => reject(err));
85
- });
65
+ async setExternalCalendar(cal, externalId) {
66
+ const body = { idea: true, resourceId: cal.calendarId, body: { action: 'SET_EXTERNAL_CALENDAR', externalId } };
67
+ const calendar = await this._API.patchResource(this.getRequestURL(cal), body);
68
+ return new Calendar(calendar);
86
69
  }
87
70
  /**
88
71
  * Link the calendar with the chosen external service (auth flow).
89
72
  */
90
- linkExtService(cal) {
91
- return new Promise((resolve, reject) => {
92
- if (!cal.external)
93
- return reject(new Error('NOT_EXTERNAL'));
94
- const baseURL = window.location.protocol.concat('//', window.location.hostname);
95
- let url;
96
- switch (cal.external.service) {
97
- case ExternalCalendarSources.GOOGLE:
98
- url =
99
- 'https://accounts.google.com/o/oauth2/v2/auth?' +
100
- `client_id=${encodeURIComponent(this.env.google.apiClientId)}` +
101
- '&response_type=code' +
102
- `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/google-calendars-integration'))}` +
103
- '&include_granted_scopes=true' +
104
- '&access_type=offline&prompt=consent' +
105
- `&scope=${encodeURIComponent(this.env.google.apiScope)}` +
106
- `&state=${encodeURIComponent(cal.calendarId)}`;
107
- break;
108
- case ExternalCalendarSources.MICROSOFT:
109
- url =
110
- 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?' +
111
- `client_id=${encodeURIComponent(this.env.microsoft.apiClientId)}` +
112
- '&response_type=code' +
113
- `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/microsoft-calendars-integration'))}` +
114
- '&response_mode=query' +
115
- `&scope=${encodeURIComponent(this.env.microsoft.apiScope)}` +
116
- `&state=${encodeURIComponent(cal.calendarId)}`;
117
- break;
118
- }
119
- if (!url)
120
- return reject(new Error('INVALID_SERVICE'));
121
- // start the auth flow in the browser
122
- Browser.open({ url }).then(() => {
123
- // since we don't know when/if the auth flow will finish, we wait
124
- this.alertCtrl
125
- .create({
126
- header: this.t._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR'),
127
- message: this.t._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR_CONFIRM_ONCE_DONE'),
128
- backdropDismiss: false,
129
- buttons: [{ text: this.t._('COMMON.DONE'), handler: () => resolve() }]
130
- })
131
- .then(alert => alert.present());
132
- });
73
+ async linkExtService(cal) {
74
+ if (!cal.external)
75
+ throw new Error('NOT_EXTERNAL');
76
+ const baseURL = window.location.protocol.concat('//', window.location.hostname);
77
+ let url;
78
+ switch (cal.external.service) {
79
+ case ExternalCalendarSources.GOOGLE:
80
+ url =
81
+ 'https://accounts.google.com/o/oauth2/v2/auth?' +
82
+ `client_id=${encodeURIComponent(this._env.google.apiClientId)}` +
83
+ '&response_type=code' +
84
+ `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/google-calendars-integration'))}` +
85
+ '&include_granted_scopes=true' +
86
+ '&access_type=offline&prompt=consent' +
87
+ `&scope=${encodeURIComponent(this._env.google.apiScope)}` +
88
+ `&state=${encodeURIComponent(cal.calendarId)}`;
89
+ break;
90
+ case ExternalCalendarSources.MICROSOFT:
91
+ url =
92
+ 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize?' +
93
+ `client_id=${encodeURIComponent(this._env.microsoft.apiClientId)}` +
94
+ '&response_type=code' +
95
+ `&redirect_uri=${encodeURIComponent(baseURL.concat('/echo/microsoft-calendars-integration'))}` +
96
+ '&response_mode=query' +
97
+ `&scope=${encodeURIComponent(this._env.microsoft.apiScope)}` +
98
+ `&state=${encodeURIComponent(cal.calendarId)}`;
99
+ break;
100
+ }
101
+ if (!url)
102
+ throw new Error('INVALID_SERVICE');
103
+ await Browser.open({ url });
104
+ // since we don't know when/if the auth flow will finish, we wait
105
+ await this.showAlertLinkingCalendar();
106
+ }
107
+ async showAlertLinkingCalendar() {
108
+ return new Promise(async (resolve) => {
109
+ const header = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR');
110
+ const message = this._translate._('IDEA_AGENDA.CALENDARS.LINKING_CALENDAR_CONFIRM_ONCE_DONE');
111
+ const buttons = [{ text: this._translate._('COMMON.DONE'), handler: resolve }];
112
+ const alert = await this._alert.create({ header, message, buttons, backdropDismiss: false });
113
+ alert.present();
133
114
  });
134
115
  }
135
116
  /**
136
117
  * Get the external calendars list of the external service.
137
118
  */
138
- getExternalCalendars(cal) {
139
- return new Promise((resolve, reject) => {
140
- if (!cal.external)
141
- return reject(new Error('NOT_EXTERNAL'));
142
- // get the access token to make requests; in case it fails, proceed to link the external service
143
- this.API.patchResource(this.getRequestURL(cal), {
144
- idea: true,
145
- resourceId: cal.calendarId,
146
- body: { action: 'GET_ACCESS_TOKEN' }
147
- })
148
- .then((result) => {
149
- // prepare the headers (authorization) for the request to the external service
150
- const headers = { Authorization: 'Bearer '.concat(result.token) };
151
- // acquire and return the calendars
152
- switch (cal.external.service) {
153
- case ExternalCalendarSources.GOOGLE:
154
- this.API.rawRequest()
155
- .get('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers })
156
- .toPromise()
157
- .then((res) => resolve(res.items.map((c) => ({ name: c.summary, id: c.id }))))
158
- .catch(err => reject(err));
159
- break;
160
- case ExternalCalendarSources.MICROSOFT:
161
- this.API.rawRequest()
162
- .get('https://graph.microsoft.com/v1.0/me/calendars', { headers })
163
- .toPromise()
164
- .then((res) => resolve(res.value.map((c) => ({ name: c.name, id: c.id }))))
165
- .catch(err => reject(err));
166
- break;
167
- }
168
- })
169
- .catch(err => reject(err));
170
- });
119
+ async getExternalCalendars(cal) {
120
+ if (!cal.external)
121
+ throw new Error('NOT_EXTERNAL');
122
+ // get the access token to make requests; in case it fails, proceed to link the external service
123
+ const body = { idea: true, resourceId: cal.calendarId, body: { action: 'GET_ACCESS_TOKEN' } };
124
+ const result = await this._API.patchResource(this.getRequestURL(cal), body);
125
+ const headers = { Authorization: 'Bearer '.concat(result.token) };
126
+ if (cal.external.service === ExternalCalendarSources.GOOGLE) {
127
+ const res = await (await fetch('https://www.googleapis.com/calendar/v3/users/me/calendarList', { headers })).json();
128
+ return res.items.map((c) => ({ name: c.summary, id: c.id }));
129
+ }
130
+ else if (cal.external.service === ExternalCalendarSources.MICROSOFT) {
131
+ const res = await (await fetch('https://graph.microsoft.com/v1.0/me/calendars', { headers })).json();
132
+ return res.value.map((c) => ({ name: c.name, id: c.id }));
133
+ }
171
134
  }
172
135
  /**
173
136
  * If the external service is linked, choose an external calendar and set it for the chosen calendar.
174
137
  * @return the updated calendar.
175
138
  */
176
- chooseAndSetExternalCalendar(cal) {
177
- return new Promise((resolve, reject) => {
178
- this.openModalAndPickExternalCalendar(cal)
179
- .then(extCalId => {
180
- // the external calendar will be set later on
181
- if (!extCalId)
182
- return resolve(null);
183
- // an external calendar was chosen: set it right away
184
- this.setExternalCalendar(cal, extCalId)
185
- .then(res => resolve(res))
186
- .catch(err => reject(err));
187
- })
188
- .catch(err => reject(err));
189
- });
139
+ async chooseAndSetExternalCalendar(cal) {
140
+ const extCalId = await this.openModalAndPickExternalCalendar(cal);
141
+ if (!extCalId)
142
+ return;
143
+ return await this.setExternalCalendar(cal, extCalId);
190
144
  }
191
145
  /**
192
146
  * Open the modal to pick a calendar from the external service.
193
147
  * @return the id of the external calendar.
194
148
  */
195
149
  async openModalAndPickExternalCalendar(cal) {
196
- await this.loading.show();
197
- return new Promise((resolve, reject) => {
198
- this.getExternalCalendars(cal)
199
- .then((extCals) => {
200
- if (!extCals.length)
201
- return reject(new Error('NO_EXTERNAL_CALENDARS'));
202
- // let the user to choose the external calendar to associate
203
- this.modalCtrl
204
- .create({
205
- component: IDEASuggestionsComponent,
206
- componentProps: {
207
- data: extCals.map(c => new Suggestion({ value: c.id, name: c.name })),
208
- searchPlaceholder: this.t._('IDEA_AGENDA.CALENDARS.CHOOSE_AN_EXTERNAL_CALENDAR_TO_LINK'),
209
- sortData: true,
210
- hideIdFromUI: true,
211
- hideClearButton: true,
212
- mustChoose: true
213
- },
214
- backdropDismiss: false
215
- })
216
- .then(modal => {
217
- modal.onDidDismiss().then(res => resolve(res.data ? res.data.value : null));
218
- modal.present();
219
- });
220
- })
221
- .catch(err => reject(err))
222
- .finally(() => this.loading.hide());
150
+ let extCals;
151
+ try {
152
+ await this._loading.show();
153
+ extCals = await this.getExternalCalendars(cal);
154
+ if (!extCals.length)
155
+ throw new Error('NO_EXTERNAL_CALENDARS');
156
+ }
157
+ catch (error) {
158
+ throw error;
159
+ }
160
+ finally {
161
+ this._loading.hide();
162
+ }
163
+ const modal = await this._modal.create({
164
+ component: IDEASuggestionsComponent,
165
+ componentProps: {
166
+ data: extCals.map(c => new Suggestion({ value: c.id, name: c.name })),
167
+ searchPlaceholder: this._translate._('IDEA_AGENDA.CALENDARS.CHOOSE_AN_EXTERNAL_CALENDAR_TO_LINK'),
168
+ sortData: true,
169
+ hideIdFromUI: true,
170
+ hideClearButton: true,
171
+ mustChoose: true
172
+ },
173
+ backdropDismiss: false
223
174
  });
175
+ modal.present();
176
+ const res = await modal.onDidDismiss();
177
+ return res.data ? res.data.value : null;
224
178
  }
225
179
  /**
226
180
  * First sync of the extenal calendar.
@@ -233,7 +187,8 @@ export class IDEACalendarsService {
233
187
  */
234
188
  syncCalendarHelper(cal, done) {
235
189
  // this is a recursive operation: the API returns if the sync has to continue or it finished
236
- this.API.patchResource(this.getRequestURL(cal), {
190
+ this._API
191
+ .patchResource(this.getRequestURL(cal), {
237
192
  idea: true,
238
193
  resourceId: cal.calendarId,
239
194
  body: { action: 'SYNC_EXTERNAL_CALENDAR', firstSync: true }
@@ -246,10 +201,10 @@ export class IDEACalendarsService {
246
201
  })
247
202
  .catch(err => done(err));
248
203
  }
249
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarsService, deps: [{ token: i1.ModalController }, { token: i1.AlertController }, { token: i2.IDEAMessageService }, { token: i2.IDEALoadingService }, { token: i2.IDEAAWSAPIService }, { token: i2.IDEATranslationsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
250
205
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarsService }); }
251
206
  }
252
207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: IDEACalendarsService, decorators: [{
253
208
  type: Injectable
254
- }], ctorParameters: () => [{ type: i1.ModalController }, { type: i1.AlertController }, { type: i2.IDEAMessageService }, { type: i2.IDEALoadingService }, { type: i2.IDEAAWSAPIService }, { type: i2.IDEATranslationsService }] });
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFDTCxlQUFlLEVBS2Ysd0JBQXdCLEVBQ3pCLE1BQU0sb0JBQW9CLENBQUM7Ozs7QUFFNUI7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRy9CLFlBQ1MsU0FBMEIsRUFDMUIsU0FBMEIsRUFDMUIsT0FBMkIsRUFDM0IsT0FBMkIsRUFDM0IsR0FBc0IsRUFDdEIsQ0FBMEI7UUFMMUIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsTUFBQyxHQUFELENBQUMsQ0FBeUI7UUFSekIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQVNyQyxDQUFDO0lBRUo7O09BRUc7SUFDSSxjQUFjLENBQUMsT0FBZ0M7UUFDcEQsUUFBUSxPQUFPLEVBQUUsQ0FBQztZQUNoQixLQUFLLHVCQUF1QixDQUFDLE1BQU07Z0JBQ2pDLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLEtBQUssdUJBQXVCLENBQUMsU0FBUztnQkFDcEMsT0FBTyxjQUFjLENBQUM7WUFDeEI7Z0JBQ0UsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFD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O2FBQ0MsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDakIsSUFBSSxHQUFHLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFDaEQsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDOzhHQTFPVSxvQkFBb0I7a0hBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBCcm93c2VyIH0gZnJvbSAnQGNhcGFjaXRvci9icm93c2VyJztcbmltcG9ydCB7IENhbGVuZGFyLCBFeHRlcm5hbENhbGVuZGFyU291cmNlcywgU3VnZ2VzdGlvbiB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQge1xuICBJREVBRW52aXJvbm1lbnQsXG4gIElERUFMb2FkaW5nU2VydmljZSxcbiAgSURFQUFXU0FQSVNlcnZpY2UsXG4gIElERUFNZXNzYWdlU2VydmljZSxcbiAgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gIElERUFTdWdnZXN0aW9uc0NvbXBvbmVudFxufSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG4vKipcbiAqIE5vdGU6IHRvIHRlc3QgbG9jYWxseSwgeW91IG5lZWQgdG8gdGVtcG9yYXJpbHkgY2hhbmdlIHRoZSByZWRpcmVjdCBVUkk6XG4gKiAgLSBpbiB0aGUgbGFtYmRhIGBpZGVhX2NhbGVuZGFyc2AsIGUuZy4gYFNDQVJMRVRUX1VSTGA7XG4gKiAgLSBpbiB0aGUgY2xpZW50IGNvbmZpZyBmaWxlOiBgQVBQX1VSTGAuXG4gKiBJbiBib3RoIGNhc2VzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBgaHR0cDovL2xvY2FsaG9zdDo4MTAwYCAob3IgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBVUkwpLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSURFQUNhbGVuZGFyc1NlcnZpY2Uge1xuICBwcm90ZWN0ZWQgZW52ID0gaW5qZWN0KElERUFFbnZpcm9ubWVudCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHB1YmxpYyBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwdWJsaWMgbWVzc2FnZTogSURFQU1lc3NhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyBsb2FkaW5nOiBJREVBTG9hZGluZ1NlcnZpY2UsXG4gICAgcHVibGljIEFQSTogSURFQUFXU0FQSVNlcnZpY2UsXG4gICAgcHVibGljIHQ6IElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogR2V0IHRoZSBpb24taWNvbiBvZiBhbiBleHRlcm5hbCBzZXJ2aWNlIGZyb20gaXRzIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2VydmljZUljb24oc2VydmljZTogRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoc2VydmljZSkge1xuICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5HT09HTEU6XG4gICAgICAgIHJldHVybiAnbG9nby1nb29nbGUnO1xuICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5NSUNST1NPRlQ6XG4gICAgICAgIHJldHVybiAnbG9nby13aW5kb3dzJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnaGVscCc7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGJhc2UgVVJMIGZvciBBUEkgcmVxdWVzdCAoc2hhcmVkL3ByaXZhdGUgY2FsZW5kYXIpLlxuICAgKi9cbiAgcHVibGljIGdldFJlcXVlc3RVUkwoY2FsZW5kYXI6IENhbGVuZGFyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGNhbGVuZGFyLnRlYW1JZCA/IGB0ZWFtcy8ke2NhbGVuZGFyLnRlYW1JZH0vYCA6ICcnKS5jb25jYXQoJ2NhbGVuZGFycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBjYWxlbmRhci5cbiAgICovXG4gIHB1YmxpYyBwb3N0Q2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5BUEkucG9zdFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCB7IGlkZWE6IHRydWUsIGJvZHk6IGNhbCB9KVxuICAgICAgICAudGhlbigocmVzOiBDYWxlbmRhcikgPT4gcmVzb2x2ZShuZXcgQ2FsZW5kYXIocmVzKSkpXG4gICAgICAgIC5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBVcGRhdGUgYW4gZXhpc3RpbmcgY2FsZW5kYXIuXG4gICAqL1xuICBwdWJsaWMgcHV0Q2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5BUEkucHV0UmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIHsgaWRlYTogdHJ1ZSwgcmVzb3VyY2VJZDogY2FsLmNhbGVuZGFySWQsIGJvZHk6IGNhbCB9KVxuICAgICAgICAudGhlbigocmVzOiBDYWxlbmRhcikgPT4gcmVzb2x2ZShuZXcgQ2FsZW5kYXIocmVzKSkpXG4gICAgICAgIC5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWxlbmRhci5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuQVBJLmRlbGV0ZVJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCB7IGlkZWE6IHRydWUsIHJlc291cmNlSWQ6IGNhbC5jYWxlbmRhcklkIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUoKSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEFzc29jaWF0ZSBhbiBleHRlcm5hbCBjYWxlbmRhciB3aXRoIHRoZSBnaXZlbiBjYWxlbmRhci5cbiAgICovXG4gIHB1YmxpYyBzZXRFeHRlcm5hbENhbGVuZGFyKGNhbDogQ2FsZW5kYXIsIGV4dGVybmFsSWQ6IHN0cmluZyk6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5BUEkucGF0Y2hSZXNvdXJjZSh0aGlzLmdldFJlcXVlc3RVUkwoY2FsKSwge1xuICAgICAgICBpZGVhOiB0cnVlLFxuICAgICAgICByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCxcbiAgICAgICAgYm9keTogeyBhY3Rpb246ICdTRVRfRVhURVJOQUxfQ0FMRU5EQVInLCBleHRlcm5hbElkIH1cbiAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlcyA9PiByZXNvbHZlKG5ldyBDYWxlbmRhcihyZXMpKSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGluayB0aGUgY2FsZW5kYXIgd2l0aCB0aGUgY2hvc2VuIGV4dGVybmFsIHNlcnZpY2UgKGF1dGggZmxvdykuXG4gICAqL1xuICBwdWJsaWMgbGlua0V4dFNlcnZpY2UoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWNhbC5leHRlcm5hbCkgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ05PVF9FWFRFUk5BTCcpKTtcbiAgICAgIGNvbnN0IGJhc2VVUkwgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wuY29uY2F0KCcvLycsIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7XG4gICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICBzd2l0Y2ggKGNhbC5leHRlcm5hbC5zZXJ2aWNlKSB7XG4gICAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuR09PR0xFOlxuICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3YyL2F1dGg/JyArXG4gICAgICAgICAgICBgY2xpZW50X2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZW52Lmdvb2dsZS5hcGlDbGllbnRJZCl9YCArXG4gICAgICAgICAgICAnJnJlc3BvbnNlX3R5cGU9Y29kZScgK1xuICAgICAgICAgICAgYCZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQoYmFzZVVSTC5jb25jYXQoJy9lY2hvL2dvb2dsZS1jYWxlbmRhcnMtaW50ZWdyYXRpb24nKSl9YCArXG4gICAgICAgICAgICAnJmluY2x1ZGVfZ3JhbnRlZF9zY29wZXM9dHJ1ZScgK1xuICAgICAgICAgICAgJyZhY2Nlc3NfdHlwZT1vZmZsaW5lJnByb21wdD1jb25zZW50JyArXG4gICAgICAgICAgICBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZW52Lmdvb2dsZS5hcGlTY29wZSl9YCArXG4gICAgICAgICAgICBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhbC5jYWxlbmRhcklkKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzLk1JQ1JPU09GVDpcbiAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgJ2h0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS9jb21tb24vb2F1dGgyL3YyLjAvYXV0aG9yaXplPycgK1xuICAgICAgICAgICAgYGNsaWVudF9pZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmVudi5taWNyb3NvZnQuYXBpQ2xpZW50SWQpfWAgK1xuICAgICAgICAgICAgJyZyZXNwb25zZV90eXBlPWNvZGUnICtcbiAgICAgICAgICAgIGAmcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2VVUkwuY29uY2F0KCcvZWNoby9taWNyb3NvZnQtY2FsZW5kYXJzLWludGVncmF0aW9uJykpfWAgK1xuICAgICAgICAgICAgJyZyZXNwb25zZV9tb2RlPXF1ZXJ5JyArXG4gICAgICAgICAgICBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZW52Lm1pY3Jvc29mdC5hcGlTY29wZSl9YCArXG4gICAgICAgICAgICBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhbC5jYWxlbmRhcklkKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKCF1cmwpIHJldHVybiByZWplY3QobmV3IEVycm9yKCdJTlZBTElEX1NFUlZJQ0UnKSk7XG4gICAgICAvLyBzdGFydCB0aGUgYXV0aCBmbG93IGluIHRoZSBicm93c2VyXG4gICAgICBCcm93c2VyLm9wZW4oeyB1cmwgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgd2hlbi9pZiB0aGUgYXV0aCBmbG93IHdpbGwgZmluaXNoLCB3ZSB3YWl0XG4gICAgICAgIHRoaXMuYWxlcnRDdHJsXG4gICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICBoZWFkZXI6IHRoaXMudC5fKCdJREVBX0FHRU5EQS5DQUxFTkRBUlMuTElOS0lOR19DQUxFTkRBUicpLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy50Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5MSU5LSU5HX0NBTEVOREFSX0NPTkZJUk1fT05DRV9ET05FJyksXG4gICAgICAgICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgICAgICAgICAgYnV0dG9uczogW3sgdGV4dDogdGhpcy50Ll8oJ0NPTU1PTi5ET05FJyksIGhhbmRsZXI6ICgpID0+IHJlc29sdmUoKSB9XVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oYWxlcnQgPT4gYWxlcnQucHJlc2VudCgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZXh0ZXJuYWwgY2FsZW5kYXJzIGxpc3Qgb2YgdGhlIGV4dGVybmFsIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0RXh0ZXJuYWxDYWxlbmRhcnMoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8RXh0Q2FsZW5kYXJbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWNhbC5leHRlcm5hbCkgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ05PVF9FWFRFUk5BTCcpKTtcbiAgICAgIC8vIGdldCB0aGUgYWNjZXNzIHRva2VuIHRvIG1ha2UgcmVxdWVzdHM7IGluIGNhc2UgaXQgZmFpbHMsIHByb2NlZWQgdG8gbGluayB0aGUgZXh0ZXJuYWwgc2VydmljZVxuICAgICAgdGhpcy5BUEkucGF0Y2hSZXNvdXJjZSh0aGlzLmdldFJlcXVlc3RVUkwoY2FsKSwge1xuICAgICAgICBpZGVhOiB0cnVlLFxuICAgICAgICByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCxcbiAgICAgICAgYm9keTogeyBhY3Rpb246ICdHRVRfQUNDRVNTX1RPS0VOJyB9XG4gICAgICB9KVxuICAgICAgICAudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBwcmVwYXJlIHRoZSBoZWFkZXJzIChhdXRob3JpemF0aW9uKSBmb3IgdGhlIHJlcXVlc3QgdG8gdGhlIGV4dGVybmFsIHNlcnZpY2VcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0geyBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcuY29uY2F0KHJlc3VsdC50b2tlbikgfTtcbiAgICAgICAgICAvLyBhY3F1aXJlIGFuZCByZXR1cm4gdGhlIGNhbGVuZGFyc1xuICAgICAgICAgIHN3aXRjaCAoY2FsLmV4dGVybmFsLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuR09PR0xFOlxuICAgICAgICAgICAgICB0aGlzLkFQSS5yYXdSZXF1ZXN0KClcbiAgICAgICAgICAgICAgICAuZ2V0KCdodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9jYWxlbmRhci92My91c2Vycy9tZS9jYWxlbmRhckxpc3QnLCB7IGhlYWRlcnMgfSlcbiAgICAgICAgICAgICAgICAudG9Qcm9taXNlKClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHJlc29sdmUocmVzLml0ZW1zLm1hcCgoYzogYW55KSA9PiAoeyBuYW1lOiBjLnN1bW1hcnksIGlkOiBjLmlkIH0pIGFzIEV4dENhbGVuZGFyKSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5NSUNST1NPRlQ6XG4gICAgICAgICAgICAgIHRoaXMuQVBJLnJhd1JlcXVlc3QoKVxuICAgICAgICAgICAgICAgIC5nZXQoJ2h0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wL21lL2NhbGVuZGFycycsIHsgaGVhZGVycyB9KVxuICAgICAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXM6IGFueSkgPT4gcmVzb2x2ZShyZXMudmFsdWUubWFwKChjOiBhbnkpID0+ICh7IG5hbWU6IGMubmFtZSwgaWQ6IGMuaWQgfSkgYXMgRXh0Q2FsZW5kYXIpKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZXh0ZXJuYWwgc2VydmljZSBpcyBsaW5rZWQsIGNob29zZSBhbiBleHRlcm5hbCBjYWxlbmRhciBhbmQgc2V0IGl0IGZvciB0aGUgY2hvc2VuIGNhbGVuZGFyLlxuICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGNhbGVuZGFyLlxuICAgKi9cbiAgcHVibGljIGNob29zZUFuZFNldEV4dGVybmFsQ2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5vcGVuTW9kYWxBbmRQaWNrRXh0ZXJuYWxDYWxlbmRhcihjYWwpXG4gICAgICAgIC50aGVuKGV4dENhbElkID0+IHtcbiAgICAgICAgICAvLyB0aGUgZXh0ZXJuYWwgY2FsZW5kYXIgd2lsbCBiZSBzZXQgbGF0ZXIgb25cbiAgICAgICAgICBpZiAoIWV4dENhbElkKSByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAvLyBhbiBleHRlcm5hbCBjYWxlbmRhciB3YXMgY2hvc2VuOiBzZXQgaXQgcmlnaHQgYXdheVxuICAgICAgICAgIHRoaXMuc2V0RXh0ZXJuYWxDYWxlbmRhcihjYWwsIGV4dENhbElkKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHJlc29sdmUocmVzKSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogT3BlbiB0aGUgbW9kYWwgdG8gcGljayBhIGNhbGVuZGFyIGZyb20gdGhlIGV4dGVybmFsIHNlcnZpY2UuXG4gICAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBleHRlcm5hbCBjYWxlbmRhci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3Blbk1vZGFsQW5kUGlja0V4dGVybmFsQ2FsZW5kYXIoY2FsOiBDYWxlbmRhcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkaW5nLnNob3coKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZXRFeHRlcm5hbENhbGVuZGFycyhjYWwpXG4gICAgICAgIC50aGVuKChleHRDYWxzOiBFeHRDYWxlbmRhcltdKSA9PiB7XG4gICAgICAgICAgaWYgKCFleHRDYWxzLmxlbmd0aCkgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ05PX0VYVEVSTkFMX0NBTEVOREFSUycpKTtcbiAgICAgICAgICAvLyBsZXQgdGhlIHVzZXIgdG8gY2hvb3NlIHRoZSBleHRlcm5hbCBjYWxlbmRhciB0byBhc3NvY2lhdGVcbiAgICAgICAgICB0aGlzLm1vZGFsQ3RybFxuICAgICAgICAgICAgLmNyZWF0ZSh7XG4gICAgICAgICAgICAgIGNvbXBvbmVudDogSURFQVN1Z2dlc3Rpb25zQ29tcG9uZW50LFxuICAgICAgICAgICAgICBjb21wb25lbnRQcm9wczoge1xuICAgICAgICAgICAgICAgIGRhdGE6IGV4dENhbHMubWFwKGMgPT4gbmV3IFN1Z2dlc3Rpb24oeyB2YWx1ZTogYy5pZCwgbmFtZTogYy5uYW1lIH0pKSxcbiAgICAgICAgICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogdGhpcy50Ll8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DSE9PU0VfQU5fRVhURVJOQUxfQ0FMRU5EQVJfVE9fTElOSycpLFxuICAgICAgICAgICAgICAgIHNvcnREYXRhOiB0cnVlLFxuICAgICAgICAgICAgICAgIGhpZGVJZEZyb21VSTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBoaWRlQ2xlYXJCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgbXVzdENob29zZTogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4obW9kYWwgPT4ge1xuICAgICAgICAgICAgICBtb2RhbC5vbkRpZERpc21pc3MoKS50aGVuKHJlcyA9PiByZXNvbHZlKHJlcy5kYXRhID8gcmVzLmRhdGEudmFsdWUgOiBudWxsKSk7XG4gICAgICAgICAgICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKVxuICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmxvYWRpbmcuaGlkZSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBzeW5jIG9mIHRoZSBleHRlbmFsIGNhbGVuZGFyLlxuICAgKi9cbiAgcHVibGljIHN5bmNDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMuc3luY0NhbGVuZGFySGVscGVyKGNhbCwgZXJyID0+IChlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoKSkpKTtcbiAgfVxuICAvKipcbiAgICogSGVscGVyIHRvIHJlY3Vyc2l2ZWx5IHN5bmMgYW4gdGhlIGV4dGVuYWwgY2FsZW5kYXIuXG4gICAqL1xuICBwcml2YXRlIHN5bmNDYWxlbmRhckhlbHBlcihjYWw6IENhbGVuZGFyLCBkb25lOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICAvLyB0aGlzIGlzIGEgcmVjdXJzaXZlIG9wZXJhdGlvbjogdGhlIEFQSSByZXR1cm5zIGlmIHRoZSBzeW5jIGhhcyB0byBjb250aW51ZSBvciBpdCBmaW5pc2hlZFxuICAgIHRoaXMuQVBJLnBhdGNoUmVzb3VyY2UodGhpcy5nZXRSZXF1ZXN0VVJMKGNhbCksIHtcbiAgICAgIGlkZWE6IHRydWUsXG4gICAgICByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCxcbiAgICAgIGJvZHk6IHsgYWN0aW9uOiAnU1lOQ19FWFRFUk5BTF9DQUxFTkRBUicsIGZpcnN0U3luYzogdHJ1ZSB9XG4gICAgfSlcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzLm1vcmVEYXRhKSB0aGlzLnN5bmNDYWxlbmRhckhlbHBlcihjYWwsIGRvbmUpO1xuICAgICAgICBlbHNlIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IGRvbmUoZXJyKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgc3RydWN0dXJlIHRvIGRlZmluZSBleHRlcm5hbCBzZXJ2aWNlcycgY2FsZW5kYXJzIChiYXNpYyBpbmZvKS5cbiAqL1xuaW50ZXJmYWNlIEV4dENhbGVuZGFyIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufVxuIl19
209
+ }] });
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2FnZW5kYS9zcmMvY2FsZW5kYXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUNMLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2Qix3QkFBd0IsRUFDekIsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFNUI7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRGpDO1FBRVksU0FBSSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLFNBQUksR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqQyxlQUFVLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7S0FxTHREO0lBbkxDOztPQUVHO0lBQ0gsY0FBYyxDQUFDLE9BQWdDO1FBQzdDLFFBQVEsT0FBTyxFQUFFLENBQUM7WUFDaEIsS0FBSyx1QkFBdUIsQ0FBQyxNQUFNO2dCQUNqQyxPQUFPLGFBQWEsQ0FBQztZQUN2QixLQUFLLHVCQUF1QixDQUFDLFNBQVM7Z0JBQ3BDLE9B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QUMsT0FBTyxFQUFFLE1BQU0sRUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RILENBQUM7SUFDRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLEdBQWEsRUFBRSxJQUEyQjtRQUNuRSw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLElBQUk7YUFDTixhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxJQUFJLEVBQUUsSUFBSTtZQUNWLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtTQUM1RCxDQUFDO2FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFRLEVBQUU7WUFDdkIsSUFBSSxHQUFHLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOztnQkFDaEQsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDOzhHQTFMVSxvQkFBb0I7a0hBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBCcm93c2VyIH0gZnJvbSAnQGNhcGFjaXRvci9icm93c2VyJztcbmltcG9ydCB7IENhbGVuZGFyLCBFeHRlcm5hbENhbGVuZGFyU291cmNlcywgU3VnZ2VzdGlvbiB9IGZyb20gJ2lkZWEtdG9vbGJveCc7XG5pbXBvcnQge1xuICBJREVBRW52aXJvbm1lbnQsXG4gIElERUFMb2FkaW5nU2VydmljZSxcbiAgSURFQUFXU0FQSVNlcnZpY2UsXG4gIElERUFUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICBJREVBU3VnZ2VzdGlvbnNDb21wb25lbnRcbn0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuLyoqXG4gKiBOb3RlOiB0byB0ZXN0IGxvY2FsbHksIHlvdSBuZWVkIHRvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgcmVkaXJlY3QgVVJJOlxuICogIC0gaW4gdGhlIGxhbWJkYSBgaWRlYV9jYWxlbmRhcnNgLCBlLmcuIGBTQ0FSTEVUVF9VUkxgO1xuICogIC0gaW4gdGhlIGNsaWVudCBjb25maWcgZmlsZTogYEFQUF9VUkxgLlxuICogSW4gYm90aCBjYXNlcywgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gYGh0dHA6Ly9sb2NhbGhvc3Q6ODEwMGAgKG9yIGFjY29yZGluZyB0byB0aGUgbG9jYWwgVVJMKS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIElERUFDYWxlbmRhcnNTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIF9lbnYgPSBpbmplY3QoSURFQUVudmlyb25tZW50KTtcbiAgcHJpdmF0ZSBfbW9kYWwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfYWxlcnQgPSBpbmplY3QoQWxlcnRDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbG9hZGluZyA9IGluamVjdChJREVBTG9hZGluZ1NlcnZpY2UpO1xuICBwcml2YXRlIF9BUEkgPSBpbmplY3QoSURFQUFXU0FQSVNlcnZpY2UpO1xuICBwcml2YXRlIF90cmFuc2xhdGUgPSBpbmplY3QoSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGlvbi1pY29uIG9mIGFuIGV4dGVybmFsIHNlcnZpY2UgZnJvbSBpdHMgbmFtZS5cbiAgICovXG4gIGdldFNlcnZpY2VJY29uKHNlcnZpY2U6IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHNlcnZpY2UpIHtcbiAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuR09PR0xFOlxuICAgICAgICByZXR1cm4gJ2xvZ28tZ29vZ2xlJztcbiAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuTUlDUk9TT0ZUOlxuICAgICAgICByZXR1cm4gJ2xvZ28td2luZG93cyc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2hlbHAnO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlIFVSTCBmb3IgQVBJIHJlcXVlc3QgKHNoYXJlZC9wcml2YXRlIGNhbGVuZGFyKS5cbiAgICovXG4gIGdldFJlcXVlc3RVUkwoY2FsZW5kYXI6IENhbGVuZGFyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGNhbGVuZGFyLnRlYW1JZCA/IGB0ZWFtcy8ke2NhbGVuZGFyLnRlYW1JZH0vYCA6ICcnKS5jb25jYXQoJ2NhbGVuZGFycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIHBvc3RDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTxDYWxlbmRhcj4ge1xuICAgIGNvbnN0IGNhbGVuZGFyID0gYXdhaXQgdGhpcy5fQVBJLnBvc3RSZXNvdXJjZSh0aGlzLmdldFJlcXVlc3RVUkwoY2FsKSwgeyBpZGVhOiB0cnVlLCBib2R5OiBjYWwgfSk7XG4gICAgcmV0dXJuIG5ldyBDYWxlbmRhcihjYWxlbmRhcik7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBjYWxlbmRhci5cbiAgICovXG4gIGFzeW5jIHB1dENhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPENhbGVuZGFyPiB7XG4gICAgY29uc3QgYm9keSA9IHsgaWRlYTogdHJ1ZSwgcmVzb3VyY2VJZDogY2FsLmNhbGVuZGFySWQsIGJvZHk6IGNhbCB9O1xuICAgIGNvbnN0IGNhbGVuZGFyID0gYXdhaXQgdGhpcy5fQVBJLnB1dFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCBib2R5KTtcbiAgICByZXR1cm4gbmV3IENhbGVuZGFyKGNhbGVuZGFyKTtcbiAgfVxuICAvKipcbiAgICogRGVsZXRlIGEgY2FsZW5kYXIuXG4gICAqL1xuICBhc3luYyBkZWxldGVDYWxlbmRhcihjYWw6IENhbGVuZGFyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5fQVBJLmRlbGV0ZVJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCB7IGlkZWE6IHRydWUsIHJlc291cmNlSWQ6IGNhbC5jYWxlbmRhcklkIH0pO1xuICB9XG4gIC8qKlxuICAgKiBBc3NvY2lhdGUgYW4gZXh0ZXJuYWwgY2FsZW5kYXIgd2l0aCB0aGUgZ2l2ZW4gY2FsZW5kYXIuXG4gICAqL1xuICBhc3luYyBzZXRFeHRlcm5hbENhbGVuZGFyKGNhbDogQ2FsZW5kYXIsIGV4dGVybmFsSWQ6IHN0cmluZyk6IFByb21pc2U8Q2FsZW5kYXI+IHtcbiAgICBjb25zdCBib2R5ID0geyBpZGVhOiB0cnVlLCByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCwgYm9keTogeyBhY3Rpb246ICdTRVRfRVhURVJOQUxfQ0FMRU5EQVInLCBleHRlcm5hbElkIH0gfTtcbiAgICBjb25zdCBjYWxlbmRhciA9IGF3YWl0IHRoaXMuX0FQSS5wYXRjaFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCBib2R5KTtcbiAgICByZXR1cm4gbmV3IENhbGVuZGFyKGNhbGVuZGFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHRoZSBjYWxlbmRhciB3aXRoIHRoZSBjaG9zZW4gZXh0ZXJuYWwgc2VydmljZSAoYXV0aCBmbG93KS5cbiAgICovXG4gIGFzeW5jIGxpbmtFeHRTZXJ2aWNlKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNhbC5leHRlcm5hbCkgdGhyb3cgbmV3IEVycm9yKCdOT1RfRVhURVJOQUwnKTtcbiAgICBjb25zdCBiYXNlVVJMID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLmNvbmNhdCgnLy8nLCB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xuICAgIGxldCB1cmw6IHN0cmluZztcbiAgICBzd2l0Y2ggKGNhbC5leHRlcm5hbC5zZXJ2aWNlKSB7XG4gICAgICBjYXNlIEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzLkdPT0dMRTpcbiAgICAgICAgdXJsID1cbiAgICAgICAgICAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3YyL2F1dGg/JyArXG4gICAgICAgICAgYGNsaWVudF9pZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLl9lbnYuZ29vZ2xlLmFwaUNsaWVudElkKX1gICtcbiAgICAgICAgICAnJnJlc3BvbnNlX3R5cGU9Y29kZScgK1xuICAgICAgICAgIGAmcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGJhc2VVUkwuY29uY2F0KCcvZWNoby9nb29nbGUtY2FsZW5kYXJzLWludGVncmF0aW9uJykpfWAgK1xuICAgICAgICAgICcmaW5jbHVkZV9ncmFudGVkX3Njb3Blcz10cnVlJyArXG4gICAgICAgICAgJyZhY2Nlc3NfdHlwZT1vZmZsaW5lJnByb21wdD1jb25zZW50JyArXG4gICAgICAgICAgYCZzY29wZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLl9lbnYuZ29vZ2xlLmFwaVNjb3BlKX1gICtcbiAgICAgICAgICBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhbC5jYWxlbmRhcklkKX1gO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRXh0ZXJuYWxDYWxlbmRhclNvdXJjZXMuTUlDUk9TT0ZUOlxuICAgICAgICB1cmwgPVxuICAgICAgICAgICdodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY29tbW9uL29hdXRoMi92Mi4wL2F1dGhvcml6ZT8nICtcbiAgICAgICAgICBgY2xpZW50X2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuX2Vudi5taWNyb3NvZnQuYXBpQ2xpZW50SWQpfWAgK1xuICAgICAgICAgICcmcmVzcG9uc2VfdHlwZT1jb2RlJyArXG4gICAgICAgICAgYCZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQoYmFzZVVSTC5jb25jYXQoJy9lY2hvL21pY3Jvc29mdC1jYWxlbmRhcnMtaW50ZWdyYXRpb24nKSl9YCArXG4gICAgICAgICAgJyZyZXNwb25zZV9tb2RlPXF1ZXJ5JyArXG4gICAgICAgICAgYCZzY29wZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLl9lbnYubWljcm9zb2Z0LmFwaVNjb3BlKX1gICtcbiAgICAgICAgICBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhbC5jYWxlbmRhcklkKX1gO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcignSU5WQUxJRF9TRVJWSUNFJyk7XG4gICAgYXdhaXQgQnJvd3Nlci5vcGVuKHsgdXJsIH0pO1xuICAgIC8vIHNpbmNlIHdlIGRvbid0IGtub3cgd2hlbi9pZiB0aGUgYXV0aCBmbG93IHdpbGwgZmluaXNoLCB3ZSB3YWl0XG4gICAgYXdhaXQgdGhpcy5zaG93QWxlcnRMaW5raW5nQ2FsZW5kYXIoKTtcbiAgfVxuICBwcml2YXRlIGFzeW5jIHNob3dBbGVydExpbmtpbmdDYWxlbmRhcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgcmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkxJTktJTkdfQ0FMRU5EQVInKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGUuXygnSURFQV9BR0VOREEuQ0FMRU5EQVJTLkxJTktJTkdfQ0FMRU5EQVJfQ09ORklSTV9PTkNFX0RPTkUnKTtcbiAgICAgIGNvbnN0IGJ1dHRvbnMgPSBbeyB0ZXh0OiB0aGlzLl90cmFuc2xhdGUuXygnQ09NTU9OLkRPTkUnKSwgaGFuZGxlcjogcmVzb2x2ZSB9XTtcbiAgICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5fYWxlcnQuY3JlYXRlKHsgaGVhZGVyLCBtZXNzYWdlLCBidXR0b25zLCBiYWNrZHJvcERpc21pc3M6IGZhbHNlIH0pO1xuICAgICAgYWxlcnQucHJlc2VudCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZXh0ZXJuYWwgY2FsZW5kYXJzIGxpc3Qgb2YgdGhlIGV4dGVybmFsIHNlcnZpY2UuXG4gICAqL1xuICBhc3luYyBnZXRFeHRlcm5hbENhbGVuZGFycyhjYWw6IENhbGVuZGFyKTogUHJvbWlzZTxFeHRDYWxlbmRhcltdPiB7XG4gICAgaWYgKCFjYWwuZXh0ZXJuYWwpIHRocm93IG5ldyBFcnJvcignTk9UX0VYVEVSTkFMJyk7XG4gICAgLy8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gdG8gbWFrZSByZXF1ZXN0czsgaW4gY2FzZSBpdCBmYWlscywgcHJvY2VlZCB0byBsaW5rIHRoZSBleHRlcm5hbCBzZXJ2aWNlXG4gICAgY29uc3QgYm9keSA9IHsgaWRlYTogdHJ1ZSwgcmVzb3VyY2VJZDogY2FsLmNhbGVuZGFySWQsIGJvZHk6IHsgYWN0aW9uOiAnR0VUX0FDQ0VTU19UT0tFTicgfSB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX0FQSS5wYXRjaFJlc291cmNlKHRoaXMuZ2V0UmVxdWVzdFVSTChjYWwpLCBib2R5KTtcbiAgICBjb25zdCBoZWFkZXJzID0geyBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcuY29uY2F0KHJlc3VsdC50b2tlbikgfTtcbiAgICBpZiAoY2FsLmV4dGVybmFsLnNlcnZpY2UgPT09IEV4dGVybmFsQ2FsZW5kYXJTb3VyY2VzLkdPT0dMRSkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBmZXRjaCgnaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vY2FsZW5kYXIvdjMvdXNlcnMvbWUvY2FsZW5kYXJMaXN0JywgeyBoZWFkZXJzIH0pXG4gICAgICApLmpzb24oKTtcbiAgICAgIHJldHVybiByZXMuaXRlbXMubWFwKChjOiBhbnkpOiBFeHRDYWxlbmRhciA9PiAoeyBuYW1lOiBjLnN1bW1hcnksIGlkOiBjLmlkIH0gYXMgRXh0Q2FsZW5kYXIpKTtcbiAgICB9IGVsc2UgaWYgKGNhbC5leHRlcm5hbC5zZXJ2aWNlID09PSBFeHRlcm5hbENhbGVuZGFyU291cmNlcy5NSUNST1NPRlQpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IChhd2FpdCBmZXRjaCgnaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tL3YxLjAvbWUvY2FsZW5kYXJzJywgeyBoZWFkZXJzIH0pKS5qc29uKCk7XG4gICAgICByZXR1cm4gcmVzLnZhbHVlLm1hcCgoYzogYW55KTogRXh0Q2FsZW5kYXIgPT4gKHsgbmFtZTogYy5uYW1lLCBpZDogYy5pZCB9IGFzIEV4dENhbGVuZGFyKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBleHRlcm5hbCBzZXJ2aWNlIGlzIGxpbmtlZCwgY2hvb3NlIGFuIGV4dGVybmFsIGNhbGVuZGFyIGFuZCBzZXQgaXQgZm9yIHRoZSBjaG9zZW4gY2FsZW5kYXIuXG4gICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgY2FsZW5kYXIuXG4gICAqL1xuICBhc3luYyBjaG9vc2VBbmRTZXRFeHRlcm5hbENhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPENhbGVuZGFyPiB7XG4gICAgY29uc3QgZXh0Q2FsSWQgPSBhd2FpdCB0aGlzLm9wZW5Nb2RhbEFuZFBpY2tFeHRlcm5hbENhbGVuZGFyKGNhbCk7XG4gICAgaWYgKCFleHRDYWxJZCkgcmV0dXJuO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnNldEV4dGVybmFsQ2FsZW5kYXIoY2FsLCBleHRDYWxJZCk7XG4gIH1cbiAgLyoqXG4gICAqIE9wZW4gdGhlIG1vZGFsIHRvIHBpY2sgYSBjYWxlbmRhciBmcm9tIHRoZSBleHRlcm5hbCBzZXJ2aWNlLlxuICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgZXh0ZXJuYWwgY2FsZW5kYXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG9wZW5Nb2RhbEFuZFBpY2tFeHRlcm5hbENhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBleHRDYWxzOiBFeHRDYWxlbmRhcltdO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9sb2FkaW5nLnNob3coKTtcbiAgICAgIGV4dENhbHMgPSBhd2FpdCB0aGlzLmdldEV4dGVybmFsQ2FsZW5kYXJzKGNhbCk7XG4gICAgICBpZiAoIWV4dENhbHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ05PX0VYVEVSTkFMX0NBTEVOREFSUycpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZy5oaWRlKCk7XG4gICAgfVxuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5fbW9kYWwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogSURFQVN1Z2dlc3Rpb25zQ29tcG9uZW50LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgZGF0YTogZXh0Q2Fscy5tYXAoYyA9PiBuZXcgU3VnZ2VzdGlvbih7IHZhbHVlOiBjLmlkLCBuYW1lOiBjLm5hbWUgfSkpLFxuICAgICAgICBzZWFyY2hQbGFjZWhvbGRlcjogdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQUdFTkRBLkNBTEVOREFSUy5DSE9PU0VfQU5fRVhURVJOQUxfQ0FMRU5EQVJfVE9fTElOSycpLFxuICAgICAgICBzb3J0RGF0YTogdHJ1ZSxcbiAgICAgICAgaGlkZUlkRnJvbVVJOiB0cnVlLFxuICAgICAgICBoaWRlQ2xlYXJCdXR0b246IHRydWUsXG4gICAgICAgIG11c3RDaG9vc2U6IHRydWVcbiAgICAgIH0sXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlXG4gICAgfSk7XG4gICAgbW9kYWwucHJlc2VudCgpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1vZGFsLm9uRGlkRGlzbWlzcygpO1xuICAgIHJldHVybiByZXMuZGF0YSA/IHJlcy5kYXRhLnZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJzdCBzeW5jIG9mIHRoZSBleHRlbmFsIGNhbGVuZGFyLlxuICAgKi9cbiAgc3luY0NhbGVuZGFyKGNhbDogQ2FsZW5kYXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4gdGhpcy5zeW5jQ2FsZW5kYXJIZWxwZXIoY2FsLCBlcnIgPT4gKGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZSgpKSkpO1xuICB9XG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gcmVjdXJzaXZlbHkgc3luYyBhbiB0aGUgZXh0ZW5hbCBjYWxlbmRhci5cbiAgICovXG4gIHByaXZhdGUgc3luY0NhbGVuZGFySGVscGVyKGNhbDogQ2FsZW5kYXIsIGRvbmU6IChlcnI/OiBFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIC8vIHRoaXMgaXMgYSByZWN1cnNpdmUgb3BlcmF0aW9uOiB0aGUgQVBJIHJldHVybnMgaWYgdGhlIHN5bmMgaGFzIHRvIGNvbnRpbnVlIG9yIGl0IGZpbmlzaGVkXG4gICAgdGhpcy5fQVBJXG4gICAgICAucGF0Y2hSZXNvdXJjZSh0aGlzLmdldFJlcXVlc3RVUkwoY2FsKSwge1xuICAgICAgICBpZGVhOiB0cnVlLFxuICAgICAgICByZXNvdXJjZUlkOiBjYWwuY2FsZW5kYXJJZCxcbiAgICAgICAgYm9keTogeyBhY3Rpb246ICdTWU5DX0VYVEVSTkFMX0NBTEVOREFSJywgZmlyc3RTeW5jOiB0cnVlIH1cbiAgICAgIH0pXG4gICAgICAudGhlbigocmVzOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHJlcy5tb3JlRGF0YSkgdGhpcy5zeW5jQ2FsZW5kYXJIZWxwZXIoY2FsLCBkb25lKTtcbiAgICAgICAgZWxzZSBkb25lKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiBkb25lKGVycikpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIHN0cnVjdHVyZSB0byBkZWZpbmUgZXh0ZXJuYWwgc2VydmljZXMnIGNhbGVuZGFycyAoYmFzaWMgaW5mbykuXG4gKi9cbmludGVyZmFjZSBFeHRDYWxlbmRhciB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cbiJdfQ==