@nauth-toolkit/client-angular 0.1.59 → 0.1.60

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.
@@ -295,6 +295,30 @@ export class AuthService {
295
295
  async confirmForgotPassword(identifier, code, newPassword) {
296
296
  return this.client.confirmForgotPassword(identifier, code, newPassword);
297
297
  }
298
+ /**
299
+ * Reset password with code or token (generic method for both admin and user-initiated resets).
300
+ *
301
+ * Accepts either:
302
+ * - code: Short numeric code from email/SMS (6-10 digits)
303
+ * - token: Long hex token from reset link (64 chars)
304
+ *
305
+ * @param identifier - User identifier (email, username, phone)
306
+ * @param codeOrToken - Verification code OR token from link
307
+ * @param newPassword - New password
308
+ * @returns Promise with success response
309
+ *
310
+ * @example
311
+ * ```typescript
312
+ * // With code from email
313
+ * await this.auth.resetPasswordWithCode('user@example.com', '123456', 'NewPass123!');
314
+ *
315
+ * // With token from link
316
+ * await this.auth.resetPasswordWithCode('user@example.com', '64-char-token', 'NewPass123!');
317
+ * ```
318
+ */
319
+ async resetPasswordWithCode(identifier, codeOrToken, newPassword) {
320
+ return this.client.resetPasswordWithCode(identifier, codeOrToken, newPassword);
321
+ }
298
322
  /**
299
323
  * Change user password (requires current password).
300
324
  *
@@ -789,4 +813,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
789
813
  type: Inject,
790
814
  args: [NAUTH_CLIENT_CONFIG]
791
815
  }] }, { type: i1.AngularHttpAdapter }] });
792
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFDTCxXQUFXLEdBbUJaLE1BQU0sdUJBQXVCLENBQUM7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBQ0wsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7OztPQUdHO0lBQ0gsWUFDK0IsTUFBeUIsRUFDdEQsV0FBK0I7UUFFL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkdBQTZHLENBQzlHLENBQUM7UUFDSixDQUFDO1FBRUQsSUFB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QUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7d0dBbnpCVSxXQUFXLGtCQWNaLG1CQUFtQjs0R0FkbEIsV0FBVzs7NEZBQVgsV0FBVztrQkFEdkIsVUFBVTs7MEJBZU4sTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5BVVRIX0NMSUVOVF9DT05GSUcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBBbmd1bGFySHR0cEFkYXB0ZXIgfSBmcm9tICcuL2h0dHAtYWRhcHRlcic7XG5pbXBvcnQge1xuICBOQXV0aENsaWVudCxcbiAgTkF1dGhDbGllbnRDb25maWcsXG4gIENoYWxsZW5nZVJlc3BvbnNlLFxuICBBdXRoUmVzcG9uc2UsXG4gIFRva2VuUmVzcG9uc2UsXG4gIEF1dGhVc2VyLFxuICBDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgRm9yZ290UGFzc3dvcmRSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIEdldENoYWxsZW5nZURhdGFSZXNwb25zZSxcbiAgR2V0U2V0dXBEYXRhUmVzcG9uc2UsXG4gIE1GQVN0YXR1cyxcbiAgTUZBRGV2aWNlLFxuICBBdXRoRXZlbnQsXG4gIFNvY2lhbFByb3ZpZGVyLFxuICBTb2NpYWxMb2dpbk9wdGlvbnMsXG4gIExpbmtlZEFjY291bnRzUmVzcG9uc2UsXG4gIFNvY2lhbFZlcmlmeVJlcXVlc3QsXG4gIEF1ZGl0SGlzdG9yeVJlc3BvbnNlLFxufSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBhcm91bmQgTkF1dGhDbGllbnQgdGhhdCBwcm92aWRlcyBwcm9taXNlLWJhc2VkIGF1dGggbWV0aG9kcyBhbmQgcmVhY3RpdmUgc3RhdGUuXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzOlxuICogLSBSZWFjdGl2ZSBzdGF0ZSAoY3VycmVudFVzZXIkLCBpc0F1dGhlbnRpY2F0ZWQkLCBjaGFsbGVuZ2UkKVxuICogLSBBbGwgY29yZSBhdXRoIG1ldGhvZHMgYXMgUHJvbWlzZXMgKGxvZ2luLCBzaWdudXAsIGxvZ291dCwgcmVmcmVzaClcbiAqIC0gUHJvZmlsZSBtYW5hZ2VtZW50IChnZXRQcm9maWxlLCB1cGRhdGVQcm9maWxlLCBjaGFuZ2VQYXNzd29yZClcbiAqIC0gQ2hhbGxlbmdlIGZsb3cgbWV0aG9kcyAocmVzcG9uZFRvQ2hhbGxlbmdlLCByZXNlbmRDb2RlKVxuICogLSBNRkEgbWFuYWdlbWVudCAoZ2V0TWZhU3RhdHVzLCBzZXR1cE1mYURldmljZSwgZXRjLilcbiAqIC0gU29jaWFsIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2NvdW50IGxpbmtpbmdcbiAqIC0gRGV2aWNlIHRydXN0IG1hbmFnZW1lbnRcbiAqIC0gQXVkaXQgaGlzdG9yeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFJlYWN0aXZlIHN0YXRlXG4gKiB0aGlzLmF1dGguY3VycmVudFVzZXIkLnN1YnNjcmliZSh1c2VyID0+IC4uLik7XG4gKiB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkJC5zdWJzY3JpYmUoaXNBdXRoID0+IC4uLik7XG4gKlxuICogLy8gQXV0aCBvcGVyYXRpb25zIHdpdGggYXN5bmMvYXdhaXRcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gKlxuICogLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nIH0pO1xuICpcbiAqIC8vIE1GQSBvcGVyYXRpb25zXG4gKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IE5BdXRoQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTkF1dGhDbGllbnRDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFVzZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFsbGVuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoRXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEF1dGhFdmVudD4oKTtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gSW5qZWN0ZWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gaHR0cEFkYXB0ZXIgLSBBbmd1bGFyIEhUVFAgYWRhcHRlciBmb3IgbWFraW5nIHJlcXVlc3RzIChyZXF1aXJlZClcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLFxuICApIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBodHRwQWRhcHRlciAoZnJvbSBjb25maWcgb3IgaW5qZWN0ZWQpXG4gICAgY29uc3QgYWRhcHRlciA9IGNvbmZpZy5odHRwQWRhcHRlciA/PyBodHRwQWRhcHRlcjtcbiAgICBpZiAoIWFkYXB0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0h0dHBBZGFwdGVyIG5vdCBmb3VuZC4gRWl0aGVyIHByb3ZpZGUgaHR0cEFkYXB0ZXIgaW4gTkFVVEhfQ0xJRU5UX0NPTkZJRyBvciBlbnN1cmUgSHR0cENsaWVudCBpcyBhdmFpbGFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBvbkF1dGhTdGF0ZUNoYW5nZTogKHVzZXIpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoQm9vbGVhbih1c2VyKSk7XG4gICAgICAgIGNvbmZpZy5vbkF1dGhTdGF0ZUNoYW5nZT8uKHVzZXIpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEZvcndhcmQgYWxsIGNsaWVudCBldmVudHMgdG8gT2JzZXJ2YWJsZSBzdHJlYW1cbiAgICB0aGlzLmNsaWVudC5vbignKicsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYWxsZW5nZSByb3V0ZXIgZm9yIG1hbnVhbCBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAqIFVzZWZ1bCBmb3IgZ3VhcmRzIHRoYXQgbmVlZCB0byBoYW5kbGUgZXJyb3JzIG9yIGJ1aWxkIGN1c3RvbSBVUkxzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDaGFsbGVuZ2VSb3V0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb3V0ZXIgPSB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAqIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hhbGxlbmdlUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29yZSBBdXRoIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2dpbiB3aXRoIGlkZW50aWZpZXIgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwgb3IgdXNlcm5hbWVcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gVXNlciBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBjaGFsbGVuZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5sb2dpbigndXNlckBleGFtcGxlLmNvbScsICdwYXNzd29yZCcpO1xuICAgKiBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgKiAgIC8vIEhhbmRsZSBjaGFsbGVuZ2VcbiAgICogfSBlbHNlIHtcbiAgICogICAvLyBMb2dpbiBzdWNjZXNzZnVsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbihpZGVudGlmaWVyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ2luKGlkZW50aWZpZXIsIHBhc3N3b3JkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ251cCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFNpZ251cCByZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgZmlyc3ROYW1lOiAnSm9obicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNpZ251cChwYXlsb2FkOiBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydzaWdudXAnXT5bMF0pOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnNpZ251cChwYXlsb2FkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBjdXJyZW50IHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2UgLSBJZiB0cnVlLCByZW1vdmVzIGRldmljZSB0cnVzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dvdXQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXQoZm9yZ2V0RGV2aWNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dChmb3JnZXREZXZpY2UpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAvLyBDbGVhciBDU1JGIHRva2VuIGNvb2tpZSBpZiBpbiBjb29raWVzIG1vZGVcbiAgICAvLyBOb3RlOiBCYWNrZW5kIHNob3VsZCBjbGVhciBodHRwT25seSBjb29raWVzLCBidXQgd2UgY2xlYXIgbm9uLWh0dHBPbmx5IG9uZXNcbiAgICBpZiAodGhpcy5jb25maWcudG9rZW5EZWxpdmVyeSA9PT0gJ2Nvb2tpZXMnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGNzcmZDb29raWVOYW1lID0gdGhpcy5jb25maWcuY3NyZj8uY29va2llTmFtZSA/PyAnbmF1dGhfY3NyZl90b2tlbic7XG4gICAgICAvLyBFeHRyYWN0IGRvbWFpbiBmcm9tIGJhc2VVcmwgaWYgcG9zc2libGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgZG9tYWluPSR7dXJsLmhvc3RuYW1lfWA7XG4gICAgICAgIC8vIEFsc28gdHJ5IHdpdGhvdXQgZG9tYWluIChmb3IgbG9jYWxob3N0KVxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGJhc2VVcmwgcGFyc2luZyBmYWlsc1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgYWxsIHNlc3Npb25zLlxuICAgKlxuICAgKiBSZXZva2VzIGFsbCBhY3RpdmUgc2Vzc2lvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgYWNyb3NzIGFsbCBkZXZpY2VzLlxuICAgKiBPcHRpb25hbGx5IHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyBpZiBmb3JnZXREZXZpY2VzIGlzIHRydWUuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2VzIC0gSWYgdHJ1ZSwgYWxzbyByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbnVtYmVyIG9mIHNlc3Npb25zIHJldm9rZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgubG9nb3V0QWxsKCk7XG4gICAqIGNvbnNvbGUubG9nKGBSZXZva2VkICR7cmVzdWx0LnJldm9rZWRDb3VudH0gc2Vzc2lvbnNgKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcz86IGJvb2xlYW4pOiBQcm9taXNlPHsgcmV2b2tlZENvdW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dEFsbChmb3JnZXREZXZpY2VzKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgdG9rZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5hdXRoLnJlZnJlc2goKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZWZyZXNoVG9rZW5zKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFjY291bnQgUmVjb3ZlcnkgKEZvcmdvdCBQYXNzd29yZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcGFzc3dvcmQgcmVzZXQgY29kZSAoZm9yZ290IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHBhc3N3b3JkIHJlc2V0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBwYXNzd29yZCByZXNldCBjb2RlIGFuZCBzZXQgYSBuZXcgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEBwYXJhbSBjb2RlIC0gT25lLXRpbWUgcmVzZXQgY29kZVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGNvbmZpcm1hdGlvbiByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jb25maXJtRm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY29uZmlybUZvcmdvdFBhc3N3b3JkKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jb25maXJtRm9yZ290UGFzc3dvcmQoaWRlbnRpZmllciwgY29kZSwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB1c2VyIHBhc3N3b3JkIChyZXF1aXJlcyBjdXJyZW50IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkIC0gQ3VycmVudCBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmQgKG11c3QgbWVldCByZXF1aXJlbWVudHMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBhc3N3b3JkIGlzIGNoYW5nZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQoJ29sZFBhc3N3b3JkMTIzJywgJ25ld1NlY3VyZVBhc3N3b3JkNDU2IScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHBhc3N3b3JkIGNoYW5nZSAobXVzdCBjaGFuZ2Ugb24gbmV4dCBsb2dpbikuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHJlcXVlc3QgaXMgc2VudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3RQYXNzd29yZENoYW5nZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9maWxlIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY3VycmVudCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmdldFByb2ZpbGUoKTtcbiAgICogY29uc29sZS5sb2coJ1VzZXIgcHJvZmlsZTonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UHJvZmlsZSgpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgZmV0Y2hlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQcm9maWxlIGZpZWxkcyB0byB1cGRhdGVcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiB1cGRhdGVkIHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScgfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcm9maWxlIHVwZGF0ZWQ6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJvZmlsZSh1cGRhdGVzOiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQudXBkYXRlUHJvZmlsZSh1cGRhdGVzKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIHVwZGF0ZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGFsbGVuZ2UgRmxvdyBNZXRob2RzIChFc3NlbnRpYWwgZm9yIGFueSBhdXRoIGZsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byBhIGNoYWxsZW5nZSAoVkVSSUZZX0VNQUlMLCBWRVJJRllfUEhPTkUsIE1GQV9SRVFVSVJFRCwgZXRjLikuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIENoYWxsZW5nZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIG5leHQgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgc2Vzc2lvbjogY2hhbGxlbmdlU2Vzc2lvbixcbiAgICogICB0eXBlOiAnVkVSSUZZX0VNQUlMJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlOiBDaGFsbGVuZ2VSZXNwb25zZSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBjaGFsbGVuZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGVzdGluYXRpb24gaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgICogY29uc29sZS5sb2coJ0NvZGUgc2VudCB0bzonLCByZXN1bHQuZGVzdGluYXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2VuZENvZGUoc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx7IGRlc3RpbmF0aW9uOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc2V0dXAgZGF0YSAoZm9yIE1GQV9TRVRVUF9SRVFVSVJFRCBjaGFsbGVuZ2UpLlxuICAgKlxuICAgKiBSZXR1cm5zIG1ldGhvZC1zcGVjaWZpYyBzZXR1cCBpbmZvcm1hdGlvbjpcbiAgICogLSBUT1RQOiB7IHNlY3JldCwgcXJDb2RlLCBtYW51YWxFbnRyeUtleSB9XG4gICAqIC0gU01TOiB7IG1hc2tlZFBob25lIH1cbiAgICogLSBFbWFpbDogeyBtYXNrZWRFbWFpbCB9XG4gICAqIC0gUGFzc2tleTogV2ViQXV0aG4gcmVnaXN0cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byBzZXQgdXBcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBzZXR1cCBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2V0dXBEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldFNldHVwRGF0YShzZXNzaW9uLCAndG90cCcpO1xuICAgKiBjb25zb2xlLmxvZygnUVIgQ29kZTonLCBzZXR1cERhdGEuc2V0dXBEYXRhLnFyQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0U2V0dXBEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldFNldHVwRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFNldHVwRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0U2V0dXBEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGNoYWxsZW5nZSBkYXRhIChmb3IgTUZBX1JFUVVJUkVEIGNoYWxsZW5nZSAtIGUuZy4sIHBhc3NrZXkgb3B0aW9ucykuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIENoYWxsZW5nZSBtZXRob2RcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBjaGFsbGVuZ2UgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNoYWxsZW5nZURhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCAncGFzc2tleScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZURhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldENoYWxsZW5nZURhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBjaGFsbGVuZ2UgKHdoZW4gbmF2aWdhdGluZyBhd2F5IGZyb20gY2hhbGxlbmdlIGZsb3cpLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjaGFsbGVuZ2UgaXMgY2xlYXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jbGVhckNoYWxsZW5nZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNsZWFyQ2hhbGxlbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsZWFyU3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNvY2lhbCBBdXRoZW50aWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIHNvY2lhbCBPQXV0aCBsb2dpbiBmbG93LlxuICAgKiBSZWRpcmVjdHMgdGhlIGJyb3dzZXIgdG8gYmFja2VuZCBgL2F1dGgvc29jaWFsLzpwcm92aWRlci9yZWRpcmVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciAoJ2dvb2dsZScsICdhcHBsZScsICdmYWNlYm9vaycpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcmVkaXJlY3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiByZWRpcmVjdCBzdGFydHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9naW5XaXRoU29jaWFsKCdnb29nbGUnLCB7IHJldHVyblRvOiAnL2F1dGgvY2FsbGJhY2snIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luV2l0aFNvY2lhbChwcm92aWRlcjogU29jaWFsUHJvdmlkZXIsIG9wdGlvbnM/OiBTb2NpYWxMb2dpbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubG9naW5XaXRoU29jaWFsKHByb3ZpZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNoYW5nZSBhbiBleGNoYW5nZVRva2VuIChmcm9tIHJlZGlyZWN0IGNhbGxiYWNrIFVSTCkgaW50byBhbiBBdXRoUmVzcG9uc2UuXG4gICAqXG4gICAqIFVzZWQgZm9yIGB0b2tlbkRlbGl2ZXJ5OiAnanNvbidgIG9yIGh5YnJpZCBmbG93cyB3aGVyZSB0aGUgYmFja2VuZCByZWRpcmVjdHMgYmFja1xuICAgKiB3aXRoIGBleGNoYW5nZVRva2VuYCBpbnN0ZWFkIG9mIHNldHRpbmcgY29va2llcy5cbiAgICpcbiAgICogQHBhcmFtIGV4Y2hhbmdlVG9rZW4gLSBPbmUtdGltZSBleGNoYW5nZSB0b2tlbiBmcm9tIHRoZSBjYWxsYmFjayBVUkxcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IG5hdGl2ZSBzb2NpYWwgdG9rZW4gKG1vYmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IC0gU29jaWFsIHZlcmlmaWNhdGlvbiByZXF1ZXN0IHdpdGggcHJvdmlkZXIgYW5kIHRva2VuXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU5hdGl2ZVNvY2lhbCh7XG4gICAqICAgcHJvdmlkZXI6ICdnb29nbGUnLFxuICAgKiAgIGlkVG9rZW46IG5hdGl2ZUlkVG9rZW4sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0OiBTb2NpYWxWZXJpZnlSZXF1ZXN0KTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC52ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlua2VkIHNvY2lhbCBhY2NvdW50cy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBsaW5rZWQgYWNjb3VudHMgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhY2NvdW50cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMaW5rZWRBY2NvdW50cygpO1xuICAgKiBjb25zb2xlLmxvZygnTGlua2VkIHByb3ZpZGVyczonLCBhY2NvdW50cy5wcm92aWRlcnMpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExpbmtlZEFjY291bnRzKCk6IFByb21pc2U8TGlua2VkQWNjb3VudHNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMaW5rZWRBY2NvdW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byBsaW5rXG4gICAqIEBwYXJhbSBjb2RlIC0gT0F1dGggYXV0aG9yaXphdGlvbiBjb2RlXG4gICAqIEBwYXJhbSBzdGF0ZSAtIE9BdXRoIHN0YXRlIHBhcmFtZXRlclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnLCBjb2RlLCBzdGF0ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZywgY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyLCBjb2RlLCBzdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVW5saW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gdW5saW5rXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgudW5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgTWFuYWdlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc3RhdHVzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIE1GQSBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdNRkEgZW5hYmxlZDonLCBzdGF0dXMuZW5hYmxlZCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TWZhU3RhdHVzKCk6IFByb21pc2U8TUZBU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldE1mYVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgZGV2aWNlcyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgZGV2aWNlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhRGV2aWNlcygpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYURldmljZXMoKTogUHJvbWlzZTxNRkFEZXZpY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFEZXZpY2VzKCkgYXMgUHJvbWlzZTxNRkFEZXZpY2VbXT47XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgTUZBIGRldmljZSAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5zZXR1cE1mYURldmljZSgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldHVwTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldHVwTWZhRGV2aWNlKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IE1GQSBzZXR1cCAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2RcbiAgICogQHBhcmFtIHNldHVwRGF0YSAtIFNldHVwIGRhdGEgZnJvbSBzZXR1cE1mYURldmljZVxuICAgKiBAcGFyYW0gZGV2aWNlTmFtZSAtIE9wdGlvbmFsIGRldmljZSBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TWZhU2V0dXAoJ3RvdHAnLCB7IGNvZGU6ICcxMjM0NTYnIH0sICdNeSBQaG9uZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU1mYVNldHVwKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNldHVwRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGV2aWNlTmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGRldmljZUlkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC52ZXJpZnlNZmFTZXR1cChtZXRob2QsIHNldHVwRGF0YSwgZGV2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIE1GQSBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlbW92ZU1mYURldmljZSgnc21zJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlbW92ZU1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmVmZXJyZWQgTUZBIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIERldmljZSBtZXRob2QgdG8gc2V0IGFzIHByZWZlcnJlZCAoJ3RvdHAnLCAnc21zJywgJ2VtYWlsJywgb3IgJ3Bhc3NrZXknKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnNldFByZWZlcnJlZE1mYU1ldGhvZCgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldFByZWZlcnJlZE1mYU1ldGhvZChtZXRob2Q6ICd0b3RwJyB8ICdzbXMnIHwgJ2VtYWlsJyB8ICdwYXNza2V5Jyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiYWNrdXAgY29kZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYmFja3VwIGNvZGVzIGFycmF5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICAgKiBjb25zb2xlLmxvZygnQmFja3VwIGNvZGVzOicsIGNvZGVzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBNRkEgZXhlbXB0aW9uIChhZG1pbi90ZXN0IHNjZW5hcmlvcykuXG4gICAqXG4gICAqIEBwYXJhbSBleGVtcHQgLSBXaGV0aGVyIHRvIGV4ZW1wdCB1c2VyIGZyb20gTUZBXG4gICAqIEBwYXJhbSByZWFzb24gLSBPcHRpb25hbCByZWFzb24gZm9yIGV4ZW1wdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBleGVtcHRpb24gaXMgc2V0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnNldE1mYUV4ZW1wdGlvbih0cnVlLCAnVGVzdCBhY2NvdW50Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2V0TWZhRXhlbXB0aW9uKGV4ZW1wdDogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldE1mYUV4ZW1wdGlvbihleGVtcHQsIHJlYXNvbik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERldmljZSBUcnVzdFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFRydXN0IGN1cnJlbnQgZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIHRva2VuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnRydXN0RGV2aWNlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdEZXZpY2UgdHJ1c3RlZDonLCByZXN1bHQuZGV2aWNlVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHRydXN0RGV2aWNlKCk6IFByb21pc2U8eyBkZXZpY2VUb2tlbjogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudHJ1c3REZXZpY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCBkZXZpY2UgaXMgdHJ1c3RlZC5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydXN0ZWQgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmlzVHJ1c3RlZERldmljZSgpO1xuICAgKiBpZiAocmVzdWx0LnRydXN0ZWQpIHtcbiAgICogICBjb25zb2xlLmxvZygnVGhpcyBkZXZpY2UgaXMgdHJ1c3RlZCcpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaXNUcnVzdGVkRGV2aWNlKCk6IFByb21pc2U8eyB0cnVzdGVkOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuaXNUcnVzdGVkRGV2aWNlKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEF1ZGl0IEhpc3RvcnlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnaW5hdGVkIGF1ZGl0IGhpc3RvcnkgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBRdWVyeSBwYXJhbWV0ZXJzIGZvciBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBhdWRpdCBoaXN0b3J5IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaGlzdG9yeSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRBdWRpdEhpc3Rvcnkoe1xuICAgKiAgIHBhZ2U6IDEsXG4gICAqICAgbGltaXQ6IDIwLFxuICAgKiAgIGV2ZW50VHlwZTogJ0xPR0lOX1NVQ0NFU1MnXG4gICAqIH0pO1xuICAgKiBjb25zb2xlLmxvZygnQXVkaXQgaGlzdG9yeTonLCBoaXN0b3J5KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBdWRpdEhpc3RvcnkocGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4pOiBQcm9taXNlPEF1ZGl0SGlzdG9yeVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEF1ZGl0SGlzdG9yeShwYXJhbXMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFc2NhcGUgSGF0Y2hcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgdW5kZXJseWluZyBOQXV0aENsaWVudCBmb3IgYWR2YW5jZWQgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBBbGwgY29yZSBmdW5jdGlvbmFsaXR5IGlzIG5vdyBleHBvc2VkIGRpcmVjdGx5IG9uIEF1dGhTZXJ2aWNlIGFzIFByb21pc2VzLlxuICAgKiBVc2UgdGhlIGRpcmVjdCBtZXRob2RzIG9uIEF1dGhTZXJ2aWNlIGluc3RlYWQgKGUuZy4sIGBhdXRoLmNoYW5nZVBhc3N3b3JkKClgIGluc3RlYWQgb2YgYGF1dGguZ2V0Q2xpZW50KCkuY2hhbmdlUGFzc3dvcmQoKWApLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkgYW5kIG1heSBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB1bmRlcmx5aW5nIE5BdXRoQ2xpZW50IGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVwcmVjYXRlZCAtIHVzZSBkaXJlY3QgbWV0aG9kcyBpbnN0ZWFkXG4gICAqIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRDbGllbnQoKS5nZXRNZmFTdGF0dXMoKTtcbiAgICpcbiAgICogLy8gUHJlZmVycmVkIC0gdXNlIGRpcmVjdCBtZXRob2RzXG4gICAqIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRNZmFTdGF0dXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDbGllbnQoKTogTkF1dGhDbGllbnQge1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW50ZXJuYWwgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYnkgaHlkcmF0aW5nIHN0YXRlIGZyb20gc3RvcmFnZS5cbiAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgb24gY29uc3RydWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICBhd2FpdCB0aGlzLmNsaWVudC5pbml0aWFsaXplKCk7XG5cbiAgICAvLyBIeWRyYXRlIGNoYWxsZW5nZSBzdGF0ZVxuICAgIGNvbnN0IHN0b3JlZENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFN0b3JlZENoYWxsZW5nZSgpO1xuICAgIGlmIChzdG9yZWRDaGFsbGVuZ2UpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHN0b3JlZENoYWxsZW5nZSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHN1YmplY3RzIGZyb20gY2xpZW50IHN0YXRlXG4gICAgY29uc3QgdXNlciA9IHRoaXMuY2xpZW50LmdldEN1cnJlbnRVc2VyKCk7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNoYWxsZW5nZSBzdGF0ZSBhZnRlciBhdXRoIHJlc3BvbnNlLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXNwb25zZTogQXV0aFJlc3BvbnNlKTogQXV0aFJlc3BvbnNlIHtcbiAgICBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQocmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG59XG4iXX0=
816
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFDTCxXQUFXLEdBb0JaLE1BQU0sdUJBQXVCLENBQUM7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBQ0wsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7OztPQUdHO0lBQ0gsWUFBeUMsTUFBeUIsRUFBRSxXQUErQjtRQUNqRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixxREFBcUQ7UUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FDYiw2R0FBNkcsQ0FDOUcsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJ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Q1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFzQjtRQUNqRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt3R0E3MEJVLFdBQVcsa0JBYUYsbUJBQW1COzRHQWI1QixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFjSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7XG4gIE5BdXRoQ2xpZW50LFxuICBOQXV0aENsaWVudENvbmZpZyxcbiAgQ2hhbGxlbmdlUmVzcG9uc2UsXG4gIEF1dGhSZXNwb25zZSxcbiAgVG9rZW5SZXNwb25zZSxcbiAgQXV0aFVzZXIsXG4gIENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBGb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIEdldENoYWxsZW5nZURhdGFSZXNwb25zZSxcbiAgR2V0U2V0dXBEYXRhUmVzcG9uc2UsXG4gIE1GQVN0YXR1cyxcbiAgTUZBRGV2aWNlLFxuICBBdXRoRXZlbnQsXG4gIFNvY2lhbFByb3ZpZGVyLFxuICBTb2NpYWxMb2dpbk9wdGlvbnMsXG4gIExpbmtlZEFjY291bnRzUmVzcG9uc2UsXG4gIFNvY2lhbFZlcmlmeVJlcXVlc3QsXG4gIEF1ZGl0SGlzdG9yeVJlc3BvbnNlLFxufSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBhcm91bmQgTkF1dGhDbGllbnQgdGhhdCBwcm92aWRlcyBwcm9taXNlLWJhc2VkIGF1dGggbWV0aG9kcyBhbmQgcmVhY3RpdmUgc3RhdGUuXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzOlxuICogLSBSZWFjdGl2ZSBzdGF0ZSAoY3VycmVudFVzZXIkLCBpc0F1dGhlbnRpY2F0ZWQkLCBjaGFsbGVuZ2UkKVxuICogLSBBbGwgY29yZSBhdXRoIG1ldGhvZHMgYXMgUHJvbWlzZXMgKGxvZ2luLCBzaWdudXAsIGxvZ291dCwgcmVmcmVzaClcbiAqIC0gUHJvZmlsZSBtYW5hZ2VtZW50IChnZXRQcm9maWxlLCB1cGRhdGVQcm9maWxlLCBjaGFuZ2VQYXNzd29yZClcbiAqIC0gQ2hhbGxlbmdlIGZsb3cgbWV0aG9kcyAocmVzcG9uZFRvQ2hhbGxlbmdlLCByZXNlbmRDb2RlKVxuICogLSBNRkEgbWFuYWdlbWVudCAoZ2V0TWZhU3RhdHVzLCBzZXR1cE1mYURldmljZSwgZXRjLilcbiAqIC0gU29jaWFsIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2NvdW50IGxpbmtpbmdcbiAqIC0gRGV2aWNlIHRydXN0IG1hbmFnZW1lbnRcbiAqIC0gQXVkaXQgaGlzdG9yeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFJlYWN0aXZlIHN0YXRlXG4gKiB0aGlzLmF1dGguY3VycmVudFVzZXIkLnN1YnNjcmliZSh1c2VyID0+IC4uLik7XG4gKiB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkJC5zdWJzY3JpYmUoaXNBdXRoID0+IC4uLik7XG4gKlxuICogLy8gQXV0aCBvcGVyYXRpb25zIHdpdGggYXN5bmMvYXdhaXRcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gKlxuICogLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nIH0pO1xuICpcbiAqIC8vIE1GQSBvcGVyYXRpb25zXG4gKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IE5BdXRoQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTkF1dGhDbGllbnRDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFVzZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFsbGVuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoRXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEF1dGhFdmVudD4oKTtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gSW5qZWN0ZWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gaHR0cEFkYXB0ZXIgLSBBbmd1bGFyIEhUVFAgYWRhcHRlciBmb3IgbWFraW5nIHJlcXVlc3RzIChyZXF1aXJlZClcbiAgICovXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZywgaHR0cEFkYXB0ZXI6IEFuZ3VsYXJIdHRwQWRhcHRlcikge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IG5ldyBOQXV0aENsaWVudCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBodHRwQWRhcHRlcjogYWRhcHRlcixcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcikgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChCb29sZWFuKHVzZXIpKTtcbiAgICAgICAgY29uZmlnLm9uQXV0aFN0YXRlQ2hhbmdlPy4odXNlcik7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gRm9yd2FyZCBhbGwgY2xpZW50IGV2ZW50cyB0byBPYnNlcnZhYmxlIHN0cmVhbVxuICAgIHRoaXMuY2xpZW50Lm9uKCcqJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmF1dGhFdmVudHNTdWJqZWN0Lm5leHQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIG9uIGNvbnN0cnVjdGlvbiAoaHlkcmF0ZSBmcm9tIHN0b3JhZ2UpXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlYWN0aXZlIFN0YXRlIE9ic2VydmFibGVzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3VycmVudCB1c2VyIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgY3VycmVudFVzZXIkKCk6IE9ic2VydmFibGU8QXV0aFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZWQgc3RhdGUgb2JzZXJ2YWJsZS5cbiAgICovXG4gIGdldCBpc0F1dGhlbnRpY2F0ZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBjaGFsbGVuZ2Ugb2JzZXJ2YWJsZSAoZm9yIHJlYWN0aXZlIGNoYWxsZW5nZSBuYXZpZ2F0aW9uKS5cbiAgICovXG4gIGdldCBjaGFsbGVuZ2UkKCk6IE9ic2VydmFibGU8QXV0aFJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgYWxsIGF1dGggbGlmZWN5Y2xlIGV2ZW50cyBmb3IgY3VzdG9tIGxvZ2ljLCBhbmFseXRpY3MsIG9yIFVJIHVwZGF0ZXMuXG4gICAqL1xuICBnZXQgYXV0aEV2ZW50cyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gdXNlciBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyAobG9naW4sIHNpZ251cCwgc29jaWFsIGF1dGgpLlxuICAgKi9cbiAgZ2V0IGF1dGhTdWNjZXNzJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOnN1Y2Nlc3MnKSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gZXJyb3IgZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgd2hlbiBhdXRoZW50aWNhdGlvbiBmYWlscyAobG9naW4gZXJyb3IsIE9BdXRoIGVycm9yLCBldGMuKS5cbiAgICovXG4gIGdldCBhdXRoRXJyb3IkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QucGlwZShmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2F1dGg6ZXJyb3InIHx8IGUudHlwZSA9PT0gJ29hdXRoOmVycm9yJykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTeW5jIFN0YXRlIEFjY2Vzc29ycyAoZm9yIGd1YXJkcywgdGVtcGxhdGVzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGF1dGhlbnRpY2F0ZWQgKHN5bmMsIHVzZXMgY2FjaGVkIHN0YXRlKS5cbiAgICovXG4gIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuaXNBdXRoZW50aWNhdGVkU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgKHN5bmMsIHVzZXMgY2FjaGVkIHN0YXRlKS5cbiAgICovXG4gIGdldEN1cnJlbnRVc2VyKCk6IEF1dGhVc2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgY2hhbGxlbmdlIChzeW5jKS5cbiAgICovXG4gIGdldEN1cnJlbnRDaGFsbGVuZ2UoKTogQXV0aFJlc3BvbnNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbGxlbmdlU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlIHJvdXRlciBmb3IgbWFudWFsIG5hdmlnYXRpb24gY29udHJvbC5cbiAgICogVXNlZnVsIGZvciBndWFyZHMgdGhhdCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgb3IgYnVpbGQgY3VzdG9tIFVSTHMuXG4gICAqXG4gICAqIEByZXR1cm5zIENoYWxsZW5nZVJvdXRlciBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJvdXRlciA9IHRoaXMuYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgICogYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9FcnJvcignb2F1dGgnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGFsbGVuZ2VSb3V0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb3JlIEF1dGggTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIExvZ2luIHdpdGggaWRlbnRpZmllciBhbmQgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCBvciB1c2VybmFtZVxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBVc2VyIHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJyk7XG4gICAqIGlmIChyZXNwb25zZS5jaGFsbGVuZ2VOYW1lKSB7XG4gICAqICAgLy8gSGFuZGxlIGNoYWxsZW5nZVxuICAgKiB9IGVsc2Uge1xuICAgKiAgIC8vIExvZ2luIHN1Y2Nlc3NmdWxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luKGlkZW50aWZpZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9naW4oaWRlbnRpZmllciwgcGFzc3dvcmQpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnVwIHdpdGggY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXlsb2FkIC0gU2lnbnVwIHJlcXVlc3QgcGF5bG9hZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBjaGFsbGVuZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5zaWdudXAoe1xuICAgKiAgIGVtYWlsOiAnbmV3QGV4YW1wbGUuY29tJyxcbiAgICogICBwYXNzd29yZDogJ1NlY3VyZVBhc3MxMjMhJyxcbiAgICogICBmaXJzdE5hbWU6ICdKb2huJyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2lnbnVwKHBheWxvYWQ6IFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ3NpZ251cCddPlswXSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2lnbnVwKHBheWxvYWQpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGN1cnJlbnQgc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcmdldERldmljZSAtIElmIHRydWUsIHJlbW92ZXMgZGV2aWNlIHRydXN0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ291dCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ291dChmb3JnZXREZXZpY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQubG9nb3V0KGZvcmdldERldmljZSk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgIC8vIENsZWFyIENTUkYgdG9rZW4gY29va2llIGlmIGluIGNvb2tpZXMgbW9kZVxuICAgIC8vIE5vdGU6IEJhY2tlbmQgc2hvdWxkIGNsZWFyIGh0dHBPbmx5IGNvb2tpZXMsIGJ1dCB3ZSBjbGVhciBub24taHR0cE9ubHkgb25lc1xuICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbkRlbGl2ZXJ5ID09PSAnY29va2llcycgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgY3NyZkNvb2tpZU5hbWUgPSB0aGlzLmNvbmZpZy5jc3JmPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICAgIC8vIEV4dHJhY3QgZG9tYWluIGZyb20gYmFzZVVybCBpZiBwb3NzaWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vOyBkb21haW49JHt1cmwuaG9zdG5hbWV9YDtcbiAgICAgICAgLy8gQWxzbyB0cnkgd2l0aG91dCBkb21haW4gKGZvciBsb2NhbGhvc3QpXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9L2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgYmFzZVVybCBwYXJzaW5nIGZhaWxzXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9L2A7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBhbGwgc2Vzc2lvbnMuXG4gICAqXG4gICAqIFJldm9rZXMgYWxsIGFjdGl2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgdXNlciBhY3Jvc3MgYWxsIGRldmljZXMuXG4gICAqIE9wdGlvbmFsbHkgcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIGlmIGZvcmdldERldmljZXMgaXMgdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIGZvcmdldERldmljZXMgLSBJZiB0cnVlLCBhbHNvIHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyAoZGVmYXVsdDogZmFsc2UpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBudW1iZXIgb2Ygc2Vzc2lvbnMgcmV2b2tlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5sb2dvdXRBbGwoKTtcbiAgICogY29uc29sZS5sb2coYFJldm9rZWQgJHtyZXN1bHQucmV2b2tlZENvdW50fSBzZXNzaW9uc2ApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ291dEFsbChmb3JnZXREZXZpY2VzPzogYm9vbGVhbik6IFByb21pc2U8eyByZXZva2VkQ291bnQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9nb3V0QWxsKGZvcmdldERldmljZXMpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRva2Vucy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG5ldyB0b2tlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmF1dGgucmVmcmVzaCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlZnJlc2hUb2tlbnMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWNjb3VudCBSZWNvdmVyeSAoRm9yZ290IFBhc3N3b3JkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBwYXNzd29yZCByZXNldCBjb2RlIChmb3Jnb3QgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggcGFzc3dvcmQgcmVzZXQgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguZm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBmb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybSBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgYW5kIHNldCBhIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHBhcmFtIGNvZGUgLSBPbmUtdGltZSByZXNldCBjb2RlXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggY29uZmlybWF0aW9uIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNvbmZpcm1Gb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjb25maXJtRm9yZ290UGFzc3dvcmQoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBuZXdQYXNzd29yZDogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNvbmZpcm1Gb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyLCBjb2RlLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcGFzc3dvcmQgd2l0aCBjb2RlIG9yIHRva2VuIChnZW5lcmljIG1ldGhvZCBmb3IgYm90aCBhZG1pbiBhbmQgdXNlci1pbml0aWF0ZWQgcmVzZXRzKS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXI6XG4gICAqIC0gY29kZTogU2hvcnQgbnVtZXJpYyBjb2RlIGZyb20gZW1haWwvU01TICg2LTEwIGRpZ2l0cylcbiAgICogLSB0b2tlbjogTG9uZyBoZXggdG9rZW4gZnJvbSByZXNldCBsaW5rICg2NCBjaGFycylcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGlkZW50aWZpZXIgKGVtYWlsLCB1c2VybmFtZSwgcGhvbmUpXG4gICAqIEBwYXJhbSBjb2RlT3JUb2tlbiAtIFZlcmlmaWNhdGlvbiBjb2RlIE9SIHRva2VuIGZyb20gbGlua1xuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBXaXRoIGNvZGUgZnJvbSBlbWFpbFxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzZXRQYXNzd29yZFdpdGhDb2RlKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKlxuICAgKiAvLyBXaXRoIHRva2VuIGZyb20gbGlua1xuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzZXRQYXNzd29yZFdpdGhDb2RlKCd1c2VyQGV4YW1wbGUuY29tJywgJzY0LWNoYXItdG9rZW4nLCAnTmV3UGFzczEyMyEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNldFBhc3N3b3JkV2l0aENvZGUoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGNvZGVPclRva2VuOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNldFBhc3N3b3JkV2l0aENvZGUoaWRlbnRpZmllciwgY29kZU9yVG9rZW4sIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdXNlciBwYXNzd29yZCAocmVxdWlyZXMgY3VycmVudCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCAtIEN1cnJlbnQgcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkIChtdXN0IG1lZXQgcmVxdWlyZW1lbnRzKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBwYXNzd29yZCBpcyBjaGFuZ2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKCdvbGRQYXNzd29yZDEyMycsICduZXdTZWN1cmVQYXNzd29yZDQ1NiEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBwYXNzd29yZCBjaGFuZ2UgKG11c3QgY2hhbmdlIG9uIG5leHQgbG9naW4pLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiByZXF1ZXN0IGlzIHNlbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVxdWVzdFBhc3N3b3JkQ2hhbmdlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdFBhc3N3b3JkQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJvZmlsZSBNYW5hZ2VtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGN1cnJlbnQgdXNlciBwcm9maWxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5nZXRQcm9maWxlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdVc2VyIHByb2ZpbGU6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0UHJvZmlsZSgpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFByb2ZpbGUoKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIGZldGNoZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUHJvZmlsZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgdXBkYXRlZCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnIH0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJvZmlsZSB1cGRhdGVkOicsIHVzZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVByb2ZpbGUodXBkYXRlczogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LnVwZGF0ZVByb2ZpbGUodXBkYXRlcyk7XG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvZmlsZSBpcyB1cGRhdGVkXG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2hhbGxlbmdlIEZsb3cgTWV0aG9kcyAoRXNzZW50aWFsIGZvciBhbnkgYXV0aCBmbG93KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgdG8gYSBjaGFsbGVuZ2UgKFZFUklGWV9FTUFJTCwgVkVSSUZZX1BIT05FLCBNRkFfUkVRVUlSRUQsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBDaGFsbGVuZ2UgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBuZXh0IGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNwb25kVG9DaGFsbGVuZ2Uoe1xuICAgKiAgIHNlc3Npb246IGNoYWxsZW5nZVNlc3Npb24sXG4gICAqICAgdHlwZTogJ1ZFUklGWV9FTUFJTCcsXG4gICAqICAgY29kZTogJzEyMzQ1NicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZTogQ2hhbGxlbmdlUmVzcG9uc2UpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgY2hhbGxlbmdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gICAqIGNvbnNvbGUubG9nKCdDb2RlIHNlbnQgdG86JywgcmVzdWx0LmRlc3RpbmF0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNlbmRDb2RlKHNlc3Npb246IHN0cmluZyk6IFByb21pc2U8eyBkZXN0aW5hdGlvbjogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHNldHVwIGRhdGEgKGZvciBNRkFfU0VUVVBfUkVRVUlSRUQgY2hhbGxlbmdlKS5cbiAgICpcbiAgICogUmV0dXJucyBtZXRob2Qtc3BlY2lmaWMgc2V0dXAgaW5mb3JtYXRpb246XG4gICAqIC0gVE9UUDogeyBzZWNyZXQsIHFyQ29kZSwgbWFudWFsRW50cnlLZXkgfVxuICAgKiAtIFNNUzogeyBtYXNrZWRQaG9uZSB9XG4gICAqIC0gRW1haWw6IHsgbWFza2VkRW1haWwgfVxuICAgKiAtIFBhc3NrZXk6IFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgJ3RvdHAnKTtcbiAgICogY29uc29sZS5sb2coJ1FSIENvZGU6Jywgc2V0dXBEYXRhLnNldHVwRGF0YS5xckNvZGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFNldHVwRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRTZXR1cERhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldFNldHVwRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBjaGFsbGVuZ2UgZGF0YSAoZm9yIE1GQV9SRVFVSVJFRCBjaGFsbGVuZ2UgLSBlLmcuLCBwYXNza2V5IG9wdGlvbnMpLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBDaGFsbGVuZ2UgbWV0aG9kXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY2hhbGxlbmdlIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjaGFsbGVuZ2VEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgJ3Bhc3NrZXknKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldENoYWxsZW5nZURhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRDaGFsbGVuZ2VEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBzdG9yZWQgY2hhbGxlbmdlICh3aGVuIG5hdmlnYXRpbmcgYXdheSBmcm9tIGNoYWxsZW5nZSBmbG93KS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2hhbGxlbmdlIGlzIGNsZWFyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2xlYXJDaGFsbGVuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjbGVhckNoYWxsZW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jbGVhclN0b3JlZENoYWxsZW5nZSgpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTb2NpYWwgQXV0aGVudGljYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBzb2NpYWwgT0F1dGggbG9naW4gZmxvdy5cbiAgICogUmVkaXJlY3RzIHRoZSBicm93c2VyIHRvIGJhY2tlbmQgYC9hdXRoL3NvY2lhbC86cHJvdmlkZXIvcmVkaXJlY3RgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgKCdnb29nbGUnLCAnYXBwbGUnLCAnZmFjZWJvb2snKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHJlZGlyZWN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcmVkaXJlY3Qgc3RhcnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ2luV2l0aFNvY2lhbCgnZ29vZ2xlJywgeyByZXR1cm5UbzogJy9hdXRoL2NhbGxiYWNrJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbldpdGhTb2NpYWwocHJvdmlkZXI6IFNvY2lhbFByb3ZpZGVyLCBvcHRpb25zPzogU29jaWFsTG9naW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxvZ2luV2l0aFNvY2lhbChwcm92aWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhjaGFuZ2UgYW4gZXhjaGFuZ2VUb2tlbiAoZnJvbSByZWRpcmVjdCBjYWxsYmFjayBVUkwpIGludG8gYW4gQXV0aFJlc3BvbnNlLlxuICAgKlxuICAgKiBVc2VkIGZvciBgdG9rZW5EZWxpdmVyeTogJ2pzb24nYCBvciBoeWJyaWQgZmxvd3Mgd2hlcmUgdGhlIGJhY2tlbmQgcmVkaXJlY3RzIGJhY2tcbiAgICogd2l0aCBgZXhjaGFuZ2VUb2tlbmAgaW5zdGVhZCBvZiBzZXR0aW5nIGNvb2tpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBleGNoYW5nZVRva2VuIC0gT25lLXRpbWUgZXhjaGFuZ2UgdG9rZW4gZnJvbSB0aGUgY2FsbGJhY2sgVVJMXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW46IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBuYXRpdmUgc29jaWFsIHRva2VuIChtb2JpbGUpLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFNvY2lhbCB2ZXJpZmljYXRpb24gcmVxdWVzdCB3aXRoIHByb3ZpZGVyIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlOYXRpdmVTb2NpYWwoe1xuICAgKiAgIHByb3ZpZGVyOiAnZ29vZ2xlJyxcbiAgICogICBpZFRva2VuOiBuYXRpdmVJZFRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdDogU29jaWFsVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQudmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3QpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpbmtlZCBzb2NpYWwgYWNjb3VudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgbGlua2VkIGFjY291bnRzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgICogY29uc29sZS5sb2coJ0xpbmtlZCBwcm92aWRlcnM6JywgYWNjb3VudHMucHJvdmlkZXJzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMaW5rZWRBY2NvdW50cygpOiBQcm9taXNlPExpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gbGlua1xuICAgKiBAcGFyYW0gY29kZSAtIE9BdXRoIGF1dGhvcml6YXRpb24gY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgLSBPQXV0aCBzdGF0ZSBwYXJhbWV0ZXJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJywgY29kZSwgc3RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5saW5rU29jaWFsQWNjb3VudChwcm92aWRlciwgY29kZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIHVubGlua1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnVubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC51bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBjb25zb2xlLmxvZygnTUZBIGVuYWJsZWQ6Jywgc3RhdHVzLmVuYWJsZWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYVN0YXR1cygpOiBQcm9taXNlPE1GQVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFTdGF0dXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGRldmljZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIGRldmljZXMgYXJyYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFEZXZpY2VzKCk6IFByb21pc2U8TUZBRGV2aWNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpIGFzIFByb21pc2U8TUZBRGV2aWNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXR1cE1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBTZXR1cCBkYXRhIGZyb20gc2V0dXBNZmFEZXZpY2VcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywgeyBjb2RlOiAnMTIzNDU2JyB9LCAnTXkgUGhvbmUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBNRkEgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byByZW1vdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2UoJ3NtcycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2UobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kOiAndG90cCcgfCAnc21zJyB8ICdlbWFpbCcgfCAncGFzc2tleScpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhTWV0aG9kKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgTUZBIGV4ZW1wdGlvbiAoYWRtaW4vdGVzdCBzY2VuYXJpb3MpLlxuICAgKlxuICAgKiBAcGFyYW0gZXhlbXB0IC0gV2hldGhlciB0byBleGVtcHQgdXNlciBmcm9tIE1GQVxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgcmVhc29uIGZvciBleGVtcHRpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlbXB0aW9uIGlzIHNldFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRNZmFFeGVtcHRpb24odHJ1ZSwgJ1Rlc3QgYWNjb3VudCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldE1mYUV4ZW1wdGlvbihleGVtcHQ6IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRNZmFFeGVtcHRpb24oZXhlbXB0LCByZWFzb24pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGU6ICdMT0dJTl9TVUNDRVNTJ1xuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+KTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgQWxsIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBub3cgZXhwb3NlZCBkaXJlY3RseSBvbiBBdXRoU2VydmljZSBhcyBQcm9taXNlcy5cbiAgICogVXNlIHRoZSBkaXJlY3QgbWV0aG9kcyBvbiBBdXRoU2VydmljZSBpbnN0ZWFkIChlLmcuLCBgYXV0aC5jaGFuZ2VQYXNzd29yZCgpYCBpbnN0ZWFkIG9mIGBhdXRoLmdldENsaWVudCgpLmNoYW5nZVBhc3N3b3JkKClgKS5cbiAgICogVGhpcyBtZXRob2QgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5IGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuIl19
@@ -2,4 +2,4 @@
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
4
  export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF1dGgtdG9vbGtpdC1jbGllbnQtYW5ndWxhci1zdGFuZGFsb25lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3RhbmRhbG9uZS9uYXV0aC10b29sa2l0LWNsaWVudC1hbmd1bGFyLXN0YW5kYWxvbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF1dGgtdG9vbGtpdC1jbGllbnQtYW5ndWxhci1zdGFuZGFsb25lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0YW5kYWxvbmUvbmF1dGgtdG9vbGtpdC1jbGllbnQtYW5ndWxhci1zdGFuZGFsb25lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -3,14 +3,10 @@
3
3
  *
4
4
  * This entry point is for standalone component-based Angular apps (Angular 14+).
5
5
  * For NgModule apps, use: @nauth-toolkit/client-angular
6
+ *
7
+ * NOTE: This simply re-exports the main entry point since both share the same code for now.
8
+ * The split allows future additions like `provideNAuth()` for standalone apps.
6
9
  */
7
- // Re-export core client types and utilities
8
- export * from '@nauth-toolkit/client';
9
- // Export standalone-specific components (functional)
10
- export * from './tokens';
11
- export * from './auth.service';
12
- export * from './http-adapter';
13
- export * from './auth.interceptor';
14
- export * from './auth.guard';
15
- export * from './social-redirect-callback.guard';
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3N0YW5kYWxvbmUvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILDRDQUE0QztBQUM1QyxjQUFjLHVCQUF1QixDQUFDO0FBRXRDLHFEQUFxRDtBQUNyRCxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGtDQUFrQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQG5hdXRoLXRvb2xraXQvY2xpZW50LWFuZ3VsYXIvc3RhbmRhbG9uZVxuICogXG4gKiBUaGlzIGVudHJ5IHBvaW50IGlzIGZvciBzdGFuZGFsb25lIGNvbXBvbmVudC1iYXNlZCBBbmd1bGFyIGFwcHMgKEFuZ3VsYXIgMTQrKS5cbiAqIEZvciBOZ01vZHVsZSBhcHBzLCB1c2U6IEBuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyXG4gKi9cblxuLy8gUmUtZXhwb3J0IGNvcmUgY2xpZW50IHR5cGVzIGFuZCB1dGlsaXRpZXNcbmV4cG9ydCAqIGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8vIEV4cG9ydCBzdGFuZGFsb25lLXNwZWNpZmljIGNvbXBvbmVudHMgKGZ1bmN0aW9uYWwpXG5leHBvcnQgKiBmcm9tICcuL3Rva2Vucyc7XG5leHBvcnQgKiBmcm9tICcuL2F1dGguc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2h0dHAtYWRhcHRlcic7XG5leHBvcnQgKiBmcm9tICcuL2F1dGguaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hdXRoLmd1YXJkJztcbmV4cG9ydCAqIGZyb20gJy4vc29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkJztcblxuIl19
10
+ // Re-export everything from the main entry point
11
+ export * from '@nauth-toolkit/client-angular';
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdGFuZGFsb25lL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxpREFBaUQ7QUFDakQsY0FBYywrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIEBuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyL3N0YW5kYWxvbmVcbiAqXG4gKiBUaGlzIGVudHJ5IHBvaW50IGlzIGZvciBzdGFuZGFsb25lIGNvbXBvbmVudC1iYXNlZCBBbmd1bGFyIGFwcHMgKEFuZ3VsYXIgMTQrKS5cbiAqIEZvciBOZ01vZHVsZSBhcHBzLCB1c2U6IEBuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyXG4gKlxuICogTk9URTogVGhpcyBzaW1wbHkgcmUtZXhwb3J0cyB0aGUgbWFpbiBlbnRyeSBwb2ludCBzaW5jZSBib3RoIHNoYXJlIHRoZSBzYW1lIGNvZGUgZm9yIG5vdy5cbiAqIFRoZSBzcGxpdCBhbGxvd3MgZnV0dXJlIGFkZGl0aW9ucyBsaWtlIGBwcm92aWRlTkF1dGgoKWAgZm9yIHN0YW5kYWxvbmUgYXBwcy5cbiAqL1xuXG4vLyBSZS1leHBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBtYWluIGVudHJ5IHBvaW50XG5leHBvcnQgKiBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQtYW5ndWxhcic7XG4iXX0=