valtech-components 2.0.464 → 2.0.466

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.
@@ -100,6 +100,11 @@ export class FirebaseService {
100
100
  async signInWithCustomToken(token) {
101
101
  try {
102
102
  const credential = await signInWithCustomToken(this.auth, token);
103
+ // Forzar refresh del token para asegurar que los claims estén actualizados
104
+ // Esto es necesario porque getIdTokenResult() cachea el resultado
105
+ if (credential.user) {
106
+ await credential.user.getIdToken(true);
107
+ }
103
108
  return credential;
104
109
  }
105
110
  catch (error) {
@@ -177,14 +182,15 @@ export class FirebaseService {
177
182
  * Obtiene los claims personalizados del token del usuario.
178
183
  * Los claims son establecidos por tu backend al crear el Custom Token.
179
184
  *
185
+ * @param forceRefresh - Si true, fuerza la renovación del token para obtener claims actualizados
180
186
  * @returns Objeto con los claims o vacío si no hay usuario
181
187
  */
182
- async getClaims() {
188
+ async getClaims(forceRefresh = false) {
183
189
  const user = this.auth.currentUser;
184
190
  if (!user)
185
191
  return {};
186
192
  try {
187
- const result = await user.getIdTokenResult();
193
+ const result = await user.getIdTokenResult(forceRefresh);
188
194
  return result.claims;
189
195
  }
190
196
  catch {
@@ -209,6 +215,7 @@ export class FirebaseService {
209
215
  * Obtiene las memberships (organizaciones) del usuario.
210
216
  * Cada membership contiene el rol y permisos en esa organización.
211
217
  *
218
+ * @param forceRefresh - Si true, fuerza la renovación del token
212
219
  * @returns Mapa de orgId → MembershipInfo
213
220
  *
214
221
  * @example
@@ -217,27 +224,29 @@ export class FirebaseService {
217
224
  * // { 'org_abc': { roleId: 'admin', roleName: 'admin', permissions: ['users:*', ...] } }
218
225
  * ```
219
226
  */
220
- async getMemberships() {
221
- const claims = await this.getClaims();
227
+ async getMemberships(forceRefresh = false) {
228
+ const claims = await this.getClaims(forceRefresh);
222
229
  return claims['memberships'] || {};
223
230
  }
224
231
  /**
225
232
  * Obtiene la organización activa del usuario.
226
233
  * La organización activa se establece al hacer login o al cambiar de org.
227
234
  *
235
+ * @param forceRefresh - Si true, fuerza la renovación del token
228
236
  * @returns ID de la organización activa o null si no hay ninguna
229
237
  */
230
- async getActiveOrg() {
231
- const claims = await this.getClaims();
238
+ async getActiveOrg(forceRefresh = false) {
239
+ const claims = await this.getClaims(forceRefresh);
232
240
  return claims['activeOrg'] || null;
233
241
  }
234
242
  /**
235
243
  * Obtiene información de todas las organizaciones del usuario.
236
244
  *
245
+ * @param forceRefresh - Si true, fuerza la renovación del token
237
246
  * @returns Array con información de cada organización
238
247
  */
239
- async getOrganizations() {
240
- const memberships = await this.getMemberships();
248
+ async getOrganizations(forceRefresh = false) {
249
+ const memberships = await this.getMemberships(forceRefresh);
241
250
  return Object.entries(memberships).map(([id, info]) => ({
242
251
  id,
243
252
  roleId: info.roleId,
@@ -444,4 +453,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
444
453
  type: Inject,
445
454
  args: [VALTECH_FIREBASE_CONFIG]
446
455
  }] }] });
447
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQVEsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUduRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQWtCMUIsWUFDVSxJQUFVLEVBQ3VCLE1BQTZCO1FBRDlELFNBQUksR0FBSixJQUFJLENBQU07UUFDdUIsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFuQnhFLGtDQUFrQztRQUMxQixpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFlO1lBQ3ZELElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLEtBQUs7WUFDdEIsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUN4QyxXQUFNLEdBQTZCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFZM0UsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUks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ZUFBZSxDQUFDLEtBQWM7UUFDcEMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUksS0FBMkIsQ0FBQyxJQUFJLENBQUM7WUFFL0MsUUFBUSxJQUFJLEVBQUUsQ0FBQztnQkFDYixLQUFLLDJCQUEyQjtvQkFDOUIsT0FBTyxpQ0FBaUMsQ0FBQztnQkFDM0MsS0FBSyw0QkFBNEI7b0JBQy9CLE9BQU8seUNBQXlDLENBQUM7Z0JBQ25ELEtBQUssNkJBQTZCO29CQUNoQyxPQUFPLG9EQUFvRCxDQUFDO2dCQUM5RCxLQUFLLHdCQUF3QjtvQkFDM0IsT0FBTyxpREFBaUQsQ0FBQztnQkFDM0QsS0FBSyxvQkFBb0I7b0JBQ3ZCLE9BQU8sbUNBQW1DLENBQUM7Z0JBQzdDLEtBQUsscUJBQXFCO29CQUN4QixPQUFPLHVCQUF1QixDQUFDO2dCQUNqQztvQkFDRSxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUksb0NBQW9DLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLG9DQUFvQyxDQUFDO0lBQzlDLENBQUM7K0dBeGJVLGVBQWUsc0NBb0JoQix1QkFBdUI7bUhBcEJ0QixlQUFlLGNBREYsTUFBTTs7NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxQjdCLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXJlYmFzZSBTZXJ2aWNlXG4gKlxuICogU2VydmljaW8gcHJpbmNpcGFsIHBhcmEgbGEgYXV0ZW50aWNhY2nDs24gY29uIEZpcmViYXNlIHVzYW5kbyBDdXN0b20gVG9rZW5zLlxuICogUGVybWl0ZSBxdWUgdXN1YXJpb3MgYXV0ZW50aWNhZG9zIGNvbiB0dSBiYWNrZW5kIChDb2duaXRvLCBldGMuKSBhY2NlZGFuXG4gKiBhIHNlcnZpY2lvcyBkZSBGaXJlYmFzZSAoRmlyZXN0b3JlLCBTdG9yYWdlLCBGQ00pIGRlIG1hbmVyYSBzZWd1cmEuXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoLCBhdXRoU3RhdGUsIHNpZ25JbldpdGhDdXN0b21Ub2tlbiwgc2lnbk91dCwgVXNlciwgVXNlckNyZWRlbnRpYWwgfSBmcm9tICdAYW5ndWxhci9maXJlL2F1dGgnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfRklSRUJBU0VfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgRmlyZWJhc2VVc2VyLCBNZW1iZXJzaGlwSW5mbywgT3JnYW5pemF0aW9uSW5mbywgU2Vzc2lvblN0YXRlLCBWYWx0ZWNoRmlyZWJhc2VDb25maWcgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBkZSBhdXRlbnRpY2FjacOzbiBkZSBGaXJlYmFzZS5cbiAqXG4gKiBFc3RlIHNlcnZpY2lvIE5PIG1hbmVqYSBlbCBsb2dpbiBkZSB1c3VhcmlvcyBkaXJlY3RhbWVudGUuXG4gKiBFbiBzdSBsdWdhciwgdHJhYmFqYSBjb24gQ3VzdG9tIFRva2VucyBnZW5lcmFkb3MgcG9yIHR1IGJhY2tlbmQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIERlc3B1w6lzIGRlIGF1dGVudGljYXJ0ZSBjb24gdHUgYmFja2VuZCAoZWo6IENvZ25pdG8pXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIExvZ2luQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBhdXRoU2VydmljZSA9IGluamVjdChBdXRoU2VydmljZSk7ICAgICAvLyBUdSBzZXJ2aWNpbyBkZSBhdXRoXG4gKiAgIHByaXZhdGUgZmlyZWJhc2UgPSBpbmplY3QoRmlyZWJhc2VTZXJ2aWNlKTsgICAgLy8gRXN0ZSBzZXJ2aWNpb1xuICpcbiAqICAgYXN5bmMgbG9naW4oZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xuICogICAgIC8vIDEuIEF1dGVudGljYXIgY29uIHR1IGJhY2tlbmRcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aFNlcnZpY2UubG9naW4oZW1haWwsIHBhc3N3b3JkKTtcbiAqXG4gKiAgICAgLy8gMi4gRWwgYmFja2VuZCBkZXZ1ZWx2ZSB1biBGaXJlYmFzZSBDdXN0b20gVG9rZW5cbiAqICAgICBpZiAocmVzcG9uc2UuZmlyZWJhc2VUb2tlbikge1xuICogICAgICAgYXdhaXQgdGhpcy5maXJlYmFzZS5zaWduSW5XaXRoQ3VzdG9tVG9rZW4ocmVzcG9uc2UuZmlyZWJhc2VUb2tlbik7XG4gKiAgICAgfVxuICpcbiAqICAgICAvLyBBaG9yYSBlbCB1c3VhcmlvIHB1ZWRlIGFjY2VkZXIgYSBGaXJlc3RvcmUsIFN0b3JhZ2UsIGV0Yy5cbiAqICAgfVxuICpcbiAqICAgYXN5bmMgbG9nb3V0KCkge1xuICogICAgIGF3YWl0IHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KCk7XG4gKiAgICAgYXdhaXQgdGhpcy5maXJlYmFzZS5zaWduT3V0KCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEZpcmViYXNlU2VydmljZSB7XG4gIC8qKiBFc3RhZG8gaW50ZXJubyBkZSBsYSBzZXNpw7NuICovXG4gIHByaXZhdGUgc2Vzc2lvblN0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uU3RhdGU+KHtcbiAgICB1c2VyOiBudWxsLFxuICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgIGVycm9yOiBudWxsLFxuICB9KTtcblxuICAvKiogRXN0YWRvIGFjdHVhbCBkZSBsYSBzZXNpw7NuIGNvbW8gT2JzZXJ2YWJsZSAqL1xuICByZWFkb25seSBzdGF0ZSQ6IE9ic2VydmFibGU8U2Vzc2lvblN0YXRlPiA9IHRoaXMuc2Vzc2lvblN0YXRlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBVc3VhcmlvIGFjdHVhbCBkZSBGaXJlYmFzZSBjb21vIE9ic2VydmFibGUgKi9cbiAgcmVhZG9ubHkgdXNlciQ6IE9ic2VydmFibGU8RmlyZWJhc2VVc2VyIHwgbnVsbD47XG5cbiAgLyoqIEluZGljYSBzaSBlbCB1c3VhcmlvIGVzdMOhIGF1dGVudGljYWRvIGVuIEZpcmViYXNlICovXG4gIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoLFxuICAgIEBJbmplY3QoVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoRmlyZWJhc2VDb25maWdcbiAgKSB7XG4gICAgLy8gSW5pY2lhbGl6YXIgb2JzZXJ2YWJsZXMgcXVlIGRlcGVuZGVuIGRlIGF1dGhcbiAgICB0aGlzLnVzZXIkID0gYXV0aFN0YXRlKHRoaXMuYXV0aCkucGlwZShcbiAgICAgIG1hcCgodXNlcikgPT4gKHVzZXIgPyB0aGlzLm1hcFVzZXIodXNlcikgOiBudWxsKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gYT8udWlkID09PSBiPy51aWQpXG4gICAgKTtcblxuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkJCA9IHRoaXMudXNlciQucGlwZShcbiAgICAgIG1hcCgodXNlcikgPT4gISF1c2VyKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICAgIC8vIEVzY3VjaGFyIGNhbWJpb3MgZW4gZWwgZXN0YWRvIGRlIGF1dGVudGljYWNpw7NuXG4gICAgYXV0aFN0YXRlKHRoaXMuYXV0aCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh1c2VyKSA9PiB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0YXRlLm5leHQoe1xuICAgICAgICAgIHVzZXI6IHVzZXIgPyB0aGlzLm1hcFVzZXIodXNlcikgOiBudWxsLFxuICAgICAgICAgIGlzQXV0aGVudGljYXRlZDogISF1c2VyLFxuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdGUubmV4dCh7XG4gICAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBVVRFTlRJQ0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXV0ZW50aWNhIGFsIHVzdWFyaW8gY29uIHVuIEN1c3RvbSBUb2tlbiBnZW5lcmFkbyBwb3IgZWwgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gRmlyZWJhc2UgQ3VzdG9tIFRva2VuIGdlbmVyYWRvIHBvciB0dSBiYWNrZW5kXG4gICAqIEByZXR1cm5zIFVzZXJDcmVkZW50aWFsIGNvbiBsYSBpbmZvcm1hY2nDs24gZGVsIHVzdWFyaW9cbiAgICogQHRocm93cyBFcnJvciBzaSBlbCB0b2tlbiBlcyBpbnbDoWxpZG8gbyBleHBpcsOzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVzcHXDqXMgZGUgbG9naW4gZXhpdG9zbyBjb24gdHUgYmFja2VuZFxuICAgKiBjb25zdCB7IGZpcmViYXNlVG9rZW4gfSA9IGF3YWl0IGJhY2tlbmRBdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gICAqIGF3YWl0IGZpcmViYXNlU2VydmljZS5zaWduSW5XaXRoQ3VzdG9tVG9rZW4oZmlyZWJhc2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3VzdG9tVG9rZW4odGhpcy5hdXRoLCB0b2tlbik7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UuXG4gICAqIExsYW1hciBqdW50byBjb24gZWwgbG9nb3V0IGRlIHR1IHNpc3RlbWEgZGUgYXV0ZW50aWNhY2nDs24gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGxvZ291dCgpIHtcbiAgICogICBhd2FpdCB0aGlzLmJhY2tlbmRBdXRoLmxvZ291dCgpOyAgICAvLyBUdSBhdXRoXG4gICAqICAgYXdhaXQgdGhpcy5maXJlYmFzZS5zaWduT3V0KCk7ICAgICAgIC8vIEZpcmViYXNlXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWduT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzaWduT3V0KHRoaXMuYXV0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdFVFRFUlMgU8ONTkNST05PU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCB1c3VhcmlvIGFjdHVhbCBkZSBGaXJlYmFzZSAoc8OtbmNyb25vKS5cbiAgICogUmV0b3JuYSBudWxsIHNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyKCk6IEZpcmViYXNlVXNlciB8IG51bGwge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGguY3VycmVudFVzZXI7XG4gICAgcmV0dXJuIHVzZXIgPyB0aGlzLm1hcFVzZXIodXNlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgVUlEIGRlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogUmV0b3JuYSBudWxsIHNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKi9cbiAgZ2V0IHVpZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmN1cnJlbnRVc2VyPy51aWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2Egc2kgaGF5IHVuIHVzdWFyaW8gYXV0ZW50aWNhZG8gYWN0dWFsbWVudGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUT0tFTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgSUQgVG9rZW4gZGUgRmlyZWJhc2UgcGFyYSBlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogw5p0aWwgcGFyYSB2YWxpZGFyIGVsIHVzdWFyaW8gZW4gdHUgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW5cbiAgICogQHJldHVybnMgSUQgVG9rZW4gbyBudWxsIHNpIG5vIGhheSB1c3VhcmlvXG4gICAqL1xuICBhc3luYyBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgICBpZiAoIXVzZXIpIHJldHVybiBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB1c2VyLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBjbGFpbXMgcGVyc29uYWxpemFkb3MgZGVsIHRva2VuIGRlbCB1c3VhcmlvLlxuICAgKiBMb3MgY2xhaW1zIHNvbiBlc3RhYmxlY2lkb3MgcG9yIHR1IGJhY2tlbmQgYWwgY3JlYXIgZWwgQ3VzdG9tIFRva2VuLlxuICAgKlxuICAgKiBAcmV0dXJucyBPYmpldG8gY29uIGxvcyBjbGFpbXMgbyB2YWPDrW8gc2kgbm8gaGF5IHVzdWFyaW9cbiAgICovXG4gIGFzeW5jIGdldENsYWltcygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgICBpZiAoIXVzZXIpIHJldHVybiB7fTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1c2VyLmdldElkVG9rZW5SZXN1bHQoKTtcbiAgICAgIHJldHVybiByZXN1bHQuY2xhaW1zO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBlc3BlY8OtZmljby5cbiAgICogRWwgcm9sIGRlYmUgZXN0YXIgZGVmaW5pZG8gZW4gbG9zIGNsYWltcyBkZWwgQ3VzdG9tIFRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0gcm9sZSAtIE5vbWJyZSBkZWwgcm9sIGEgdmVyaWZpY2FyXG4gICAqIEByZXR1cm5zIHRydWUgc2kgZWwgdXN1YXJpbyB0aWVuZSBlbCByb2xcbiAgICovXG4gIGFzeW5jIGhhc1JvbGUocm9sZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2xhaW1zID0gYXdhaXQgdGhpcy5nZXRDbGFpbXMoKTtcbiAgICByZXR1cm4gY2xhaW1zWydyb2xlJ10gPT09IHJvbGUgfHwgKEFycmF5LmlzQXJyYXkoY2xhaW1zWydyb2xlcyddKSAmJiBjbGFpbXNbJ3JvbGVzJ10uaW5jbHVkZXMocm9sZSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJCQUMgLSBQRVJNSVNPUyBZIE9SR0FOSVpBQ0lPTkVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhcyBtZW1iZXJzaGlwcyAob3JnYW5pemFjaW9uZXMpIGRlbCB1c3VhcmlvLlxuICAgKiBDYWRhIG1lbWJlcnNoaXAgY29udGllbmUgZWwgcm9sIHkgcGVybWlzb3MgZW4gZXNhIG9yZ2FuaXphY2nDs24uXG4gICAqXG4gICAqIEByZXR1cm5zIE1hcGEgZGUgb3JnSWQg4oaSIE1lbWJlcnNoaXBJbmZvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCBmaXJlYmFzZVNlcnZpY2UuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICogLy8geyAnb3JnX2FiYyc6IHsgcm9sZUlkOiAnYWRtaW4nLCByb2xlTmFtZTogJ2FkbWluJywgcGVybWlzc2lvbnM6IFsndXNlcnM6KicsIC4uLl0gfSB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TWVtYmVyc2hpcHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBNZW1iZXJzaGlwSW5mbz4+IHtcbiAgICBjb25zdCBjbGFpbXMgPSBhd2FpdCB0aGlzLmdldENsYWltcygpO1xuICAgIHJldHVybiAoY2xhaW1zWydtZW1iZXJzaGlwcyddIGFzIFJlY29yZDxzdHJpbmcsIE1lbWJlcnNoaXBJbmZvPikgfHwge307XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBkZWwgdXN1YXJpby5cbiAgICogTGEgb3JnYW5pemFjacOzbiBhY3RpdmEgc2UgZXN0YWJsZWNlIGFsIGhhY2VyIGxvZ2luIG8gYWwgY2FtYmlhciBkZSBvcmcuXG4gICAqXG4gICAqIEByZXR1cm5zIElEIGRlIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhIG8gbnVsbCBzaSBubyBoYXkgbmluZ3VuYVxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlT3JnKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGNsYWltcyA9IGF3YWl0IHRoaXMuZ2V0Q2xhaW1zKCk7XG4gICAgcmV0dXJuIChjbGFpbXNbJ2FjdGl2ZU9yZyddIGFzIHN0cmluZykgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGluZm9ybWFjacOzbiBkZSB0b2RhcyBsYXMgb3JnYW5pemFjaW9uZXMgZGVsIHVzdWFyaW8uXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IGNvbiBpbmZvcm1hY2nDs24gZGUgY2FkYSBvcmdhbml6YWNpw7NuXG4gICAqL1xuICBhc3luYyBnZXRPcmdhbml6YXRpb25zKCk6IFByb21pc2U8T3JnYW5pemF0aW9uSW5mb1tdPiB7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmdldE1lbWJlcnNoaXBzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG1lbWJlcnNoaXBzKS5tYXAoKFtpZCwgaW5mb10pID0+ICh7XG4gICAgICBpZCxcbiAgICAgIHJvbGVJZDogaW5mby5yb2xlSWQsXG4gICAgICByb2xlTmFtZTogaW5mby5yb2xlTmFtZSxcbiAgICAgIHBlcm1pc3Npb25zOiBpbmZvLnBlcm1pc3Npb25zLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBJRHMgZGUgdG9kYXMgbGFzIG9yZ2FuaXphY2lvbmVzIGRlbCB1c3VhcmlvLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBkZSBJRHMgZGUgb3JnYW5pemFjaW9uZXNcbiAgICovXG4gIGFzeW5jIGdldE9yZ2FuaXphdGlvbklkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmdldE1lbWJlcnNoaXBzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1lbWJlcnNoaXBzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHBlcnRlbmVjZSBhIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpw7NuXG4gICAqIEByZXR1cm5zIHRydWUgc2kgZWwgdXN1YXJpbyBlcyBtaWVtYnJvXG4gICAqL1xuICBhc3luYyBpc01lbWJlck9mKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICByZXR1cm4gb3JnSWQgaW4gbWVtYmVyc2hpcHM7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCByb2wgZGVsIHVzdWFyaW8gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs25cbiAgICogQHJldHVybnMgSUQgZGVsIHJvbCBvIG51bGwgc2kgbm8gZXMgbWllbWJyb1xuICAgKi9cbiAgYXN5bmMgZ2V0Um9sZUluT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICByZXR1cm4gbWVtYmVyc2hpcHNbb3JnSWRdPy5yb2xlSWQgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBwZXJtaXNvcyBkZWwgdXN1YXJpbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzblxuICAgKiBAcmV0dXJucyBBcnJheSBkZSBwZXJtaXNvcyBlbiBmb3JtYXRvICdyZXNvdXJjZTphY3Rpb24nXG4gICAqL1xuICBhc3luYyBnZXRQZXJtaXNzaW9uc0luT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCB0aGlzLmdldE1lbWJlcnNoaXBzKCk7XG4gICAgcmV0dXJuIG1lbWJlcnNoaXBzW29yZ0lkXT8ucGVybWlzc2lvbnMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyB0aWVuZSB1biBwZXJtaXNvIGVzcGVjw61maWNvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBTb3BvcnRhIHdpbGRjYXJkczogJ3Jlc291cmNlOionIHkgJyo6KicgKHN1cGVyIGFkbWluKS5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzblxuICAgKiBAcGFyYW0gcmVzb3VyY2UgLSBSZWN1cnNvIGEgdmVyaWZpY2FyIChlajogJ3VzZXJzJywgJ2RvY3VtZW50cycpXG4gICAqIEBwYXJhbSBhY3Rpb24gLSBBY2Npw7NuIGEgdmVyaWZpY2FyIChlajogJ3JlYWQnLCAnd3JpdGUnLCAnY3JlYXRlJywgJ2RlbGV0ZScpXG4gICAqIEByZXR1cm5zIHRydWUgc2kgdGllbmUgZWwgcGVybWlzb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFZlcmlmaWNhciBwZXJtaXNvIGVzcGVjw61maWNvXG4gICAqIGNvbnN0IGNhblJlYWRVc2VycyA9IGF3YWl0IGZpcmViYXNlU2VydmljZS5oYXNQZXJtaXNzaW9uKCdvcmdfYWJjJywgJ3VzZXJzJywgJ3JlYWQnKTtcbiAgICpcbiAgICogLy8gVmVyaWZpY2FyIGVuIGxhIG9yZ2FuaXphY2nDs24gYWN0aXZhXG4gICAqIGNvbnN0IG9yZ0lkID0gYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLmdldEFjdGl2ZU9yZygpO1xuICAgKiBjb25zdCBjYW5FZGl0ID0gYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLmhhc1Blcm1pc3Npb24ob3JnSWQhLCAnZG9jdW1lbnRzJywgJ3dyaXRlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaGFzUGVybWlzc2lvbihvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRQZXJtaXNzaW9uc0luT3JnKG9yZ0lkKTtcbiAgICBjb25zdCBwZXJtaXNzaW9uID0gYCR7cmVzb3VyY2V9OiR7YWN0aW9ufWA7XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbikgfHxcbiAgICAgIHBlcm1pc3Npb25zLmluY2x1ZGVzKGAke3Jlc291cmNlfToqYCkgfHxcbiAgICAgIHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBwdWVkZSBsZWVyIHVuIHJlY3Vyc28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIEF0YWpvIHBhcmEgaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICdyZWFkJykuXG4gICAqL1xuICBhc3luYyBjYW5SZWFkKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ3JlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHB1ZWRlIGVzY3JpYmlyIHVuIHJlY3Vyc28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIEF0YWpvIHBhcmEgaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICd3cml0ZScpLlxuICAgKi9cbiAgYXN5bmMgY2FuV3JpdGUob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAnd3JpdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHB1ZWRlIGNyZWFyIHVuIHJlY3Vyc28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIEF0YWpvIHBhcmEgaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICdjcmVhdGUnKS5cbiAgICovXG4gIGFzeW5jIGNhbkNyZWF0ZShvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICdjcmVhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHB1ZWRlIGVsaW1pbmFyIHVuIHJlY3Vyc28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIEF0YWpvIHBhcmEgaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICdkZWxldGUnKS5cbiAgICovXG4gIGFzeW5jIGNhbkRlbGV0ZShvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICdkZWxldGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHB1ZWRlIGFkbWluaXN0cmFyIHVuIHJlY3Vyc28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIEVxdWl2YWxlIGEgdGVuZXIgJ3Jlc291cmNlOionIG8gJyo6KicuXG4gICAqL1xuICBhc3luYyBjYW5NYW5hZ2Uob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRQZXJtaXNzaW9uc0luT3JnKG9yZ0lkKTtcbiAgICByZXR1cm4gcGVybWlzc2lvbnMuaW5jbHVkZXMoYCR7cmVzb3VyY2V9OipgKSB8fCBwZXJtaXNzaW9ucy5pbmNsdWRlcygnKjoqJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBlcyBzdXBlciBhZG1pbiBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogU3VwZXIgYWRtaW4gdGllbmUgZWwgcGVybWlzbyAnKjoqJy5cbiAgICovXG4gIGFzeW5jIGlzU3VwZXJBZG1pbihvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQpO1xuICAgIHJldHVybiBwZXJtaXNzaW9ucy5pbmNsdWRlcygnKjoqJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgZWwgdXN1YXJpbyBlcyBhZG1pbiBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICovXG4gIGFzeW5jIGlzQWRtaW5Jbk9yZyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgcm9sZSA9IGF3YWl0IHRoaXMuZ2V0Um9sZUluT3JnKG9yZ0lkKTtcbiAgICByZXR1cm4gcm9sZSA9PT0gJ2FkbWluJyB8fCByb2xlID09PSAnc3VwZXJfYWRtaW4nO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVzcGVyYSBhIHF1ZSBlbCBlc3RhZG8gZGUgYXV0ZW50aWNhY2nDs24gZXN0w6kgZGV0ZXJtaW5hZG8uXG4gICAqIMOadGlsIGVuIGd1YXJkcyBvIGFsIGluaWNpYWxpemFyIGxhIGFwcC5cbiAgICpcbiAgICogQHJldHVybnMgVXN1YXJpbyBhY3R1YWwgbyBudWxsXG4gICAqL1xuICB3YWl0Rm9yQXV0aCgpOiBQcm9taXNlPEZpcmViYXNlVXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3RhdGUkLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlLnVzZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGNvbmZpZ3VyYWNpw7NuIGFjdHVhbCBkZSBGaXJlYmFzZS5cbiAgICovXG4gIGdldENvbmZpZygpOiBWYWx0ZWNoRmlyZWJhc2VDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2Egc2kgbG9zIGVtdWxhZG9yZXMgZXN0w6FuIGhhYmlsaXRhZG9zLlxuICAgKi9cbiAgaXNVc2luZ0VtdWxhdG9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5jb25maWcuZW11bGF0b3I/LmZpcmVzdG9yZSB8fCB0aGlzLmNvbmZpZy5lbXVsYXRvcj8uYXV0aCB8fCB0aGlzLmNvbmZpZy5lbXVsYXRvcj8uc3RvcmFnZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTcOJVE9ET1MgUFJJVkFET1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE1hcGVhIHVuIFVzZXIgZGUgRmlyZWJhc2UgYSBudWVzdHJhIGludGVyZmFjZSBGaXJlYmFzZVVzZXJcbiAgICovXG4gIHByaXZhdGUgbWFwVXNlcih1c2VyOiBVc2VyKTogRmlyZWJhc2VVc2VyIHtcbiAgICByZXR1cm4ge1xuICAgICAgdWlkOiB1c2VyLnVpZCxcbiAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgZGlzcGxheU5hbWU6IHVzZXIuZGlzcGxheU5hbWUsXG4gICAgICBwaG90b1VSTDogdXNlci5waG90b1VSTCxcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHVzZXIuZW1haWxWZXJpZmllZCxcbiAgICAgIGlzQW5vbnltb3VzOiB1c2VyLmlzQW5vbnltb3VzLFxuICAgICAgcHJvdmlkZXJJZDogdXNlci5wcm92aWRlcklkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmllcnRlIGVycm9yZXMgZGUgRmlyZWJhc2UgYSBtZW5zYWplcyBlbiBlc3Bhw7FvbFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBjb2RlID0gKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlO1xuXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSAnYXV0aC9pbnZhbGlkLWN1c3RvbS10b2tlbic6XG4gICAgICAgICAgcmV0dXJuICdUb2tlbiBkZSBhdXRlbnRpY2FjacOzbiBpbnbDoWxpZG8nO1xuICAgICAgICBjYXNlICdhdXRoL2N1c3RvbS10b2tlbi1taXNtYXRjaCc6XG4gICAgICAgICAgcmV0dXJuICdFbCB0b2tlbiBubyBjb3JyZXNwb25kZSBhIGVzdGUgcHJveWVjdG8nO1xuICAgICAgICBjYXNlICdhdXRoL25ldHdvcmstcmVxdWVzdC1mYWlsZWQnOlxuICAgICAgICAgIHJldHVybiAnRXJyb3IgZGUgY29uZXhpw7NuLiBWZXJpZmljYSB0dSBjb25leGnDs24gYSBpbnRlcm5ldCc7XG4gICAgICAgIGNhc2UgJ2F1dGgvdG9vLW1hbnktcmVxdWVzdHMnOlxuICAgICAgICAgIHJldHVybiAnRGVtYXNpYWRvcyBpbnRlbnRvcy4gSW50ZW50YSBkZSBudWV2byBtw6FzIHRhcmRlJztcbiAgICAgICAgY2FzZSAnYXV0aC91c2VyLWRpc2FibGVkJzpcbiAgICAgICAgICByZXR1cm4gJ0VzdGEgY3VlbnRhIGhhIHNpZG8gZGVzaGFiaWxpdGFkYSc7XG4gICAgICAgIGNhc2UgJ2F1dGgvdXNlci1ub3QtZm91bmQnOlxuICAgICAgICAgIHJldHVybiAnVXN1YXJpbyBubyBlbmNvbnRyYWRvJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24gZGVzY29ub2NpZG8nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnRXJyb3IgZGUgYXV0ZW50aWNhY2nDs24gZGVzY29ub2NpZG8nO1xuICB9XG59XG4iXX0=
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQVEsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBd0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU5RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUduRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQWtCMUIsWUFDVSxJQUFVLEVBQ3VCLE1BQTZCO1FBRDlELFNBQUksR0FBSixJQUFJLENBQU07UUFDdUIsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFuQnhFLGtDQUFrQztRQUMxQixpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFlO1lBQ3ZELElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLEtBQUs7WUFDdEIsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUN4QyxXQUFNLEdBQTZCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFZM0UsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUks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YXNlIFNlcnZpY2VcbiAqXG4gKiBTZXJ2aWNpbyBwcmluY2lwYWwgcGFyYSBsYSBhdXRlbnRpY2FjacOzbiBjb24gRmlyZWJhc2UgdXNhbmRvIEN1c3RvbSBUb2tlbnMuXG4gKiBQZXJtaXRlIHF1ZSB1c3VhcmlvcyBhdXRlbnRpY2Fkb3MgY29uIHR1IGJhY2tlbmQgKENvZ25pdG8sIGV0Yy4pIGFjY2VkYW5cbiAqIGEgc2VydmljaW9zIGRlIEZpcmViYXNlIChGaXJlc3RvcmUsIFN0b3JhZ2UsIEZDTSkgZGUgbWFuZXJhIHNlZ3VyYS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dGgsIGF1dGhTdGF0ZSwgc2lnbkluV2l0aEN1c3RvbVRva2VuLCBzaWduT3V0LCBVc2VyLCBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvYXV0aCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBGaXJlYmFzZVVzZXIsIE1lbWJlcnNoaXBJbmZvLCBPcmdhbml6YXRpb25JbmZvLCBTZXNzaW9uU3RhdGUsIFZhbHRlY2hGaXJlYmFzZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuIGRlIEZpcmViYXNlLlxuICpcbiAqIEVzdGUgc2VydmljaW8gTk8gbWFuZWphIGVsIGxvZ2luIGRlIHVzdWFyaW9zIGRpcmVjdGFtZW50ZS5cbiAqIEVuIHN1IGx1Z2FyLCB0cmFiYWphIGNvbiBDdXN0b20gVG9rZW5zIGdlbmVyYWRvcyBwb3IgdHUgYmFja2VuZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRGVzcHXDqXMgZGUgYXV0ZW50aWNhcnRlIGNvbiB0dSBiYWNrZW5kIChlajogQ29nbml0bylcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xuICogICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTsgICAgIC8vIFR1IHNlcnZpY2lvIGRlIGF1dGhcbiAqICAgcHJpdmF0ZSBmaXJlYmFzZSA9IGluamVjdChGaXJlYmFzZVNlcnZpY2UpOyAgICAvLyBFc3RlIHNlcnZpY2lvXG4gKlxuICogICBhc3luYyBsb2dpbihlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XG4gKiAgICAgLy8gMS4gQXV0ZW50aWNhciBjb24gdHUgYmFja2VuZFxuICogICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoU2VydmljZS5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqICAgICAvLyAyLiBFbCBiYWNrZW5kIGRldnVlbHZlIHVuIEZpcmViYXNlIEN1c3RvbSBUb2tlblxuICogICAgIGlmIChyZXNwb25zZS5maXJlYmFzZVRva2VuKSB7XG4gKiAgICAgICBhd2FpdCB0aGlzLmZpcmViYXNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihyZXNwb25zZS5maXJlYmFzZVRva2VuKTtcbiAqICAgICB9XG4gKlxuICogICAgIC8vIEFob3JhIGVsIHVzdWFyaW8gcHVlZGUgYWNjZWRlciBhIEZpcmVzdG9yZSwgU3RvcmFnZSwgZXRjLlxuICogICB9XG4gKlxuICogICBhc3luYyBsb2dvdXQoKSB7XG4gKiAgICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5sb2dvdXQoKTtcbiAqICAgICBhd2FpdCB0aGlzLmZpcmViYXNlLnNpZ25PdXQoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VTZXJ2aWNlIHtcbiAgLyoqIEVzdGFkbyBpbnRlcm5vIGRlIGxhIHNlc2nDs24gKi9cbiAgcHJpdmF0ZSBzZXNzaW9uU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25TdGF0ZT4oe1xuICAgIHVzZXI6IG51bGwsXG4gICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgZXJyb3I6IG51bGwsXG4gIH0pO1xuXG4gIC8qKiBFc3RhZG8gYWN0dWFsIGRlIGxhIHNlc2nDs24gY29tbyBPYnNlcnZhYmxlICovXG4gIHJlYWRvbmx5IHN0YXRlJDogT2JzZXJ2YWJsZTxTZXNzaW9uU3RhdGU+ID0gdGhpcy5zZXNzaW9uU3RhdGUuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFVzdWFyaW8gYWN0dWFsIGRlIEZpcmViYXNlIGNvbW8gT2JzZXJ2YWJsZSAqL1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxGaXJlYmFzZVVzZXIgfCBudWxsPjtcblxuICAvKiogSW5kaWNhIHNpIGVsIHVzdWFyaW8gZXN0w6EgYXV0ZW50aWNhZG8gZW4gRmlyZWJhc2UgKi9cbiAgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGg6IEF1dGgsXG4gICAgQEluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZ1xuICApIHtcbiAgICAvLyBJbmljaWFsaXphciBvYnNlcnZhYmxlcyBxdWUgZGVwZW5kZW4gZGUgYXV0aFxuICAgIHRoaXMudXNlciQgPSBhdXRoU3RhdGUodGhpcy5hdXRoKS5waXBlKFxuICAgICAgbWFwKCh1c2VyKSA9PiAodXNlciA/IHRoaXMubWFwVXNlcih1c2VyKSA6IG51bGwpKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhPy51aWQgPT09IGI/LnVpZClcbiAgICApO1xuXG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy51c2VyJC5waXBlKFxuICAgICAgbWFwKCh1c2VyKSA9PiAhIXVzZXIpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gICAgLy8gRXNjdWNoYXIgY2FtYmlvcyBlbiBlbCBlc3RhZG8gZGUgYXV0ZW50aWNhY2nDs25cbiAgICBhdXRoU3RhdGUodGhpcy5hdXRoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHVzZXIpID0+IHtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdGUubmV4dCh7XG4gICAgICAgICAgdXNlcjogdXNlciA/IHRoaXMubWFwVXNlcih1c2VyKSA6IG51bGwsXG4gICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiAhIXVzZXIsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNlc3Npb25TdGF0ZS5uZXh0KHtcbiAgICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFVVEVOVElDQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBdXRlbnRpY2EgYWwgdXN1YXJpbyBjb24gdW4gQ3VzdG9tIFRva2VuIGdlbmVyYWRvIHBvciBlbCBiYWNrZW5kLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBGaXJlYmFzZSBDdXN0b20gVG9rZW4gZ2VuZXJhZG8gcG9yIHR1IGJhY2tlbmRcbiAgICogQHJldHVybnMgVXNlckNyZWRlbnRpYWwgY29uIGxhIGluZm9ybWFjacOzbiBkZWwgdXN1YXJpb1xuICAgKiBAdGhyb3dzIEVycm9yIHNpIGVsIHRva2VuIGVzIGludsOhbGlkbyBvIGV4cGlyw7NcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXNwdcOpcyBkZSBsb2dpbiBleGl0b3NvIGNvbiB0dSBiYWNrZW5kXG4gICAqIGNvbnN0IHsgZmlyZWJhc2VUb2tlbiB9ID0gYXdhaXQgYmFja2VuZEF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkKTtcbiAgICogYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLnNpZ25JbldpdGhDdXN0b21Ub2tlbihmaXJlYmFzZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDdXN0b21Ub2tlbih0aGlzLmF1dGgsIHRva2VuKTtcblxuICAgICAgLy8gRm9yemFyIHJlZnJlc2ggZGVsIHRva2VuIHBhcmEgYXNlZ3VyYXIgcXVlIGxvcyBjbGFpbXMgZXN0w6luIGFjdHVhbGl6YWRvc1xuICAgICAgLy8gRXN0byBlcyBuZWNlc2FyaW8gcG9ycXVlIGdldElkVG9rZW5SZXN1bHQoKSBjYWNoZWEgZWwgcmVzdWx0YWRvXG4gICAgICBpZiAoY3JlZGVudGlhbC51c2VyKSB7XG4gICAgICAgIGF3YWl0IGNyZWRlbnRpYWwudXNlci5nZXRJZFRva2VuKHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3JlZGVudGlhbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2llcnJhIGxhIHNlc2nDs24gZGUgRmlyZWJhc2UuXG4gICAqIExsYW1hciBqdW50byBjb24gZWwgbG9nb3V0IGRlIHR1IHNpc3RlbWEgZGUgYXV0ZW50aWNhY2nDs24gcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGFzeW5jIGxvZ291dCgpIHtcbiAgICogICBhd2FpdCB0aGlzLmJhY2tlbmRBdXRoLmxvZ291dCgpOyAgICAvLyBUdSBhdXRoXG4gICAqICAgYXdhaXQgdGhpcy5maXJlYmFzZS5zaWduT3V0KCk7ICAgICAgIC8vIEZpcmViYXNlXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWduT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzaWduT3V0KHRoaXMuYXV0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdFVFRFUlMgU8ONTkNST05PU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2J0aWVuZSBlbCB1c3VhcmlvIGFjdHVhbCBkZSBGaXJlYmFzZSAoc8OtbmNyb25vKS5cbiAgICogUmV0b3JuYSBudWxsIHNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyKCk6IEZpcmViYXNlVXNlciB8IG51bGwge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmF1dGguY3VycmVudFVzZXI7XG4gICAgcmV0dXJuIHVzZXIgPyB0aGlzLm1hcFVzZXIodXNlcikgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgVUlEIGRlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogUmV0b3JuYSBudWxsIHNpIG5vIGhheSB1c3VhcmlvIGF1dGVudGljYWRvLlxuICAgKi9cbiAgZ2V0IHVpZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmN1cnJlbnRVc2VyPy51aWQgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2Egc2kgaGF5IHVuIHVzdWFyaW8gYXV0ZW50aWNhZG8gYWN0dWFsbWVudGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUT0tFTlNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgSUQgVG9rZW4gZGUgRmlyZWJhc2UgcGFyYSBlbCB1c3VhcmlvIGFjdHVhbC5cbiAgICogw5p0aWwgcGFyYSB2YWxpZGFyIGVsIHVzdWFyaW8gZW4gdHUgYmFja2VuZC5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW5cbiAgICogQHJldHVybnMgSUQgVG9rZW4gbyBudWxsIHNpIG5vIGhheSB1c3VhcmlvXG4gICAqL1xuICBhc3luYyBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcjtcbiAgICBpZiAoIXVzZXIpIHJldHVybiBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB1c2VyLmdldElkVG9rZW4oZm9yY2VSZWZyZXNoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxvcyBjbGFpbXMgcGVyc29uYWxpemFkb3MgZGVsIHRva2VuIGRlbCB1c3VhcmlvLlxuICAgKiBMb3MgY2xhaW1zIHNvbiBlc3RhYmxlY2lkb3MgcG9yIHR1IGJhY2tlbmQgYWwgY3JlYXIgZWwgQ3VzdG9tIFRva2VuLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gU2kgdHJ1ZSwgZnVlcnphIGxhIHJlbm92YWNpw7NuIGRlbCB0b2tlbiBwYXJhIG9idGVuZXIgY2xhaW1zIGFjdHVhbGl6YWRvc1xuICAgKiBAcmV0dXJucyBPYmpldG8gY29uIGxvcyBjbGFpbXMgbyB2YWPDrW8gc2kgbm8gaGF5IHVzdWFyaW9cbiAgICovXG4gIGFzeW5jIGdldENsYWltcyhmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLmN1cnJlbnRVc2VyO1xuICAgIGlmICghdXNlcikgcmV0dXJuIHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlblJlc3VsdChmb3JjZVJlZnJlc2gpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5jbGFpbXM7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gdGllbmUgdW4gcm9sIGVzcGVjw61maWNvLlxuICAgKiBFbCByb2wgZGViZSBlc3RhciBkZWZpbmlkbyBlbiBsb3MgY2xhaW1zIGRlbCBDdXN0b20gVG9rZW4uXG4gICAqXG4gICAqIEBwYXJhbSByb2xlIC0gTm9tYnJlIGRlbCByb2wgYSB2ZXJpZmljYXJcbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIHRpZW5lIGVsIHJvbFxuICAgKi9cbiAgYXN5bmMgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjbGFpbXMgPSBhd2FpdCB0aGlzLmdldENsYWltcygpO1xuICAgIHJldHVybiBjbGFpbXNbJ3JvbGUnXSA9PT0gcm9sZSB8fCAoQXJyYXkuaXNBcnJheShjbGFpbXNbJ3JvbGVzJ10pICYmIGNsYWltc1sncm9sZXMnXS5pbmNsdWRlcyhyb2xlKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUkJBQyAtIFBFUk1JU09TIFkgT1JHQU5JWkFDSU9ORVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGFzIG1lbWJlcnNoaXBzIChvcmdhbml6YWNpb25lcykgZGVsIHVzdWFyaW8uXG4gICAqIENhZGEgbWVtYmVyc2hpcCBjb250aWVuZSBlbCByb2wgeSBwZXJtaXNvcyBlbiBlc2Egb3JnYW5pemFjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIFNpIHRydWUsIGZ1ZXJ6YSBsYSByZW5vdmFjacOzbiBkZWwgdG9rZW5cbiAgICogQHJldHVybnMgTWFwYSBkZSBvcmdJZCDihpIgTWVtYmVyc2hpcEluZm9cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IGZpcmViYXNlU2VydmljZS5nZXRNZW1iZXJzaGlwcygpO1xuICAgKiAvLyB7ICdvcmdfYWJjJzogeyByb2xlSWQ6ICdhZG1pbicsIHJvbGVOYW1lOiAnYWRtaW4nLCBwZXJtaXNzaW9uczogWyd1c2VyczoqJywgLi4uXSB9IH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZW1iZXJzaGlwcyhmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgTWVtYmVyc2hpcEluZm8+PiB7XG4gICAgY29uc3QgY2xhaW1zID0gYXdhaXQgdGhpcy5nZXRDbGFpbXMoZm9yY2VSZWZyZXNoKTtcbiAgICByZXR1cm4gKGNsYWltc1snbWVtYmVyc2hpcHMnXSBhcyBSZWNvcmQ8c3RyaW5nLCBNZW1iZXJzaGlwSW5mbz4pIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgb3JnYW5pemFjacOzbiBhY3RpdmEgZGVsIHVzdWFyaW8uXG4gICAqIExhIG9yZ2FuaXphY2nDs24gYWN0aXZhIHNlIGVzdGFibGVjZSBhbCBoYWNlciBsb2dpbiBvIGFsIGNhbWJpYXIgZGUgb3JnLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gU2kgdHJ1ZSwgZnVlcnphIGxhIHJlbm92YWNpw7NuIGRlbCB0b2tlblxuICAgKiBAcmV0dXJucyBJRCBkZSBsYSBvcmdhbml6YWNpw7NuIGFjdGl2YSBvIG51bGwgc2kgbm8gaGF5IG5pbmd1bmFcbiAgICovXG4gIGFzeW5jIGdldEFjdGl2ZU9yZyhmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGNsYWltcyA9IGF3YWl0IHRoaXMuZ2V0Q2xhaW1zKGZvcmNlUmVmcmVzaCk7XG4gICAgcmV0dXJuIChjbGFpbXNbJ2FjdGl2ZU9yZyddIGFzIHN0cmluZykgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGluZm9ybWFjacOzbiBkZSB0b2RhcyBsYXMgb3JnYW5pemFjaW9uZXMgZGVsIHVzdWFyaW8uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBTaSB0cnVlLCBmdWVyemEgbGEgcmVub3ZhY2nDs24gZGVsIHRva2VuXG4gICAqIEByZXR1cm5zIEFycmF5IGNvbiBpbmZvcm1hY2nDs24gZGUgY2FkYSBvcmdhbml6YWNpw7NuXG4gICAqL1xuICBhc3luYyBnZXRPcmdhbml6YXRpb25zKGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxPcmdhbml6YXRpb25JbmZvW10+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoZm9yY2VSZWZyZXNoKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWVtYmVyc2hpcHMpLm1hcCgoW2lkLCBpbmZvXSkgPT4gKHtcbiAgICAgIGlkLFxuICAgICAgcm9sZUlkOiBpbmZvLnJvbGVJZCxcbiAgICAgIHJvbGVOYW1lOiBpbmZvLnJvbGVOYW1lLFxuICAgICAgcGVybWlzc2lvbnM6IGluZm8ucGVybWlzc2lvbnMsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIElEcyBkZSB0b2RhcyBsYXMgb3JnYW5pemFjaW9uZXMgZGVsIHVzdWFyaW8uXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IGRlIElEcyBkZSBvcmdhbml6YWNpb25lc1xuICAgKi9cbiAgYXN5bmMgZ2V0T3JnYW5pemF0aW9uSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWVtYmVyc2hpcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcGVydGVuZWNlIGEgdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqXG4gICAqIEBwYXJhbSBvcmdJZCAtIElEIGRlIGxhIG9yZ2FuaXphY2nDs25cbiAgICogQHJldHVybnMgdHJ1ZSBzaSBlbCB1c3VhcmlvIGVzIG1pZW1icm9cbiAgICovXG4gIGFzeW5jIGlzTWVtYmVyT2Yob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcygpO1xuICAgIHJldHVybiBvcmdJZCBpbiBtZW1iZXJzaGlwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHJvbCBkZWwgdXN1YXJpbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIC0gSUQgZGUgbGEgb3JnYW5pemFjacOzblxuICAgKiBAcmV0dXJucyBJRCBkZWwgcm9sIG8gbnVsbCBzaSBubyBlcyBtaWVtYnJvXG4gICAqL1xuICBhc3luYyBnZXRSb2xlSW5Pcmcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5nZXRNZW1iZXJzaGlwcygpO1xuICAgIHJldHVybiBtZW1iZXJzaGlwc1tvcmdJZF0/LnJvbGVJZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbG9zIHBlcm1pc29zIGRlbCB1c3VhcmlvIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpw7NuXG4gICAqIEByZXR1cm5zIEFycmF5IGRlIHBlcm1pc29zIGVuIGZvcm1hdG8gJ3Jlc291cmNlOmFjdGlvbidcbiAgICovXG4gIGFzeW5jIGdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMuZ2V0TWVtYmVyc2hpcHMoKTtcbiAgICByZXR1cm4gbWVtYmVyc2hpcHNbb3JnSWRdPy5wZXJtaXNzaW9ucyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHBlcm1pc28gZXNwZWPDrWZpY28gZW4gdW5hIG9yZ2FuaXphY2nDs24uXG4gICAqIFNvcG9ydGEgd2lsZGNhcmRzOiAncmVzb3VyY2U6KicgeSAnKjoqJyAoc3VwZXIgYWRtaW4pLlxuICAgKlxuICAgKiBAcGFyYW0gb3JnSWQgLSBJRCBkZSBsYSBvcmdhbml6YWNpw7NuXG4gICAqIEBwYXJhbSByZXNvdXJjZSAtIFJlY3Vyc28gYSB2ZXJpZmljYXIgKGVqOiAndXNlcnMnLCAnZG9jdW1lbnRzJylcbiAgICogQHBhcmFtIGFjdGlvbiAtIEFjY2nDs24gYSB2ZXJpZmljYXIgKGVqOiAncmVhZCcsICd3cml0ZScsICdjcmVhdGUnLCAnZGVsZXRlJylcbiAgICogQHJldHVybnMgdHJ1ZSBzaSB0aWVuZSBlbCBwZXJtaXNvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVmVyaWZpY2FyIHBlcm1pc28gZXNwZWPDrWZpY29cbiAgICogY29uc3QgY2FuUmVhZFVzZXJzID0gYXdhaXQgZmlyZWJhc2VTZXJ2aWNlLmhhc1Blcm1pc3Npb24oJ29yZ19hYmMnLCAndXNlcnMnLCAncmVhZCcpO1xuICAgKlxuICAgKiAvLyBWZXJpZmljYXIgZW4gbGEgb3JnYW5pemFjacOzbiBhY3RpdmFcbiAgICogY29uc3Qgb3JnSWQgPSBhd2FpdCBmaXJlYmFzZVNlcnZpY2UuZ2V0QWN0aXZlT3JnKCk7XG4gICAqIGNvbnN0IGNhbkVkaXQgPSBhd2FpdCBmaXJlYmFzZVNlcnZpY2UuaGFzUGVybWlzc2lvbihvcmdJZCEsICdkb2N1bWVudHMnLCAnd3JpdGUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBoYXNQZXJtaXNzaW9uKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb24gPSBgJHtyZXNvdXJjZX06JHthY3Rpb259YDtcblxuICAgIHJldHVybiAoXG4gICAgICBwZXJtaXNzaW9ucy5pbmNsdWRlcyhwZXJtaXNzaW9uKSB8fFxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoYCR7cmVzb3VyY2V9OipgKSB8fFxuICAgICAgcGVybWlzc2lvbnMuaW5jbHVkZXMoJyo6KicpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIHB1ZWRlIGxlZXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ3JlYWQnKS5cbiAgICovXG4gIGFzeW5jIGNhblJlYWQob3JnSWQ6IHN0cmluZywgcmVzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Blcm1pc3Npb24ob3JnSWQsIHJlc291cmNlLCAncmVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgZXNjcmliaXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ3dyaXRlJykuXG4gICAqL1xuICBhc3luYyBjYW5Xcml0ZShvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUGVybWlzc2lvbihvcmdJZCwgcmVzb3VyY2UsICd3cml0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgY3JlYXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2NyZWF0ZScpLlxuICAgKi9cbiAgYXN5bmMgY2FuQ3JlYXRlKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2NyZWF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgZWxpbWluYXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogQXRham8gcGFyYSBoYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2RlbGV0ZScpLlxuICAgKi9cbiAgYXN5bmMgY2FuRGVsZXRlKG9yZ0lkOiBzdHJpbmcsIHJlc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5oYXNQZXJtaXNzaW9uKG9yZ0lkLCByZXNvdXJjZSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgYWRtaW5pc3RyYXIgdW4gcmVjdXJzbyBlbiB1bmEgb3JnYW5pemFjacOzbi5cbiAgICogRXF1aXZhbGUgYSB0ZW5lciAncmVzb3VyY2U6KicgbyAnKjoqJy5cbiAgICovXG4gIGFzeW5jIGNhbk1hbmFnZShvcmdJZDogc3RyaW5nLCByZXNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFBlcm1pc3Npb25zSW5Pcmcob3JnSWQpO1xuICAgIHJldHVybiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhgJHtyZXNvdXJjZX06KmApIHx8IHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIGVzIHN1cGVyIGFkbWluIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKiBTdXBlciBhZG1pbiB0aWVuZSBlbCBwZXJtaXNvICcqOionLlxuICAgKi9cbiAgYXN5bmMgaXNTdXBlckFkbWluKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UGVybWlzc2lvbnNJbk9yZyhvcmdJZCk7XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zLmluY2x1ZGVzKCcqOionKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBlbCB1c3VhcmlvIGVzIGFkbWluIGVuIHVuYSBvcmdhbml6YWNpw7NuLlxuICAgKi9cbiAgYXN5bmMgaXNBZG1pbkluT3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByb2xlID0gYXdhaXQgdGhpcy5nZXRSb2xlSW5Pcmcob3JnSWQpO1xuICAgIHJldHVybiByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdzdXBlcl9hZG1pbic7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVRJTElEQURFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXNwZXJhIGEgcXVlIGVsIGVzdGFkbyBkZSBhdXRlbnRpY2FjacOzbiBlc3TDqSBkZXRlcm1pbmFkby5cbiAgICogw5p0aWwgZW4gZ3VhcmRzIG8gYWwgaW5pY2lhbGl6YXIgbGEgYXBwLlxuICAgKlxuICAgKiBAcmV0dXJucyBVc3VhcmlvIGFjdHVhbCBvIG51bGxcbiAgICovXG4gIHdhaXRGb3JBdXRoKCk6IFByb21pc2U8RmlyZWJhc2VVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICBpZiAoIXN0YXRlLmlzTG9hZGluZykge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUudXNlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgY29uZmlndXJhY2nDs24gYWN0dWFsIGRlIEZpcmViYXNlLlxuICAgKi9cbiAgZ2V0Q29uZmlnKCk6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYSBzaSBsb3MgZW11bGFkb3JlcyBlc3TDoW4gaGFiaWxpdGFkb3MuXG4gICAqL1xuICBpc1VzaW5nRW11bGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmNvbmZpZy5lbXVsYXRvcj8uZmlyZXN0b3JlIHx8IHRoaXMuY29uZmlnLmVtdWxhdG9yPy5hdXRoIHx8IHRoaXMuY29uZmlnLmVtdWxhdG9yPy5zdG9yYWdlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNw4lUT0RPUyBQUklWQURPU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTWFwZWEgdW4gVXNlciBkZSBGaXJlYmFzZSBhIG51ZXN0cmEgaW50ZXJmYWNlIEZpcmViYXNlVXNlclxuICAgKi9cbiAgcHJpdmF0ZSBtYXBVc2VyKHVzZXI6IFVzZXIpOiBGaXJlYmFzZVVzZXIge1xuICAgIHJldHVybiB7XG4gICAgICB1aWQ6IHVzZXIudWlkLFxuICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICBkaXNwbGF5TmFtZTogdXNlci5kaXNwbGF5TmFtZSxcbiAgICAgIHBob3RvVVJMOiB1c2VyLnBob3RvVVJMLFxuICAgICAgZW1haWxWZXJpZmllZDogdXNlci5lbWFpbFZlcmlmaWVkLFxuICAgICAgaXNBbm9ueW1vdXM6IHVzZXIuaXNBbm9ueW1vdXMsXG4gICAgICBwcm92aWRlcklkOiB1c2VyLnByb3ZpZGVySWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252aWVydGUgZXJyb3JlcyBkZSBGaXJlYmFzZSBhIG1lbnNhamVzIGVuIGVzcGHDsW9sXG4gICAqL1xuICBwcml2YXRlIGdldEVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSAoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGU7XG5cbiAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICBjYXNlICdhdXRoL2ludmFsaWQtY3VzdG9tLXRva2VuJzpcbiAgICAgICAgICByZXR1cm4gJ1Rva2VuIGRlIGF1dGVudGljYWNpw7NuIGludsOhbGlkbyc7XG4gICAgICAgIGNhc2UgJ2F1dGgvY3VzdG9tLXRva2VuLW1pc21hdGNoJzpcbiAgICAgICAgICByZXR1cm4gJ0VsIHRva2VuIG5vIGNvcnJlc3BvbmRlIGEgZXN0ZSBwcm95ZWN0byc7XG4gICAgICAgIGNhc2UgJ2F1dGgvbmV0d29yay1yZXF1ZXN0LWZhaWxlZCc6XG4gICAgICAgICAgcmV0dXJuICdFcnJvciBkZSBjb25leGnDs24uIFZlcmlmaWNhIHR1IGNvbmV4acOzbiBhIGludGVybmV0JztcbiAgICAgICAgY2FzZSAnYXV0aC90b28tbWFueS1yZXF1ZXN0cyc6XG4gICAgICAgICAgcmV0dXJuICdEZW1hc2lhZG9zIGludGVudG9zLiBJbnRlbnRhIGRlIG51ZXZvIG3DoXMgdGFyZGUnO1xuICAgICAgICBjYXNlICdhdXRoL3VzZXItZGlzYWJsZWQnOlxuICAgICAgICAgIHJldHVybiAnRXN0YSBjdWVudGEgaGEgc2lkbyBkZXNoYWJpbGl0YWRhJztcbiAgICAgICAgY2FzZSAnYXV0aC91c2VyLW5vdC1mb3VuZCc6XG4gICAgICAgICAgcmV0dXJuICdVc3VhcmlvIG5vIGVuY29udHJhZG8nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBkZXNjb25vY2lkbyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdFcnJvciBkZSBhdXRlbnRpY2FjacOzbiBkZXNjb25vY2lkbyc7XG4gIH1cbn1cbiJdfQ==
@@ -21480,6 +21480,11 @@ class FirebaseService {
21480
21480
  async signInWithCustomToken(token) {
21481
21481
  try {
21482
21482
  const credential = await signInWithCustomToken(this.auth, token);
21483
+ // Forzar refresh del token para asegurar que los claims estén actualizados
21484
+ // Esto es necesario porque getIdTokenResult() cachea el resultado
21485
+ if (credential.user) {
21486
+ await credential.user.getIdToken(true);
21487
+ }
21483
21488
  return credential;
21484
21489
  }
21485
21490
  catch (error) {
@@ -21557,14 +21562,15 @@ class FirebaseService {
21557
21562
  * Obtiene los claims personalizados del token del usuario.
21558
21563
  * Los claims son establecidos por tu backend al crear el Custom Token.
21559
21564
  *
21565
+ * @param forceRefresh - Si true, fuerza la renovación del token para obtener claims actualizados
21560
21566
  * @returns Objeto con los claims o vacío si no hay usuario
21561
21567
  */
21562
- async getClaims() {
21568
+ async getClaims(forceRefresh = false) {
21563
21569
  const user = this.auth.currentUser;
21564
21570
  if (!user)
21565
21571
  return {};
21566
21572
  try {
21567
- const result = await user.getIdTokenResult();
21573
+ const result = await user.getIdTokenResult(forceRefresh);
21568
21574
  return result.claims;
21569
21575
  }
21570
21576
  catch {
@@ -21589,6 +21595,7 @@ class FirebaseService {
21589
21595
  * Obtiene las memberships (organizaciones) del usuario.
21590
21596
  * Cada membership contiene el rol y permisos en esa organización.
21591
21597
  *
21598
+ * @param forceRefresh - Si true, fuerza la renovación del token
21592
21599
  * @returns Mapa de orgId → MembershipInfo
21593
21600
  *
21594
21601
  * @example
@@ -21597,27 +21604,29 @@ class FirebaseService {
21597
21604
  * // { 'org_abc': { roleId: 'admin', roleName: 'admin', permissions: ['users:*', ...] } }
21598
21605
  * ```
21599
21606
  */
21600
- async getMemberships() {
21601
- const claims = await this.getClaims();
21607
+ async getMemberships(forceRefresh = false) {
21608
+ const claims = await this.getClaims(forceRefresh);
21602
21609
  return claims['memberships'] || {};
21603
21610
  }
21604
21611
  /**
21605
21612
  * Obtiene la organización activa del usuario.
21606
21613
  * La organización activa se establece al hacer login o al cambiar de org.
21607
21614
  *
21615
+ * @param forceRefresh - Si true, fuerza la renovación del token
21608
21616
  * @returns ID de la organización activa o null si no hay ninguna
21609
21617
  */
21610
- async getActiveOrg() {
21611
- const claims = await this.getClaims();
21618
+ async getActiveOrg(forceRefresh = false) {
21619
+ const claims = await this.getClaims(forceRefresh);
21612
21620
  return claims['activeOrg'] || null;
21613
21621
  }
21614
21622
  /**
21615
21623
  * Obtiene información de todas las organizaciones del usuario.
21616
21624
  *
21625
+ * @param forceRefresh - Si true, fuerza la renovación del token
21617
21626
  * @returns Array con información de cada organización
21618
21627
  */
21619
- async getOrganizations() {
21620
- const memberships = await this.getMemberships();
21628
+ async getOrganizations(forceRefresh = false) {
21629
+ const memberships = await this.getMemberships(forceRefresh);
21621
21630
  return Object.entries(memberships).map(([id, info]) => ({
21622
21631
  id,
21623
21632
  roleId: info.roleId,