ng-easycommerce-v18 0.6.28 → 0.6.30-refresh-token.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,9 @@
1
+ # Version 0.6.30-refresh-token.1
2
+ - Se modifica el auth para funcionalidad de refresh token.
3
+ # Version 0.6.30
4
+ - Modificacion `auth.interceptor.ts` para que si da error el endpoint de login desde el modal de inicio de sesion no haga redirección.
5
+ # Version 0.6.29
6
+ - Se agrega funcionalidad para poder filtrar por multiple atributos.
1
7
  # Version 0.6.28
2
8
  - Checkout single: al finalizar pagos aprobados o autocompletados por terceros como `app-decidir-ec`, la compra se completa automáticamente y no queda trabada esperando el botón final.
3
9
  - Checkout single: cuando `shipping-options` vuelve vacío o mal formado, se evita el error técnico y se muestra el mensaje traducible `no-shipping-options-help`.
@@ -90,20 +90,35 @@ export class FiltersEcComponent {
90
90
  return;
91
91
  }
92
92
  if (filter.type() === 'attributes') {
93
- // El backend espera que le mandemos el "code" del atributo en el query param
94
- const code = selected.code || selected.value || null;
95
- // Marcar el elemento como seleccionado internamente
96
- this._filtersService.setFilterSelected(filter, selected);
97
- // Actualizamos la URL manteniendo la ruta, pero agregando `attributeCodes`
98
- // Ejemplo de resultado:
99
- // /collection/categories/camas-elasticas?attributeCodes=ABC123&...
100
- //
101
- // También reseteamos la página a null para que vuelva a la primera página
102
- // cuando se aplica un nuevo filtro.
93
+ // Locate the parent group that owns the clicked child
94
+ const parentGroup = filter.data.find((parent) => (parent.children || []).includes(selected));
95
+ const wasSelected = selected.selected;
96
+ // Single selection within the same group: clear all siblings first
97
+ if (parentGroup) {
98
+ (parentGroup.children || []).forEach((child) => {
99
+ child.selected = false;
100
+ });
101
+ }
102
+ // Toggle: select if it wasn't selected, deselect if it was
103
+ selected.selected = !wasSelected;
104
+ // Collect one selected code per group (multi-group support)
105
+ const selectedCodes = [];
106
+ filter.data.forEach((parent) => {
107
+ (parent.children || []).forEach((child) => {
108
+ if (child.selected) {
109
+ const code = child.code || child.value;
110
+ if (code)
111
+ selectedCodes.push(code);
112
+ }
113
+ });
114
+ });
115
+ const attributeCodesParam = selectedCodes.length > 0
116
+ ? selectedCodes.join('<and>')
117
+ : null;
103
118
  void this.router.navigate([], {
104
119
  relativeTo: this.route,
105
120
  queryParams: {
106
- attributeCodes: code,
121
+ attributeCodes: attributeCodesParam,
107
122
  page: null
108
123
  },
109
124
  queryParamsHandling: 'merge'
@@ -133,6 +148,9 @@ export class FiltersEcComponent {
133
148
  }
134
149
  }
135
150
  uniqueSelection(filter, filterChild) {
151
+ // For attributes: no-op — single-per-group deselection is handled inside setSelected.
152
+ if (filter.type?.() === 'attributes')
153
+ return;
136
154
  // Buscar si hay un filtro de tipo PriceRangeFilter en la lista de filtros
137
155
  const priceRangeFilter = this.filters.find(f => f instanceof PriceRangeFilter);
138
156
  if (priceRangeFilter) {
@@ -260,4 +278,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
260
278
  }], ctorParameters: () => [], propDecorators: { setSelect: [{
261
279
  type: Input
262
280
  }] } });
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9maWx0ZXJzLWVjL2ZpbHRlcnMtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvZmlsdGVycy1lYy9maWx0ZXJzLWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBeUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBVW5FLE1BQU0sT0FBTyxrQkFBa0I7SUFFbkIsWUFBWSxHQUFnQixNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsZUFBZSxHQUFtQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekQsZ0JBQWdCLEdBQW9CLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1RCxVQUFVLEdBQXlCLE1BQU0sQ0FBQyxvQkFB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QyxDQUFDO0lBQy9DLENBQUM7SUFFRCxtQ0FBbUM7SUFDNUIsa0JBQWtCLENBQUMsSUFBb0I7UUFDMUMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsNEJBQTRCO0lBQ3JCLGtCQUFrQixDQUFDLElBQW9CO1FBQzFDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHlCQUF5QjtJQUNqQixpQkFBaUIsQ0FBQyxPQUF3QixFQUFFO1FBQ2hELE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQ2QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBUyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUM7YUFDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNQLEdBQUcsQ0FBQztZQUNKLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7U0FDckQsQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO3dHQW5TUSxrQkFBa0I7NEZBQWxCLGtCQUFrQiw4R0NsQi9CLDhCQUNBOzs0RkRpQmEsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNJLGdCQUFnQixjQUNkLElBQUksV0FDUCxFQUFFO3dEQW9CRixTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbHRlcnNTZXJ2aWNlLCBBdXRoU2VydmljZSwgUHJpY2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uL2VjLXNlcnZpY2VzJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcyc7XHJcbmltcG9ydCB7IEZpbHRlckVsZW1lbnQsIEZpbHRlclR5cGUsIFBhZ2luYXRpb25TZXR0aW5ncyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9lYy1zZXJ2aWNlcy9wcm9kdWN0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUHJpY2VSYW5nZUZpbHRlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZmlsdGVycy9wcmljZV9yYW5nZS1maWx0ZXInO1xyXG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uLy4uL2VjLXNlcnZpY2VzL2NoYW5uZWwuc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1maWx0ZXJzLWVjJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXJzLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9maWx0ZXJzLWVjLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVyc0VjQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9hdXRoU2VydmljZTogQXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlID0gaW5qZWN0KEZpbHRlcnNTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX3Byb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlID0gaW5qZWN0KFByb2R1Y3RzU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9jb25zdGFudHM6IENvcmVDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KENvcmVDb25zdGFudHNTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGZpbHRlciQgPSB0aGlzLl9maWx0ZXJzU2VydmljZS5maWx0ZXJzJDtcclxuICAgIHB1YmxpYyBzaG93UHJpY2VzT25seVRvTG9nZ2VkVXNlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xyXG4gICAgcHVibGljIGlzQXV0aGVudGljYXRlZCQgPSB0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKTtcclxuICAgIHB1YmxpYyBoaWRlUHJpY2VzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpY2VWaXNpYmlsaXR5ID0gaW5qZWN0KFByaWNlVmlzaWJpbGl0eVNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xyXG5cclxuICAgIEBJbnB1dCgpIHNldFNlbGVjdDogYW55O1xyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9maWx0ZXJzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUoKGZpbHRlcnM6IEZpbHRlcltdKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pbmplY3Rvci5nZXQoQ2hhbm5lbFNlcnZpY2UpLmNoYW5uZWwkLnN1YnNjcmliZShjaGFubmVsID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93UHJpY2VzT25seVRvTG9nZ2VkVXNlcnMgPSAhIWNoYW5uZWwuc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGVQcmljZXMgPSAhIWNoYW5uZWwuaGlkZVByaWNlcztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qKiAxKSBQYXJhIGN1YW5kbyBtZSBwaWRlbiAncHJpY2VfcmFuZ2UnLCBkZXZ1ZWx2byBQcmljZVJhbmdlRmlsdGVyICovXHJcbiAgICBwdWJsaWMgZ2V0U3BlY2lmaWNGaWx0ZXIodHlwZTogJ3ByaWNlX3JhbmdlJyk6IFByaWNlUmFuZ2VGaWx0ZXIgfCBudWxsO1xyXG5cclxuICAgIC8qKiAyKSBQYXJhIGN1YWxxdWllciBvdHJvIEZpbHRlclR5cGUsIGRldnVlbHZvIEZpbHRlciAqL1xyXG4gICAgcHVibGljIGdldFNwZWNpZmljRmlsdGVyKHR5cGU6IEZpbHRlclR5cGUpOiBGaWx0ZXIgfCBudWxsO1xyXG4gICAgcHVibGljIGdldFNwZWNpZmljRmlsdGVyKHR5cGU6IEZpbHRlclR5cGUpOiBGaWx0ZXIgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlcnMuZmluZChmID0+IGYudHlwZSgpID09PSB0eXBlKTtcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3ByaWNlX3JhbmdlJyAmJiBmaWx0ZXIgJiYgIShmaWx0ZXIgaW5zdGFuY2VvZiBGaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEV4cGVjdGVkIGEgRmlsdGVyIGluc3RhbmNlIGJ1dCBnb3RgLCBmaWx0ZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmlsdGVyIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZFNob3dQcmljZVJhbmdlKHByaWNlUmFuZ2U6IFByaWNlUmFuZ2VGaWx0ZXIgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnByaWNlVmlzaWJpbGl0eS5jYW5TaG93UHJpY2VzKCkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoIXByaWNlUmFuZ2U/LmlzTG9hZGVkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHByaWNlUmFuZ2UuaGFzVmFsaWRSYW5nZTtcclxuICAgIH1cclxuXHJcbiAgICAvKk9idGllbmUgZWwgZmlsdHJvIGVsZWdpZG8gZW4gZWwgc2VsZWN0LCBsbyBwYXNhIGFsIHNldFNlbGVjdFxyXG4gICAgcGFyYSBxdWUgc2UgbWFycXVlIHNlbGVjY2lvbmFkbyovXHJcbiAgICBvblNlbGVjdChldmVudDogYW55LCBmaWx0ZXI6IEZpbHRlckVsZW1lbnRbXSB8IG51bGwpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhmaWx0ZXIpXHJcbiAgICAgICAgLyogIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gZmlsdGVyXHJcbiAgICAgICAgICAgICAuZmxhdE1hcChjYXRlZ29yeSA9PiBjYXRlZ29yeS5jaGlsZHJlbilcclxuICAgICAgICAgICAgIC5maWx0ZXIob3B0aW9uID0+IG9wdGlvbj8uY29kZSA9PT0gZXZlbnQudGFyZ2V0LnZhbHVlKVxyXG4gICAgICAgICAgICAgLnBvcCgpXHJcbiAgICAgICAgIHNlbGVjdGVkT3B0aW9uICYmIHRoaXMuX2ZpbHRlcnNTZXJ2aWNlLnNldEZpbHRlclNlbGVjdGVkKHRoaXMuZmlsdGVyc1swXSwgc2VsZWN0ZWRPcHRpb24pICovXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW5lamEgZWwgY2xpY2sgc29icmUgdW4gZWxlbWVudG8gZGUgZmlsdHJvIChjYXRlZ29yw61hLCBhdHJpYnV0bywgZXRjLikuXHJcbiAgICAgKlxyXG4gICAgICogLSBQYXJhIGNhdGVnb3LDrWFzOiBuYXZlZ2EgYSBsYSBVUkwgZGUgbGEgY2F0ZWdvcsOtYS5cclxuICAgICAqIC0gUGFyYSBhdHJpYnV0b3M6IGFjdHVhbGl6YSBsYSBxdWVyeSBzdHJpbmcgZGUgbGEgVVJMIGNvbiBgYXR0cmlidXRlQ29kZXNgLlxyXG4gICAgICogLSBQYXJhIG90cm9zIGZpbHRyb3M6IGRlbGVnYSBlbiBGaWx0ZXJzU2VydmljZSBwYXJhIG1hcmNhciBzZWxlY2Npb25hZG8uXHJcbiAgICAgKlxyXG4gICAgICogTGEgaWRlYSBlcyBxdWUgKipsYSBVUkwgc2llbXByZSByZXByZXNlbnRlIGxvcyBmaWx0cm9zIGFwbGljYWRvcyoqLFxyXG4gICAgICogZGUgbW9kbyBxdWU6XHJcbiAgICAgKiAgIC0gYWwgaGFjZXIgRjUgbm8gc2UgcGllcmRhbiBsb3MgZmlsdHJvcyxcclxuICAgICAqICAgLSBsb3MgbGlua3Mgc2VhbiBjb21wYXJ0aWJsZXMgKGRlZXAgbGlua2luZykuXHJcbiAgICAgKi9cclxuICAgIHNldFNlbGVjdGVkKGZpbHRlcjogRmlsdGVyIHwgbnVsbCwgc2VsZWN0ZWQ6IEZpbHRlckVsZW1lbnQgfCBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgIXNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2kgZWwgZWxlbWVudG8gZXN0w6EgbWFyY2FkbyBjb21vIG5vIHZpc2libGUsIG5vIGhhY2Vtb3MgbmFkYVxyXG4gICAgICAgIGlmICgoc2VsZWN0ZWQgYXMgYW55KS5pc1Zpc2libGUgPT09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgKGZpbHRlciBhcyBhbnkpLnNldFNlbGVjdGVkICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIudHlwZSgpID09PSAnY2F0ZWdvcmllcycpIHtcclxuICAgICAgICAgICAgICAgIC8vIFBhcmEgY2F0ZWdvcsOtYXMgdXNhbW9zIG5hdmVnYWNpw7NuIHBvciBwYXRoIChlajogL2NvbGxlY3Rpb24vY2F0ZWdvcmllcy9jYW1hcy1lbGFzdGljYXMpXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3NlbGVjdGVkLnBhdGhdKS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0NvbGxlY3Rpb25SZXN1bHRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZpbHRlci50eXBlKCkgPT09ICdhdHRyaWJ1dGVzJykge1xyXG4gICAgICAgICAgICAgICAgLy8gRWwgYmFja2VuZCBlc3BlcmEgcXVlIGxlIG1hbmRlbW9zIGVsIFwiY29kZVwiIGRlbCBhdHJpYnV0byBlbiBlbCBxdWVyeSBwYXJhbVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IChzZWxlY3RlZCBhcyBhbnkpLmNvZGUgfHwgKHNlbGVjdGVkIGFzIGFueSkudmFsdWUgfHwgbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBNYXJjYXIgZWwgZWxlbWVudG8gY29tbyBzZWxlY2Npb25hZG8gaW50ZXJuYW1lbnRlXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzU2VydmljZS5zZXRGaWx0ZXJTZWxlY3RlZChmaWx0ZXIsIHNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBBY3R1YWxpemFtb3MgbGEgVVJMIG1hbnRlbmllbmRvIGxhIHJ1dGEsIHBlcm8gYWdyZWdhbmRvIGBhdHRyaWJ1dGVDb2Rlc2BcclxuICAgICAgICAgICAgICAgIC8vIEVqZW1wbG8gZGUgcmVzdWx0YWRvOlxyXG4gICAgICAgICAgICAgICAgLy8gICAvY29sbGVjdGlvbi9jYXRlZ29yaWVzL2NhbWFzLWVsYXN0aWNhcz9hdHRyaWJ1dGVDb2Rlcz1BQkMxMjMmLi4uXHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgLy8gVGFtYmnDqW4gcmVzZXRlYW1vcyBsYSBww6FnaW5hIGEgbnVsbCBwYXJhIHF1ZSB2dWVsdmEgYSBsYSBwcmltZXJhIHDDoWdpbmFcclxuICAgICAgICAgICAgICAgIC8vIGN1YW5kbyBzZSBhcGxpY2EgdW4gbnVldm8gZmlsdHJvLlxyXG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlQ29kZXM6IGNvZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcclxuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db2xsZWN0aW9uUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIudHlwZSgpID09PSAnZHluYW1pY3MnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzU2VydmljZS5zZXRGaWx0ZXJTZWxlY3RlZChmaWx0ZXIsIHNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25Db2RlcyA9IGZpbHRlci50b1VybFBhcmFtcygpLnJlcGxhY2UoJyZvcHRpb25Db2Rlcz0nLCAnJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkNvZGVzOiBvcHRpb25Db2RlcyB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyc1NlcnZpY2Uuc2V0RmlsdGVyU2VsZWN0ZWQoZmlsdGVyLCBzZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db2xsZWN0aW9uUmVzdWx0cygpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyBzZWxlY3RlZCBmaWx0ZXI6XCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5pcXVlU2VsZWN0aW9uKGZpbHRlcjogeyBkYXRhOiBhbnlbXTsgfSwgZmlsdGVyQ2hpbGQ6IGFueSkge1xyXG4gICAgICAgIC8vIEJ1c2NhciBzaSBoYXkgdW4gZmlsdHJvIGRlIHRpcG8gUHJpY2VSYW5nZUZpbHRlciBlbiBsYSBsaXN0YSBkZSBmaWx0cm9zXHJcbiAgICAgICAgY29uc3QgcHJpY2VSYW5nZUZpbHRlciA9IHRoaXMuZmlsdGVycy5maW5kKGYgPT4gZiBpbnN0YW5jZW9mIFByaWNlUmFuZ2VGaWx0ZXIpO1xyXG5cclxuICAgICAgICBpZiAocHJpY2VSYW5nZUZpbHRlcikge1xyXG4gICAgICAgICAgICBwcmljZVJhbmdlRmlsdGVyLnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbHRlci5kYXRhLmZvckVhY2goZmlsdGVyRWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJFbGVtZW50LnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJFbGVtZW50LnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmlsdGVyRWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKChmaWx0ZXJDaGlsZHJlbjogRmlsdGVyRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlckNoaWxkcmVuICE9IGZpbHRlckNoaWxkICYmIGZpbHRlckNoaWxkcmVuLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2hpbGRyZW4uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gIGNsb3NlID0gKCkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZpbHRyb3NcIikuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKTtcclxuICAgIC8vICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gIH07XHJcblxyXG5cclxuICAgIGNsb3NlID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIHRoaXMuY29uc3RzLm1vYmlsZSgpXHJcbiAgICAgICAgLy8gICAgICA/IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvcmRpb25FeGFtcGxlXCIpLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKVxyXG4gICAgICAgIC8vICAgICAgOiB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjY29yZGlvbl9pZCkuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgc2Nyb2xsVXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICB3aW5kb3cuc2Nyb2xsKDAsIDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9Db2xsZWN0aW9uUmVzdWx0cygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm9yZGVuTGlzdGFkbywgLmNvbHVtbmFQcm9kdWN0b3MnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlck9mZnNldCA9IHRoaXMuZ2V0Rml4ZWRIZWFkZXJPZmZzZXQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0VG9wID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGhlYWRlck9mZnNldCAtIDgpLFxyXG4gICAgICAgICAgICAgICAgMFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiB0YXJnZXRUb3AsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgICAgICB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZpeGVkSGVhZGVyT2Zmc2V0KCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaGVhZGVyLWFsbCwgaGVhZGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgICAgIGlmICghaGVhZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoaGVhZGVyKTtcclxuICAgICAgICBjb25zdCBpc092ZXJsYXlIZWFkZXIgPSBzdHlsZXMucG9zaXRpb24gPT09ICdmaXhlZCcgfHwgc3R5bGVzLnBvc2l0aW9uID09PSAnc3RpY2t5JztcclxuICAgICAgICBpZiAoIWlzT3ZlcmxheUhlYWRlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgIGhhc0FwcGxpZWRGaWx0ZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnM/LnNvbWUoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIudHlwZT8uKCkgPT09ICdwcmljZV9yYW5nZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pblNldCA9IGZpbHRlci5jdXJyZW50TWluUHJpY2UgIT09IG51bGwgJiYgZmlsdGVyLmN1cnJlbnRNaW5QcmljZSAhPT0gMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1heFNldCA9IGZpbHRlci5jdXJyZW50TWF4UHJpY2UgIT09IG51bGwgJiYgZmlsdGVyLmN1cnJlbnRNYXhQcmljZSAhPT0gZmlsdGVyLm1heFByaWNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pblNldCB8fCBtYXhTZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlci5kYXRhPy5zb21lKChmaWx0ZXJFbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlckVsZW1lbnQuY2hpbGRyZW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckVsZW1lbnQuY2hpbGRyZW4uc29tZSgoY2hpbGQ6IGFueSkgPT4gY2hpbGQuc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckVsZW1lbnQuc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pID8/IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJpZmljYSBzaSB1bmEgY2F0ZWdvcsOtYSB0aWVuZSBsYSBwcm9waWVkYWQgaXNWaXNpYmxlIHkgZXN0w6EgbWFyY2FkYSBjb21vIHZpc2libGVcclxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSAtIExhIGNhdGVnb3LDrWEgYSB2ZXJpZmljYXJcclxuICAgICAqIEByZXR1cm5zIHRydWUgc2kgbGEgY2F0ZWdvcsOtYSBlcyB2aXNpYmxlLCBmYWxzZSBlbiBjYXNvIGNvbnRyYXJpb1xyXG4gICAgICovXHJcbiAgICBoYXNWaXNpYmxlUHJvcGVydHkoY2F0ZWdvcnk6IEZpbHRlckVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKGNhdGVnb3J5IGFzIGFueSkuaXNWaXNpYmxlID09PSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG91bGRTaG93QXR0cmlidXRlRmlsdGVyKGZpbHRlckVsZW1lbnQ6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKGZpbHRlckVsZW1lbnQgYXMgeyB1c2VUb0ZpbHRlcj86IGJvb2xlYW4gfSB8IG51bGwpPy51c2VUb0ZpbHRlciAhPT0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZFNob3dEeW5hbWljRmlsdGVyKGZpbHRlckVsZW1lbnQ6IHVua25vd24pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKGZpbHRlckVsZW1lbnQgYXMgeyB1c2VUb0ZpbHRlcj86IGJvb2xlYW47IGNoaWxkcmVuPzogdW5rbm93bltdIH0gfCBudWxsKT8udXNlVG9GaWx0ZXIgIT09IGZhbHNlXHJcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoKGZpbHRlckVsZW1lbnQgYXMgeyBjaGlsZHJlbj86IHVua25vd25bXSB9IHwgbnVsbCk/LmNoaWxkcmVuKVxyXG4gICAgICAgICAgICAmJiAoKGZpbHRlckVsZW1lbnQgYXMgeyBjaGlsZHJlbj86IHVua25vd25bXSB9IHwgbnVsbCk/LmNoaWxkcmVuPy5sZW5ndGggPz8gMCkgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBMaXN0YSB2aXNpYmxlIChmaWx0cmEgcmVjdXJzaXZvIHBvciBpc1Zpc2libGUpICovXHJcbiAgICBwdWJsaWMgZ2V0VmlzaWJsZURhdGEoZmlsdGVyOiBGaWx0ZXIgfCBudWxsKTogRmlsdGVyRWxlbWVudFtdIHtcclxuICAgICAgICBpZiAoIWZpbHRlcikgcmV0dXJuIFtdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlclZpc2libGVUcmVlKGZpbHRlci5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ2hpbGRyZW4gdmlzaWJsZXMgZGUgdW4gbm9kbyAqL1xyXG4gICAgcHVibGljIGdldFZpc2libGVDaGlsZHJlbihub2RlPzogRmlsdGVyRWxlbWVudCk6IEZpbHRlckVsZW1lbnRbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyVmlzaWJsZVRyZWUobm9kZT8uY2hpbGRyZW4gPz8gW10pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaWVuZSBoaWpvcyB2aXNpYmxlcz8gKi9cclxuICAgIHB1YmxpYyBoYXNWaXNpYmxlQ2hpbGRyZW4obm9kZT86IEZpbHRlckVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlQ2hpbGRyZW4obm9kZSkubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogVXRpbGlkYWQgcmVjdXJzaXZhICovXHJcbiAgICBwcml2YXRlIGZpbHRlclZpc2libGVUcmVlKGxpc3Q6IEZpbHRlckVsZW1lbnRbXSA9IFtdKTogRmlsdGVyRWxlbWVudFtdIHtcclxuICAgICAgICByZXR1cm4gKGxpc3QgPz8gW10pXHJcbiAgICAgICAgICAgIC5maWx0ZXIobiA9PiAobiBhcyBhbnkpLmlzVmlzaWJsZSA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgLm1hcChuID0+ICh7XHJcbiAgICAgICAgICAgICAgICAuLi5uLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuZmlsdGVyVmlzaWJsZVRyZWUobi5jaGlsZHJlbiA/PyBbXSlcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG59XHJcbiIsIjxwPmZpbHRlcnMtZWMgd29ya3MhPC9wPlxyXG4iXX0=
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVycy1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9maWx0ZXJzLWVjL2ZpbHRlcnMtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvZmlsdGVycy1lYy9maWx0ZXJzLWVjLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBeUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBVW5FLE1BQU0sT0FBTyxrQkFBa0I7SUFFbkIsWUFBWSxHQUFnQixNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsZUFBZSxHQUFtQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekQsZ0JBQWdCLEdBQW9CLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM1RCxVQUFVLEdBQXlCLE1BQU0sQ0FBQyxvQkFB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LENBQUM7SUFDeEQsQ0FBQztJQUVELDRCQUE0QjtJQUNyQixrQkFBa0IsQ0FBQyxJQUFvQjtRQUMxQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx5QkFBeUI7SUFDakIsaUJBQWlCLENBQUMsT0FBd0IsRUFBRTtRQUNoRCxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzthQUNkLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQVMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDO2FBQzFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDUCxHQUFHLENBQUM7WUFDSixRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1NBQ3JELENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQzt3R0ExVFEsa0JBQWtCOzRGQUFsQixrQkFBa0IsOEdDbEIvQiw4QkFDQTs7NEZEaUJhLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDSSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsRUFBRTt3REFvQkYsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGaWx0ZXJzU2VydmljZSwgQXV0aFNlcnZpY2UsIFByaWNlVmlzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lYy1zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFbGVtZW50LCBGaWx0ZXJUeXBlLCBQYWdpbmF0aW9uU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZWMtc2VydmljZXMvcHJvZHVjdHMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFByaWNlUmFuZ2VGaWx0ZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2ZpbHRlcnMvcHJpY2VfcmFuZ2UtZmlsdGVyJztcclxuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9lYy1zZXJ2aWNlcy9jaGFubmVsLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItZmlsdGVycy1lYycsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW10sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVycy1lYy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybDogJy4vZmlsdGVycy1lYy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbHRlcnNFY0NvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSBfYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2ZpbHRlcnNTZXJ2aWNlOiBGaWx0ZXJzU2VydmljZSA9IGluamVjdChGaWx0ZXJzU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9wcm9kdWN0c1NlcnZpY2U6IFByb2R1Y3RzU2VydmljZSA9IGluamVjdChQcm9kdWN0c1NlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBfY29uc3RhbnRzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyID0gaW5qZWN0KFJvdXRlcik7XHJcbiAgICBwdWJsaWMgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBmaWx0ZXIkID0gdGhpcy5fZmlsdGVyc1NlcnZpY2UuZmlsdGVycyQ7XHJcbiAgICBwdWJsaWMgc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICAgIHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5fYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCk7XHJcbiAgICBwdWJsaWMgaGlkZVByaWNlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IHByaWNlVmlzaWJpbGl0eSA9IGluamVjdChQcmljZVZpc2liaWxpdHlTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcclxuXHJcbiAgICBASW5wdXQoKSBzZXRTZWxlY3Q6IGFueTtcclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fZmlsdGVyc1NlcnZpY2UuZmlsdGVycyQuc3Vic2NyaWJlKChmaWx0ZXJzOiBGaWx0ZXJbXSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KENoYW5uZWxTZXJ2aWNlKS5jaGFubmVsJC5zdWJzY3JpYmUoY2hhbm5lbCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByaWNlc09ubHlUb0xvZ2dlZFVzZXJzID0gISFjaGFubmVsLnNob3dQcmljZXNPbmx5VG9Mb2dnZWRVc2VycztcclxuICAgICAgICAgICAgdGhpcy5oaWRlUHJpY2VzID0gISFjaGFubmVsLmhpZGVQcmljZXM7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKiogMSkgUGFyYSBjdWFuZG8gbWUgcGlkZW4gJ3ByaWNlX3JhbmdlJywgZGV2dWVsdm8gUHJpY2VSYW5nZUZpbHRlciAqL1xyXG4gICAgcHVibGljIGdldFNwZWNpZmljRmlsdGVyKHR5cGU6ICdwcmljZV9yYW5nZScpOiBQcmljZVJhbmdlRmlsdGVyIHwgbnVsbDtcclxuXHJcbiAgICAvKiogMikgUGFyYSBjdWFscXVpZXIgb3RybyBGaWx0ZXJUeXBlLCBkZXZ1ZWx2byBGaWx0ZXIgKi9cclxuICAgIHB1YmxpYyBnZXRTcGVjaWZpY0ZpbHRlcih0eXBlOiBGaWx0ZXJUeXBlKTogRmlsdGVyIHwgbnVsbDtcclxuICAgIHB1YmxpYyBnZXRTcGVjaWZpY0ZpbHRlcih0eXBlOiBGaWx0ZXJUeXBlKTogRmlsdGVyIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXJzLmZpbmQoZiA9PiBmLnR5cGUoKSA9PT0gdHlwZSk7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdwcmljZV9yYW5nZScgJiYgZmlsdGVyICYmICEoZmlsdGVyIGluc3RhbmNlb2YgRmlsdGVyKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFeHBlY3RlZCBhIEZpbHRlciBpbnN0YW5jZSBidXQgZ290YCwgZmlsdGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlciB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG91bGRTaG93UHJpY2VSYW5nZShwcmljZVJhbmdlOiBQcmljZVJhbmdlRmlsdGVyIHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5wcmljZVZpc2liaWxpdHkuY2FuU2hvd1ByaWNlcygpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFwcmljZVJhbmdlPy5pc0xvYWRlZCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBwcmljZVJhbmdlLmhhc1ZhbGlkUmFuZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgLypPYnRpZW5lIGVsIGZpbHRybyBlbGVnaWRvIGVuIGVsIHNlbGVjdCwgbG8gcGFzYSBhbCBzZXRTZWxlY3RcclxuICAgIHBhcmEgcXVlIHNlIG1hcnF1ZSBzZWxlY2Npb25hZG8qL1xyXG4gICAgb25TZWxlY3QoZXZlbnQ6IGFueSwgZmlsdGVyOiBGaWx0ZXJFbGVtZW50W10gfCBudWxsKSB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coZmlsdGVyKVxyXG4gICAgICAgIC8qICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IGZpbHRlclxyXG4gICAgICAgICAgICAgLmZsYXRNYXAoY2F0ZWdvcnkgPT4gY2F0ZWdvcnkuY2hpbGRyZW4pXHJcbiAgICAgICAgICAgICAuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24/LmNvZGUgPT09IGV2ZW50LnRhcmdldC52YWx1ZSlcclxuICAgICAgICAgICAgIC5wb3AoKVxyXG4gICAgICAgICBzZWxlY3RlZE9wdGlvbiAmJiB0aGlzLl9maWx0ZXJzU2VydmljZS5zZXRGaWx0ZXJTZWxlY3RlZCh0aGlzLmZpbHRlcnNbMF0sIHNlbGVjdGVkT3B0aW9uKSAqL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFuZWphIGVsIGNsaWNrIHNvYnJlIHVuIGVsZW1lbnRvIGRlIGZpbHRybyAoY2F0ZWdvcsOtYSwgYXRyaWJ1dG8sIGV0Yy4pLlxyXG4gICAgICpcclxuICAgICAqIC0gUGFyYSBjYXRlZ29yw61hczogbmF2ZWdhIGEgbGEgVVJMIGRlIGxhIGNhdGVnb3LDrWEuXHJcbiAgICAgKiAtIFBhcmEgYXRyaWJ1dG9zOiBhY3R1YWxpemEgbGEgcXVlcnkgc3RyaW5nIGRlIGxhIFVSTCBjb24gYGF0dHJpYnV0ZUNvZGVzYC5cclxuICAgICAqIC0gUGFyYSBvdHJvcyBmaWx0cm9zOiBkZWxlZ2EgZW4gRmlsdGVyc1NlcnZpY2UgcGFyYSBtYXJjYXIgc2VsZWNjaW9uYWRvLlxyXG4gICAgICpcclxuICAgICAqIExhIGlkZWEgZXMgcXVlICoqbGEgVVJMIHNpZW1wcmUgcmVwcmVzZW50ZSBsb3MgZmlsdHJvcyBhcGxpY2Fkb3MqKixcclxuICAgICAqIGRlIG1vZG8gcXVlOlxyXG4gICAgICogICAtIGFsIGhhY2VyIEY1IG5vIHNlIHBpZXJkYW4gbG9zIGZpbHRyb3MsXHJcbiAgICAgKiAgIC0gbG9zIGxpbmtzIHNlYW4gY29tcGFydGlibGVzIChkZWVwIGxpbmtpbmcpLlxyXG4gICAgICovXHJcbiAgICBzZXRTZWxlY3RlZChmaWx0ZXI6IEZpbHRlciB8IG51bGwsIHNlbGVjdGVkOiBGaWx0ZXJFbGVtZW50IHwgbnVsbCkge1xyXG4gICAgICAgIGlmICghZmlsdGVyIHx8ICFzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNpIGVsIGVsZW1lbnRvIGVzdMOhIG1hcmNhZG8gY29tbyBubyB2aXNpYmxlLCBubyBoYWNlbW9zIG5hZGFcclxuICAgICAgICBpZiAoKHNlbGVjdGVkIGFzIGFueSkuaXNWaXNpYmxlID09PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIChmaWx0ZXIgYXMgYW55KS5zZXRTZWxlY3RlZCAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyLnR5cGUoKSA9PT0gJ2NhdGVnb3JpZXMnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQYXJhIGNhdGVnb3LDrWFzIHVzYW1vcyBuYXZlZ2FjacOzbiBwb3IgcGF0aCAoZWo6IC9jb2xsZWN0aW9uL2NhdGVnb3JpZXMvY2FtYXMtZWxhc3RpY2FzKVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLnBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlKFtzZWxlY3RlZC5wYXRoXSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db2xsZWN0aW9uUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIudHlwZSgpID09PSAnYXR0cmlidXRlcycpIHtcclxuICAgICAgICAgICAgICAgIC8vIExvY2F0ZSB0aGUgcGFyZW50IGdyb3VwIHRoYXQgb3ducyB0aGUgY2xpY2tlZCBjaGlsZFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50R3JvdXAgPSBmaWx0ZXIuZGF0YS5maW5kKChwYXJlbnQ6IGFueSkgPT5cclxuICAgICAgICAgICAgICAgICAgICAocGFyZW50LmNoaWxkcmVuIHx8IFtdKS5pbmNsdWRlcyhzZWxlY3RlZClcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSAoc2VsZWN0ZWQgYXMgYW55KS5zZWxlY3RlZDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgc2FtZSBncm91cDogY2xlYXIgYWxsIHNpYmxpbmdzIGZpcnN0XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50R3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAocGFyZW50R3JvdXAuY2hpbGRyZW4gfHwgW10pLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBUb2dnbGU6IHNlbGVjdCBpZiBpdCB3YXNuJ3Qgc2VsZWN0ZWQsIGRlc2VsZWN0IGlmIGl0IHdhc1xyXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkIGFzIGFueSkuc2VsZWN0ZWQgPSAhd2FzU2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ29sbGVjdCBvbmUgc2VsZWN0ZWQgY29kZSBwZXIgZ3JvdXAgKG11bHRpLWdyb3VwIHN1cHBvcnQpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvZGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyLmRhdGEuZm9yRWFjaCgocGFyZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAocGFyZW50LmNoaWxkcmVuIHx8IFtdKS5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IChjaGlsZCBhcyBhbnkpLmNvZGUgfHwgKGNoaWxkIGFzIGFueSkudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgc2VsZWN0ZWRDb2Rlcy5wdXNoKGNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVDb2Rlc1BhcmFtID0gc2VsZWN0ZWRDb2Rlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgPyBzZWxlY3RlZENvZGVzLmpvaW4oJzxhbmQ+JylcclxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlQ29kZXM6IGF0dHJpYnV0ZUNvZGVzUGFyYW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcclxuICAgICAgICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db2xsZWN0aW9uUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXIudHlwZSgpID09PSAnZHluYW1pY3MnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzU2VydmljZS5zZXRGaWx0ZXJTZWxlY3RlZChmaWx0ZXIsIHNlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25Db2RlcyA9IGZpbHRlci50b1VybFBhcmFtcygpLnJlcGxhY2UoJyZvcHRpb25Db2Rlcz0nLCAnJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkNvZGVzOiBvcHRpb25Db2RlcyB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyc1NlcnZpY2Uuc2V0RmlsdGVyU2VsZWN0ZWQoZmlsdGVyLCBzZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db2xsZWN0aW9uUmVzdWx0cygpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyBzZWxlY3RlZCBmaWx0ZXI6XCIsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5pcXVlU2VsZWN0aW9uKGZpbHRlcjogeyBkYXRhOiBhbnlbXTsgfSwgZmlsdGVyQ2hpbGQ6IGFueSkge1xyXG4gICAgICAgIC8vIEZvciBhdHRyaWJ1dGVzOiBuby1vcCDigJQgc2luZ2xlLXBlci1ncm91cCBkZXNlbGVjdGlvbiBpcyBoYW5kbGVkIGluc2lkZSBzZXRTZWxlY3RlZC5cclxuICAgICAgICBpZiAoKGZpbHRlciBhcyBhbnkpLnR5cGU/LigpID09PSAnYXR0cmlidXRlcycpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gQnVzY2FyIHNpIGhheSB1biBmaWx0cm8gZGUgdGlwbyBQcmljZVJhbmdlRmlsdGVyIGVuIGxhIGxpc3RhIGRlIGZpbHRyb3NcclxuICAgICAgICBjb25zdCBwcmljZVJhbmdlRmlsdGVyID0gdGhpcy5maWx0ZXJzLmZpbmQoZiA9PiBmIGluc3RhbmNlb2YgUHJpY2VSYW5nZUZpbHRlcik7XHJcblxyXG4gICAgICAgIGlmIChwcmljZVJhbmdlRmlsdGVyKSB7XHJcbiAgICAgICAgICAgIHByaWNlUmFuZ2VGaWx0ZXIucmVzZXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmlsdGVyLmRhdGEuZm9yRWFjaChmaWx0ZXJFbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckVsZW1lbnQuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGZpbHRlckVsZW1lbnQuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaWx0ZXJFbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGZpbHRlckNoaWxkcmVuOiBGaWx0ZXJFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyQ2hpbGRyZW4gIT0gZmlsdGVyQ2hpbGQgJiYgZmlsdGVyQ2hpbGRyZW4uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGlsZHJlbi5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAgY2xvc2UgPSAoKSA9PiB7XHJcbiAgICAvLyAgICAgICB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZmlsdHJvc1wiKS5jbGFzc0xpc3QucmVtb3ZlKCdpbicpO1xyXG4gICAgLy8gICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgfTtcclxuXHJcblxyXG4gICAgY2xvc2UgPSAoKSA9PiB7XHJcbiAgICAgICAgLy8gdGhpcy5jb25zdHMubW9iaWxlKClcclxuICAgICAgICAvLyAgICAgID8gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY29yZGlvbkV4YW1wbGVcIikuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICAgICAgLy8gICAgICA6IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWNjb3JkaW9uX2lkKS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBzY3JvbGxVcCA9ICgpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzY3JvbGxUb0NvbGxlY3Rpb25SZXN1bHRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcub3JkZW5MaXN0YWRvLCAuY29sdW1uYVByb2R1Y3RvcycpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyT2Zmc2V0ID0gdGhpcy5nZXRGaXhlZEhlYWRlck9mZnNldCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRUb3AgPSBNYXRoLm1heChcclxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gaGVhZGVyT2Zmc2V0IC0gOCksXHJcbiAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IHRhcmdldFRvcCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Rml4ZWRIZWFkZXJPZmZzZXQoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNoZWFkZXItYWxsLCBoZWFkZXInKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgaWYgKCFoZWFkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShoZWFkZXIpO1xyXG4gICAgICAgIGNvbnN0IGlzT3ZlcmxheUhlYWRlciA9IHN0eWxlcy5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyB8fCBzdHlsZXMucG9zaXRpb24gPT09ICdzdGlja3knO1xyXG4gICAgICAgIGlmICghaXNPdmVybGF5SGVhZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbChoZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG4gICAgaGFzQXBwbGllZEZpbHRlcnMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVycz8uc29tZSgoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlci50eXBlPy4oKSA9PT0gJ3ByaWNlX3JhbmdlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWluU2V0ID0gZmlsdGVyLmN1cnJlbnRNaW5QcmljZSAhPT0gbnVsbCAmJiBmaWx0ZXIuY3VycmVudE1pblByaWNlICE9PSAwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF4U2V0ID0gZmlsdGVyLmN1cnJlbnRNYXhQcmljZSAhPT0gbnVsbCAmJiBmaWx0ZXIuY3VycmVudE1heFByaWNlICE9PSBmaWx0ZXIubWF4UHJpY2U7XHJcbiAgICAgICAgICAgICAgICBpZiAobWluU2V0IHx8IG1heFNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyLmRhdGE/LnNvbWUoKGZpbHRlckVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyRWxlbWVudC5jaGlsZHJlbikpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyRWxlbWVudC5jaGlsZHJlbi5zb21lKChjaGlsZDogYW55KSA9PiBjaGlsZC5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyRWxlbWVudC5zZWxlY3RlZDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkgPz8gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFZlcmlmaWNhIHNpIHVuYSBjYXRlZ29yw61hIHRpZW5lIGxhIHByb3BpZWRhZCBpc1Zpc2libGUgeSBlc3TDoSBtYXJjYWRhIGNvbW8gdmlzaWJsZVxyXG4gICAgICogQHBhcmFtIGNhdGVnb3J5IC0gTGEgY2F0ZWdvcsOtYSBhIHZlcmlmaWNhclxyXG4gICAgICogQHJldHVybnMgdHJ1ZSBzaSBsYSBjYXRlZ29yw61hIGVzIHZpc2libGUsIGZhbHNlIGVuIGNhc28gY29udHJhcmlvXHJcbiAgICAgKi9cclxuICAgIGhhc1Zpc2libGVQcm9wZXJ0eShjYXRlZ29yeTogRmlsdGVyRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoY2F0ZWdvcnkgYXMgYW55KS5pc1Zpc2libGUgPT09IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZFNob3dBdHRyaWJ1dGVGaWx0ZXIoZmlsdGVyRWxlbWVudDogdW5rbm93bik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoZmlsdGVyRWxlbWVudCBhcyB7IHVzZVRvRmlsdGVyPzogYm9vbGVhbiB9IHwgbnVsbCk/LnVzZVRvRmlsdGVyICE9PSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvdWxkU2hvd0R5bmFtaWNGaWx0ZXIoZmlsdGVyRWxlbWVudDogdW5rbm93bik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoZmlsdGVyRWxlbWVudCBhcyB7IHVzZVRvRmlsdGVyPzogYm9vbGVhbjsgY2hpbGRyZW4/OiB1bmtub3duW10gfSB8IG51bGwpPy51c2VUb0ZpbHRlciAhPT0gZmFsc2VcclxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheSgoZmlsdGVyRWxlbWVudCBhcyB7IGNoaWxkcmVuPzogdW5rbm93bltdIH0gfCBudWxsKT8uY2hpbGRyZW4pXHJcbiAgICAgICAgICAgICYmICgoZmlsdGVyRWxlbWVudCBhcyB7IGNoaWxkcmVuPzogdW5rbm93bltdIH0gfCBudWxsKT8uY2hpbGRyZW4/Lmxlbmd0aCA/PyAwKSA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIExpc3RhIHZpc2libGUgKGZpbHRyYSByZWN1cnNpdm8gcG9yIGlzVmlzaWJsZSkgKi9cclxuICAgIHB1YmxpYyBnZXRWaXNpYmxlRGF0YShmaWx0ZXI6IEZpbHRlciB8IG51bGwpOiBGaWx0ZXJFbGVtZW50W10ge1xyXG4gICAgICAgIGlmICghZmlsdGVyKSByZXR1cm4gW107XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyVmlzaWJsZVRyZWUoZmlsdGVyLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDaGlsZHJlbiB2aXNpYmxlcyBkZSB1biBub2RvICovXHJcbiAgICBwdWJsaWMgZ2V0VmlzaWJsZUNoaWxkcmVuKG5vZGU/OiBGaWx0ZXJFbGVtZW50KTogRmlsdGVyRWxlbWVudFtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJWaXNpYmxlVHJlZShub2RlPy5jaGlsZHJlbiA/PyBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRpZW5lIGhpam9zIHZpc2libGVzPyAqL1xyXG4gICAgcHVibGljIGhhc1Zpc2libGVDaGlsZHJlbihub2RlPzogRmlsdGVyRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZpc2libGVDaGlsZHJlbihub2RlKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBVdGlsaWRhZCByZWN1cnNpdmEgKi9cclxuICAgIHByaXZhdGUgZmlsdGVyVmlzaWJsZVRyZWUobGlzdDogRmlsdGVyRWxlbWVudFtdID0gW10pOiBGaWx0ZXJFbGVtZW50W10ge1xyXG4gICAgICAgIHJldHVybiAobGlzdCA/PyBbXSlcclxuICAgICAgICAgICAgLmZpbHRlcihuID0+IChuIGFzIGFueSkuaXNWaXNpYmxlID09PSB0cnVlKVxyXG4gICAgICAgICAgICAubWFwKG4gPT4gKHtcclxuICAgICAgICAgICAgICAgIC4uLm4sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5maWx0ZXJWaXNpYmxlVHJlZShuLmNoaWxkcmVuID8/IFtdKVxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPHA+ZmlsdGVycy1lYyB3b3JrcyE8L3A+XHJcbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { inject, Injectable, PLATFORM_ID, signal } from '@angular/core';
2
- import { BehaviorSubject, catchError, map, of, throwError } from 'rxjs';
2
+ import { BehaviorSubject, catchError, map, of, throwError, tap } from 'rxjs';
3
3
  import { ConnectionService } from '../api';
4
4
  import { User } from '../classes';
5
5
  import moment from 'moment';
@@ -70,6 +70,8 @@ export class AuthService {
70
70
  shopApi = this._apiConsts.SHOP_API_URL;
71
71
  channelApi = this._apiConsts.CHANNEL;
72
72
  tokenApi() { return this.shopApi + 'login_check'; }
73
+ // --- NUEVO: Endpoint para el refresco del token ---
74
+ refreshTokenApi() { return this.shopApi + 'token/refresh'; }
73
75
  recoverPasswordApi() { return `${this.shopApi}${this.channelApi}/request-password-reset`; }
74
76
  resetPasswordApi = (token) => `${this.shopApi}${this.channelApi}/password-reset/${token}`;
75
77
  confirmAccountApi(token) { return `${this.shopApi}${this.channelApi}/verify-account?token=${token}`; }
@@ -109,17 +111,36 @@ export class AuthService {
109
111
  return 'error';
110
112
  }), catchError((error) => {
111
113
  this._loggingInSubject.next(false);
112
- return throwError(() => error); // <-- Propaga el error real
114
+ return throwError(() => error);
115
+ }));
116
+ }
117
+ // --- NUEVO: Método para solicitar el refresco del token ---
118
+ /**
119
+ * Solicita un nuevo JWT usando el refresh token almacenado.
120
+ */
121
+ refreshToken() {
122
+ const refreshToken = this._localStorage.getItem(this.REFRESH_TOKEN);
123
+ if (!refreshToken) {
124
+ return throwError(() => new Error('No refresh token available'));
125
+ }
126
+ return this._connection.post(this.refreshTokenApi(), { refresh_token: refreshToken }).pipe(tap((res) => {
127
+ this._localStorage.setItem(this.JWT_TOKEN, res.token);
128
+ this._authStorage.setAuthToken(res.token);
129
+ this._tokenSignal.set(res.token);
130
+ if (res.refresh_token) {
131
+ this._localStorage.setItem(this.REFRESH_TOKEN, res.refresh_token);
132
+ }
133
+ if (res.expire_in) {
134
+ this._localStorage.setItem(this.EXPIRATES_IN, moment(res.expire_in).add(1, 'h').format());
135
+ }
113
136
  }));
114
137
  }
115
138
  updatePassword(currentPassword, newPassword, confirmPassword) {
116
- // Creamos un objeto plano normal, sin HttpParams
117
139
  const payload = {
118
140
  currentPassword: currentPassword,
119
141
  newPassword: newPassword,
120
142
  confirmPassword: confirmPassword
121
143
  };
122
- // Usamos TU servicio original para que envíe el token y formatee a JSON automático
123
144
  return this._connection.put(this.securityUrl(), payload);
124
145
  }
125
146
  /**
@@ -195,7 +216,13 @@ export class AuthService {
195
216
  const userJsonify = this._user.jsonify();
196
217
  this._localStorage.setItem(this.USER, JSON.stringify(userJsonify));
197
218
  this._localStorage.setItem(this.EXPIRATES_IN, moment(tokens.expire_in).add(1, 'h').format());
198
- this._localStorage.setItem(this.REFRESH_TOKEN, moment(tokens.expire_in).add(1, 'h').format());
219
+ // --- MODIFICADO: Fix del bug al guardar el refresh token ---
220
+ if (tokens.refresh_token) {
221
+ this._localStorage.setItem(this.REFRESH_TOKEN, tokens.refresh_token);
222
+ }
223
+ else {
224
+ this._localStorage.removeItem(this.REFRESH_TOKEN); // Compatibilidad con backends sin refresh
225
+ }
199
226
  this._localStorage.setItem(this.JWT_TOKEN, tokens.token);
200
227
  this._authStorage.setAuthToken(tokens.token);
201
228
  this._tokenSignal.set(tokens.token);
@@ -251,7 +278,11 @@ export class AuthService {
251
278
  return false;
252
279
  }
253
280
  if (this.isTokenExpired()) {
254
- return false;
281
+ // --- MODIFICADO: Comprobar refresh token para no desloguear prematuramente ---
282
+ const hasRefreshToken = !!this._localStorage.getItem(this.REFRESH_TOKEN);
283
+ if (!hasRefreshToken) {
284
+ return false;
285
+ }
255
286
  }
256
287
  this.getCurrentUserAsUser();
257
288
  return this._user != null;
@@ -318,9 +349,6 @@ export class AuthService {
318
349
  return this._user;
319
350
  }
320
351
  else {
321
- // Si hay cliente activo (impersonación de seller), el canal puede ser
322
- // el del cliente y no necesariamente uno del vendedor.
323
- // En ese caso no invalidamos sesión por mismatch de canal.
324
352
  if (this.getCustomer()) {
325
353
  return this._user;
326
354
  }
@@ -338,7 +366,7 @@ export class AuthService {
338
366
  if (stored) {
339
367
  try {
340
368
  const userObj = JSON.parse(stored);
341
- this._user = Object.assign(new User(), userObj); // <-- Así recuperas los métodos de User
369
+ this._user = Object.assign(new User(), userObj);
342
370
  return true;
343
371
  }
344
372
  catch (error) {
@@ -384,15 +412,6 @@ export class AuthService {
384
412
  signUpWholesaler(data) {
385
413
  return this._connection.post(this.registerWholesalerApi(), data);
386
414
  }
387
- /**
388
- * Chequea si un usuario esta habilitado a comprar o no.
389
- * @returns
390
- */
391
- // isAbleToBuy():boolean {
392
- // const currentUser = this.getUserProfileAsUser() as User;
393
- // const isSeller = currentUser.typeUser && currentUser.typeUser == 'seller' || false
394
- // return !isSeller || !this.getCustomer();
395
- // }
396
415
  isAbleToBuy = () => !this.getUserProfileSnapshot()?.isSeller() || !!this.getCustomer();
397
416
  /**
398
417
  * Indica si el usuario puede acceder/ver el dashboard de vendedor.
@@ -540,7 +559,6 @@ export class AuthService {
540
559
  this._localStorage.removeItem(this.CHANNELSELLER);
541
560
  }
542
561
  }
543
- //this._cartService.clearAndResetCustomerCart()
544
562
  this._customerSubject.next(this._customer ?? null);
545
563
  }
546
564
  /**
@@ -580,4 +598,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
580
598
  providedIn: 'root'
581
599
  }]
582
600
  }], ctorParameters: () => [] });
583
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUVwRDs7R0FFRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBQ2YsYUFBYSxHQUF3QixNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUNoRSxXQUFXLEdBQXNCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzNELGVBQWUsR0FBbUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELFVBQVUsR0FBeUIsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEUsVUFBVSxHQUF3QixNQUFNLENB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YyxFQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFOUk7OztPQUdHO0lBQ0ssYUFBYSxHQUFHLENBQUMsYUFBa0IsRUFBRSxFQUFFO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUM7WUFDbkMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO1lBQzlCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtZQUM1QixZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVk7U0FDeEMsQ0FBQyxDQUFBO0lBQ0gsQ0FBQyxDQUFBO0lBQ0QsY0FBYztRQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUNPLGNBQWM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2xCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQzt3R0Fua0JXLFdBQVc7NEdBQVgsV0FBVyxjQUZYLE1BQU07OzRGQUVOLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBQTEFURk9STV9JRCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVzZXJSb2xlVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9hcGknO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwuc2VydmljZSc7XHJcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UsIENvcmVDb25zdGFudHNTZXJ2aWNlIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJy4vbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnN0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG4vKipcclxuICogU2VydmljaW8gZGUgYXV0ZW50aWZpY2FjacOzbiBkZWwgdXN1YXJpbyBlbiBsYSBwbGF0YWZvcm1hLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xyXG5cdHByaXZhdGUgX2xvY2FsU3RvcmFnZTogTG9jYWxTdG9yYWdlU2VydmljZSA9IGluamVjdChMb2NhbFN0b3JhZ2VTZXJ2aWNlKVxyXG5cdHByaXZhdGUgX2Nvbm5lY3Rpb246IENvbm5lY3Rpb25TZXJ2aWNlID0gaW5qZWN0KENvbm5lY3Rpb25TZXJ2aWNlKTtcclxuXHRwcml2YXRlIF9jaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UgPSBpbmplY3QoQ2hhbm5lbFNlcnZpY2UpO1xyXG5cdHByaXZhdGUgX2NvbnN0YW50czogQ29yZUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQ29yZUNvbnN0YW50c1NlcnZpY2UpO1xyXG5cdHByaXZhdGUgX2FwaUNvbnN0czogQXBpQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKTtcclxuXHRwcml2YXRlIF9hdXRoU3RvcmFnZTogQXV0aFN0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KEF1dGhTdG9yYWdlU2VydmljZSk7XHJcblx0XHJcblxyXG5cdC8vIENvbnRhbnRlcyBwYXJhIGVsIHN0b3JhZ2UuXHJcblx0cHJpdmF0ZSByZWFkb25seSBKV1RfVE9LRU4gPSAnSldUX1RPS0VOJ1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgUkVGUkVTSF9UT0tFTiA9ICdSRUZSRVNIX1RPS0VOJ1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgRVhQSVJBVEVTX0lOID0gJ0VYUElSQVRFU19JTidcclxuXHRwcml2YXRlIHJlYWRvbmx5IFVTRVIgPSAnVVNFUidcclxuXHRwcml2YXRlIHJlYWRvbmx5IE1BSUwgPSAnbWFpbCdcclxuXHRwcml2YXRlIHJlYWRvbmx5IExPQ0FMRSA9ICdMT0NBTEUnXHJcblx0cHJpdmF0ZSByZWFkb25seSBDSEFOTkVMID0gJ0NIQU5ORUwnXHJcblx0cHJpdmF0ZSByZWFkb25seSBDVVNUT01FUiA9ICdDVVNUT01FUidcclxuXHRwcml2YXRlIHJlYWRvbmx5IENIQU5ORUxTRUxMRVIgPSAnQ0hBTk5FTFNFTExFUidcclxuXHJcblx0cHJpdmF0ZSBjaGFubmVsc1VzZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pXHJcblx0cHVibGljIGNoYW5uZWxzJCA9IHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKVxyXG5cdHByaXZhdGUgX2NoYW5uZWwkID0gdGhpcy5fY2hhbm5lbFNlcnZpY2UuZ2V0Q2hhbm5lbCgpXHJcblx0cHJpdmF0ZSBfdXNlckluU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlciB8IG51bGw+KG51bGwpXHJcblx0cHJpdmF0ZSBfbG9nZ2VkSW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHRwdWJsaWMgbG9nZ2VkSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fbG9nZ2VkSW5TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cdHByaXZhdGUgX2xvZ2dpbmdJblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cdHB1YmxpYyBsb2dnaW5nSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fbG9nZ2luZ0luU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHRwcml2YXRlIF9jdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnkgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55IHwgbnVsbD4obnVsbCk7XHJcblx0cHVibGljIGN1c3RvbWVyJDogT2JzZXJ2YWJsZTxhbnkgfCBudWxsPiA9IHRoaXMuX2N1c3RvbWVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcblx0LyoqXHJcblx0ICogUGFyYSBpbmRpY2FyIHNpIHVuIGNhbmFsIGNhbWJpby5cclxuXHQgKi9cclxuXHRwcml2YXRlIF9hY3RpdmVDaGFubmVsQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcblx0LyoqXHJcblx0ICogR3VhcmRhIGxvcyBkYXRvcyBkZWwgdXN1YXJpb1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3VzZXI6IFVzZXIgfCBudWxsID0gbnVsbDtcclxuXHRwcml2YXRlIF9jdXN0b21lcjogYW55ID0gbnVsbDtcclxuXHQvKipcclxuXHQgKiBHdWFyZGEgbG9zIGRhdG9zIGRlbCBjYW5hbFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjaGFubmVsOiBhbnkgPSBbXVxyXG5cdHB1YmxpYyBjaGFubmVsczogYW55W10gPSBbXVxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpemFkbyBwYXJhIHJlc29sdmVyIGhhY2lhIGRvbmRlIHNlIHRpZW5lIHF1ZSByZWRpcmVjY2lvbmFyXHJcblx0ICogbGEgcGFnaW5hIHRyYXMgdW4gZXZlbnRvLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX2hvbWVSZXNvbHZlcjogYW55O1xyXG5cdC8qKlxyXG5cdCAqIFNpZ25hbCBwYXJhIGd1YXJkYXIgZWwgdG9rZW4gZGUgdXN1YXJpbyB1bmEgdmV6IGxvZ3VlYWRvXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfdG9rZW5TaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblx0LyoqXHJcblx0ICogU2lnbmFsIHBhcmEgZ3VhcmRhciBlbCB1c3VhcmlvXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfdXNlclNpZ25hbCA9IHNpZ25hbDxVc2VyIHwgbnVsbD4obnVsbCk7XHJcblx0Ly9BUElzXHJcblx0cHJpdmF0ZSBzaG9wQXBpOiBzdHJpbmcgPSB0aGlzLl9hcGlDb25zdHMuU0hPUF9BUElfVVJMXHJcblx0cHJpdmF0ZSBjaGFubmVsQXBpOiBzdHJpbmcgPSB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTFxyXG5cdHByaXZhdGUgdG9rZW5BcGkoKSB7IHJldHVybiB0aGlzLnNob3BBcGkgKyAnbG9naW5fY2hlY2snIH1cclxuXHRwcml2YXRlIHJlY292ZXJQYXNzd29yZEFwaSgpIHsgcmV0dXJuIGAke3RoaXMuc2hvcEFwaX0ke3RoaXMuY2hhbm5lbEFwaX0vcmVxdWVzdC1wYXNzd29yZC1yZXNldGAgfVxyXG5cdHByaXZhdGUgcmVzZXRQYXNzd29yZEFwaSA9ICh0b2tlbjogc3RyaW5nKSA9PiBgJHt0aGlzLnNob3BBcGl9JHt0aGlzLmNoYW5uZWxBcGl9L3Bhc3N3b3JkLXJlc2V0LyR7dG9rZW59YDtcclxuXHRwcml2YXRlIGNvbmZpcm1BY2NvdW50QXBpKHRva2VuOiBzdHJpbmcpIHsgcmV0dXJuIGAke3RoaXMuc2hvcEFwaX0ke3RoaXMuY2hhbm5lbEFwaX0vdmVyaWZ5LWFjY291bnQ/dG9rZW49JHt0b2tlbn1gIH1cclxuXHRwcml2YXRlIHJlZ2lzdGVyQXBpKCkgeyByZXR1cm4gYCR7dGhpcy5zaG9wQXBpfSR7dGhpcy5jaGFubmVsQXBpfS9yZWdpc3RlcmAgfVxyXG5cdHByaXZhdGUgcmVnaXN0ZXJXaG9sZXNhbGVyQXBpKCkgeyByZXR1cm4gYCR7dGhpcy5zaG9wQXBpfSR7dGhpcy5jaGFubmVsQXBpfS9yZWdpc3Rlci13aG9sZXNhbGVyYCB9XHJcblx0cHJvdGVjdGVkIHBsYXRmb3JtSWQ6IGFueSA9IGluamVjdChQTEFURk9STV9JRClcclxuXHRwcml2YXRlIHNlY3VyaXR5VXJsKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gYCR7dGhpcy5zaG9wQXBpfSR7dGhpcy5jaGFubmVsQXBpfS9tZS9jaGFuZ2UtcGFzc3dvcmRgO1x0XHJcblx0fVxyXG5cclxuXHJcblx0cHVibGljIHdpbmRvdz86IFdpbmRvdztcclxuXHRwdWJsaWMgbG9jYWxTdG9yYWdlPzogU3RvcmFnZTtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcblx0XHRcdHRoaXMud2luZG93ID0gd2luZG93XHJcblx0XHRcdHRoaXMubG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5sb2FkVG9rZW5Gcm9tU3RvcmFnZSgpO1xyXG5cdFx0dGhpcy5fY3VzdG9tZXJTdWJqZWN0Lm5leHQodGhpcy5nZXRDdXN0b21lcigpKTtcclxuXHRcdHRoaXMuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5fbG9nZ2VkSW5TdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIExvZ3VlYSBhbCB1c3VhcmlvIGVuIGxhIGFwbGljYWNpw7NuLlxyXG5cdCAqIEBwYXJhbSB1c2VyIGRhdG9zIGRlbCB1c3VhcmlvXHJcblx0ICogQHBhcmFtIHdpdGhSb2xlcyByb2xlcyBkZWwgdXN1YXJpb1xyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdGxvZ2luKHVzZXI6IHsgdXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9LCB3aXRoUm9sZXM6IFVzZXJSb2xlVHlwZVtdID0gW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0dGhpcy5fY2hhbm5lbCQuc3Vic2NyaWJlKGNoID0+IHRoaXMuY2hhbm5lbCA9IGNoKTtcclxuXHRcdHRoaXMuY2hhbm5lbHMkLnN1YnNjcmliZShjaCA9PiB0aGlzLmNoYW5uZWxzID0gY2gpO1xyXG5cdFx0dGhpcy5fbG9nZ2luZ0luU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cdFx0dXNlciA9IHsgLi4udXNlciwgLi4udGhpcy5sb2dpbkV4dHJhRGF0YSgpIH1cclxuXHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uLnBvc3QodGhpcy50b2tlbkFwaSgpLCB1c2VyKS5waXBlKFxyXG5cdFx0XHRtYXAoKHJlczogYW55KSA9PiB7XHJcblx0XHRcdFx0aWYgKHRoaXMuY2hhbm5lbEFjY2Vzc1Blcm1pc3Npb24oeyAuLi51c2VyLCAuLi5yZXMgfSkgJiYgdGhpcy5pc0FsbG93ZWRSb2xlKHdpdGhSb2xlcywgcmVzLnR5cGUpKSB7XHJcblx0XHRcdFx0XHR0aGlzLmRvTG9naW5Vc2VyKHsgLi4udXNlciwgLi4ucmVzIH0pO1xyXG5cdFx0XHRcdFx0cmV0dXJuICdvayc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiAnZXJyb3InO1xyXG5cdFx0XHR9KSxcclxuXHRcdFx0Y2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuX2xvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XHJcblx0XHRcdFx0cmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpOyAvLyA8LS0gUHJvcGFnYSBlbCBlcnJvciByZWFsXHJcblx0XHRcdH0pXHJcblx0XHQpXHJcblx0fVxyXG5cclxuXHR1cGRhdGVQYXNzd29yZChjdXJyZW50UGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgY29uZmlybVBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgXHJcbiAgICAvLyBDcmVhbW9zIHVuIG9iamV0byBwbGFubyBub3JtYWwsIHNpbiBIdHRwUGFyYW1zXHJcbiAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGN1cnJlbnRQYXNzd29yZDogY3VycmVudFBhc3N3b3JkLFxyXG4gICAgICAgIG5ld1Bhc3N3b3JkOiBuZXdQYXNzd29yZCxcclxuICAgICAgICBjb25maXJtUGFzc3dvcmQ6IGNvbmZpcm1QYXNzd29yZFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBVc2Ftb3MgVFUgc2VydmljaW8gb3JpZ2luYWwgcGFyYSBxdWUgZW52w61lIGVsIHRva2VuIHkgZm9ybWF0ZWUgYSBKU09OIGF1dG9tw6F0aWNvXHJcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5wdXQodGhpcy5zZWN1cml0eVVybCgpLCBwYXlsb2FkKTtcclxufVxyXG5cclxuXHQvKipcclxuXHQgKiBDb250cm9sYSBxdWUgZWwgdXN1YXJpbyBsb2d1ZWFkbyB0ZW5nYSBwZXJtaXNvcyBcclxuXHQgKiBwYXJhIGVsIGNhbmFsIGFjdHVhbCBkZSBsYSBhcGxpY2FjacOzbi5cclxuXHQgKiBAcGFyYW0gcmVzIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgY2hhbm5lbEFjY2Vzc1Blcm1pc3Npb24ocmVzOiBhbnkpIHtcclxuXHRcdHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KFtdKTtcclxuXHJcblx0XHQvKiBObyBhdXRob3JpemVkIGNoYW5uZWxzICovXHJcblx0XHRpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdH1cclxuXHRcdC8qIFNvbWUgYXV0aG9yaXplZCBjaGFubmVsKHMpIGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuXHRcdGlmIChyZXMuY2hhbm5lbHMuZmluZCgodXNlcmNoYW5uZWw6IGFueSkgPT4gdXNlcmNoYW5uZWwuY29kZSA9PT0gdGhpcy5jaGFubmVsLmNvZGUpKSB7XHJcblx0XHRcdC8qIE11bHRpcGxlIGF1dGhvcml6ZWQgY2hhbm5lbHMgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xyXG5cdFx0XHRpZiAocmVzLmNoYW5uZWxzPy5sZW5ndGggPiAxICYmIHRoaXMuX2FjdGl2ZUNoYW5uZWxDaGFuZ2UpXHJcblx0XHRcdFx0dGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0Lm5leHQocmVzLmNoYW5uZWxzKVxyXG5cdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0fVxyXG5cdFx0LyogT25lIGF1dGhvcml6ZWQgY2hhbm5lbCBub3QgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xyXG5cdFx0aWYgKHJlcy5jaGFubmVscz8ubGVuZ3RoID09IDEgJiYgdGhpcy5fYWN0aXZlQ2hhbm5lbENoYW5nZSkge1xyXG5cdFx0XHRkZWxldGUgcmVzLnBhc3N3b3JkXHJcblx0XHRcdHRoaXMuY2hhbm5lbEFjY2VzcyhyZXMuY2hhbm5lbHNbMF0sIHJlcylcclxuXHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdH1cclxuXHRcdC8qIE11bHRpcGxlIGF1dGhvcml6ZWQgY2hhbm5lbHMgbm90IGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuXHRcdGlmICh0aGlzLl9hY3RpdmVDaGFubmVsQ2hhbmdlKSB7XHJcblx0XHRcdHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KHJlcy5jaGFubmVscylcclxuXHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDb250cm9sYSBlbCBhY2Nlc28gYWwgY2FuYWwsIGRlIHNlciBvdHJvIG51ZXZvIGNhbWJpYSBsb3MgdmFsb3Jlcy5cclxuXHQgKiBAcGFyYW0gY2hhbm5lbCBcclxuXHQgKiBAcGFyYW0gdXNlciBcclxuXHQgKi9cclxuXHRjaGFubmVsQWNjZXNzKGNoYW5uZWw6IGFueSwgdXNlciA9IG51bGwpIHtcclxuXHRcdGlmICh0aGlzLndpbmRvdz8ubG9jYXRpb24uaG9zdG5hbWUgIT0gY2hhbm5lbC5ob3N0bmFtZSkge1xyXG5cdFx0XHRsZXQgZW5jb2RlZCA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkodXNlciAhPSBudWxsID8gdXNlciA6IHRoaXMuX3VzZXIpKVxyXG5cdFx0XHR0aGlzLndpbmRvdz8ubG9jYXRpb24ucmVwbGFjZShgJHt0aGlzLndpbmRvdz8ubG9jYXRpb24ucHJvdG9jb2x9Ly8ke2NoYW5uZWwuaG9zdG5hbWV9L2F1dGgvcmVkaXJlY3QvJHtlbmNvZGVkfWApXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLl9jb25zdGFudHMubW9kaWZ5Q2hhbm5lbENvbmZpZyhjaGFubmVsKVxyXG5cdFx0XHR0aGlzLndpbmRvdz8ubG9jYXRpb24ucmVsb2FkKClcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcblx0ICogQ29udHJvbGEgcXVlIGVsIHJvbCBkZWwgdXN1YXJpbyBzZWEgdW4gcm9sIHBlcm1pdGlkbyBwb3IgbGEgYXBsaWNhY2nDs24uXHJcblx0ICogQHBhcmFtIGFsbG93ZWRSb2xlcyByb2xlcyBxdWUgcGVybWl0ZSBsYSBhcGxpY2FjacOzbi5cclxuXHQgKiBAcGFyYW0gcm9sZSByb2wgZGVsIHVzdWFyaW9zXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpc0FsbG93ZWRSb2xlKGFsbG93ZWRSb2xlczogVXNlclJvbGVUeXBlW10sIHJvbGU6IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIGFsbG93ZWRSb2xlcy5sZW5ndGhcclxuXHRcdFx0PyBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZSBhcyBVc2VyUm9sZVR5cGUpXHJcblx0XHRcdDogdHJ1ZVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUcmFzIHVuIGxvZ3VlbyBleGl0b3NvLCBndWFyZGEgbG9zIGRhdG9zIG5lY2VzYXJpb3MgZW4gZWwgc3RvcmFnZSB5IGRlbcOhc1xyXG5cdCAqIGNvbmZpZ3VyYWNpb25lcyBuZWNlc2FyaWFzLlxyXG5cdCAqIEBwYXJhbSB0b2tlbnMgXHJcblx0ICovXHJcblx0cHJpdmF0ZSBkb0xvZ2luVXNlcih0b2tlbnM6IGFueSkge1xyXG5cdFx0dGhpcy5fdXNlciA9IG5ldyBVc2VyKClcclxuXHRcdHRoaXMuX3VzZXIuaW5pdGlsaXplZCh0b2tlbnMpXHJcblx0XHR0aGlzLl9jdXN0b21lciA9IG51bGw7XHJcblx0XHR0aGlzLl9jdXN0b21lclN1YmplY3QubmV4dChudWxsKTtcclxuXHJcblx0XHR0aGlzLmZvcmNlQ2hhbm5lbHNGb3JTZWxsZXIodG9rZW5zKVxyXG5cdFx0Ly9DaGFubmVsXHJcblx0XHRjb25zdCB1c2VySnNvbmlmeSA9IHRoaXMuX3VzZXIuanNvbmlmeSgpXHJcblx0XHR0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlVTRVIsIEpTT04uc3RyaW5naWZ5KHVzZXJKc29uaWZ5KSlcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuRVhQSVJBVEVTX0lOLCBtb21lbnQodG9rZW5zLmV4cGlyZV9pbikuYWRkKDEsICdoJykuZm9ybWF0KCkpO1xyXG5cdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOLCBtb21lbnQodG9rZW5zLmV4cGlyZV9pbikuYWRkKDEsICdoJykuZm9ybWF0KCkpO1xyXG5cdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5KV1RfVE9LRU4sIHRva2Vucy50b2tlbik7XHJcblx0XHR0aGlzLl9hdXRoU3RvcmFnZS5zZXRBdXRoVG9rZW4odG9rZW5zLnRva2VuKVxyXG5cdFx0dGhpcy5fdG9rZW5TaWduYWwuc2V0KHRva2Vucy50b2tlbik7XHJcblx0XHR0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLk1BSUwsIHRva2Vucy51c2VybmFtZSk7XHJcblx0XHQvL09ic2VydmFibGVzXHJcblx0XHR0aGlzLl91c2VySW5TdWJqZWN0Lm5leHQodGhpcy5fdXNlcik7XHJcblx0XHR0aGlzLl9sb2dnZWRJblN1YmplY3QubmV4dCh0cnVlKTtcclxuXHRcdHRoaXMuX2xvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIENhbWJpYSBsYSBmdW5jaW9uIHF1ZSBzZSBlbmNhcmdhIGRlIHJlc29sdmVyIGhhY2lhIGRvbmRlIHNlIHJlZGlyaWdlIGVsIGZyb250ZW5kXHJcblx0ICogdHJhcyB1bmEgYWNjacOzblxyXG5cdCAqIEBwYXJhbSByZXNvbHZlckZ1bmN0aW9uIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXRIb21lUmVzb2x2ZXIocmVzb2x2ZXJGdW5jdGlvbjogYW55KSB7IHRoaXMuX2hvbWVSZXNvbHZlciA9IHJlc29sdmVyRnVuY3Rpb24gfVxyXG5cdC8qKlxyXG5cdCAqIE9idGllbmUgbGEgZnVuY2lvbiBxdWUgc2UgZW5jYXJnYSBkZSByZXNvbHZlciBoYWNpYSBkb25kZSBzZSByZWRpcmlnZSBlbCBmcm9udGVuZC5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0SG9tZVJlc29sdmVyKCkgeyByZXR1cm4gdGhpcy5faG9tZVJlc29sdmVyIH1cclxuXHQvKipcclxuXHQgKiBFamVjdXRhIGVsIHJlc29sdmVyIGRlIGhvbWUgY29uZmlndXJhZG8gcG9yIGVsIGZyb250ZW5kIG8gdXNhIHVuIGZhbGxiYWNrLlxyXG5cdCAqIFNlIHVzYSB0YW50byBlbiBsb2dpbiBjb21vIGVuIGxvZ291dCBwYXJhIGV2aXRhciBoYXJkY29kZXMgcG9yIGNvbXBvbmVudGUuXHJcblx0ICovXHJcblx0cHVibGljIHJlc29sdmVIb21lTmF2aWdhdGlvbihmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgcmVzb2x2ZXJGdW5jdGlvbiA9IHRoaXMuZ2V0SG9tZVJlc29sdmVyKCk7XHJcblx0XHRyZXNvbHZlckZ1bmN0aW9uXHJcblx0XHRcdD8gcmVzb2x2ZXJGdW5jdGlvbigpXHJcblx0XHRcdDogZmFsbGJhY2soKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogT2J0aWVuZSBlbCB0b2tlbiBkZWwgc3RvcmFnZSB5IGxvIGd1YXJkYSBlbiBsYSBzaWduYWwuXHJcblx0ICovXHJcblx0cHVibGljIGxvYWRUb2tlbkZyb21TdG9yYWdlKCkge1xyXG5cdFx0Y29uc3QgdG9rZW4gPSB0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkpXVF9UT0tFTik7XHJcblx0XHRpZiAodG9rZW4pIHtcclxuXHRcdFx0dGhpcy5fdG9rZW5TaWduYWwuc2V0KHRva2VuKTtcclxuXHRcdH1cclxuXHR9XHJcblx0LyoqXHJcblx0ICogRGVzbG9ndWVhIGFsIHVzdWFyaW8uXHJcblx0ICovXHJcblx0cHVibGljIGxvZ291dCgpIHtcclxuXHRcdHRoaXMuZG9Mb2dvdXRVc2VyKCk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIFJldG9ybmEgc2kgaGF5IHVuIHVzdWFyaW8gbG9ndWVhZG8gbyBuby5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xyXG5cdFx0Y29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XHJcblx0XHRpZiAoIXRva2VuKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5pc1Rva2VuRXhwaXJlZCgpKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmdldEN1cnJlbnRVc2VyQXNVc2VyKCk7XHJcblx0XHRyZXR1cm4gdGhpcy5fdXNlciAhPSBudWxsO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBSZXRvcm5hIGVsIHRva2VuIGRlIHVzdWFyaW9cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0VG9rZW4oKTogYW55IHtcclxuXHRcdHJldHVybiB0aGlzLl90b2tlblNpZ25hbCgpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBMaW1waWEgZWwgc3RvcmFnZSB5IGxhcyBjb25maWd1cmFjaW9uZXMgaW50ZXJuYXNcclxuXHQgKi9cclxuXHRwdWJsaWMgZG9Mb2dvdXRVc2VyKCkge1xyXG5cdFx0dGhpcy5fdXNlciA9IG51bGxcclxuXHRcdHRoaXMuX2N1c3RvbWVyID0gbnVsbDtcclxuXHRcdHRoaXMuX2N1c3RvbWVyU3ViamVjdC5uZXh0KG51bGwpO1xyXG5cdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5VU0VSKTtcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuRVhQSVJBVEVTX0lOKTtcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuSldUX1RPS0VOKTtcclxuXHRcdHRoaXMuX2F1dGhTdG9yYWdlLnNldEF1dGhUb2tlbihudWxsKTtcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTik7XHJcblx0XHR0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xyXG5cdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NhcnRfb3duZXInKTtcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuTUFJTCk7XHJcblx0XHR0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUwpO1xyXG5cdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKTtcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuTE9DQUxFKTtcclxuXHRcdHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VTVE9NRVIpO1xyXG5cdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ01BU1RFUl9DSEFOTkVMJyk7XHJcblx0XHR0aGlzLl9sb2dnZWRJblN1YmplY3QubmV4dChmYWxzZSk7XHJcblx0XHR0aGlzLl91c2VySW5TdWJqZWN0Lm5leHQodGhpcy5fdXNlcik7XHJcblx0XHR0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChbXSlcclxuXHRcdHRoaXMuX3Rva2VuU2lnbmFsLnNldChudWxsKVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXZ1ZWx2ZSBgdHJ1ZWBzaSBlbCB0b2tlbiBleHBpcm8sIGBmYWxzZWAgY2FzbyBjb250cmFyaW8uXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHJpdmF0ZSBpc1Rva2VuRXhwaXJlZCgpIHtcclxuXHRcdGNvbnN0IGZlY2hhX2V4cGlyYWNpb24gPSB0aGlzLmdldEV4cGlyYXRlc0F0KCk7XHJcblx0XHRjb25zdCByZXN1bHQgPSBtb21lbnQoKSA+PSBtb21lbnQoZmVjaGFfZXhwaXJhY2lvbik7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBPYnRpZW5lIGxhIGZlY2hhIGRlIGV4cGlyYWNpw7NuIGRlbCB0b2tlbi5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwcml2YXRlIGdldEV4cGlyYXRlc0F0KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuRVhQSVJBVEVTX0lOKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogT2J0aWVuZSBhbCB1c3VhcmlvIGFjdHVhbCB5IGxvIGNvbnZpZXJ0ZSBlbiB1bmEgaW5zdGFuY2lhIGRlIGBVc2VyYFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTogVXNlciB8IG51bGwge1xyXG5cdFx0dGhpcy5fdXNlciA9IG5ldyBVc2VyKCk7XHJcblx0XHRjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRVc2VyRnJvbVN0b3JhZ2UoKTtcclxuXHRcdGlmICghbG9hZGVkKSB7XHJcblx0XHRcdHRoaXMuX3VzZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSBpZiAodGhpcy5fdXNlcj8uY2hhbm5lbHMuZmluZCgodXNlcmNoYW5uZWw6IGFueSkgPT4gdXNlcmNoYW5uZWw/LmNvZGUgPT09IHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMKSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5fdXNlcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIFNpIGhheSBjbGllbnRlIGFjdGl2byAoaW1wZXJzb25hY2nDs24gZGUgc2VsbGVyKSwgZWwgY2FuYWwgcHVlZGUgc2VyXHJcblx0XHRcdC8vIGVsIGRlbCBjbGllbnRlIHkgbm8gbmVjZXNhcmlhbWVudGUgdW5vIGRlbCB2ZW5kZWRvci5cclxuXHRcdFx0Ly8gRW4gZXNlIGNhc28gbm8gaW52YWxpZGFtb3Mgc2VzacOzbiBwb3IgbWlzbWF0Y2ggZGUgY2FuYWwuXHJcblx0XHRcdGlmICh0aGlzLmdldEN1c3RvbWVyKCkpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fdXNlcjtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmxvZ291dCgpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMuX3VzZXI7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIE9idGllbmUgZWwgdXN1YXJpbyBkZWwgc3RvcmFnZS5cclxuXHQgKiBAcGFyYW0ga2V5IFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgbG9hZFVzZXJGcm9tU3RvcmFnZShrZXkgPSB0aGlzLlVTRVIpIHtcclxuXHRcdGNvbnN0IHN0b3JlZCA9IHRoaXMuX2xvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcblx0XHRpZiAoc3RvcmVkKSB7XHJcblx0XHRcdHRyeSB7XHJcblx0XHRcdFx0Y29uc3QgdXNlck9iaiA9IEpTT04ucGFyc2Uoc3RvcmVkKTtcclxuXHRcdFx0XHR0aGlzLl91c2VyID0gT2JqZWN0LmFzc2lnbihuZXcgVXNlcigpLCB1c2VyT2JqKTsgLy8gPC0tIEFzw60gcmVjdXBlcmFzIGxvcyBtw6l0b2RvcyBkZSBVc2VyXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuXHR9XHJcblxyXG5cdHBhc3N3b3JkUmVzZXQgPSAobmV3X3Bhc3N3b3JkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IHtcclxuXHJcblx0XHRjb25zdCBkYXRhID0geyBwYXNzd29yZDogeyBmaXJzdDogbmV3X3Bhc3N3b3JkLCBzZWNvbmQ6IG5ld19wYXNzd29yZCB9IH07XHJcblx0XHRjb25zb2xlLmxvZyh0aGlzLnJlc2V0UGFzc3dvcmRBcGkodG9rZW4pLCBkYXRhKVxyXG5cdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24ucHV0KHRoaXMucmVzZXRQYXNzd29yZEFwaSh0b2tlbiksIGRhdGEpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBFbnZpYSBsYSBzb2xpY2l0dWQgcGFyYSBjYW1iaWFyIGxhIGNvbnRyYXNlw7FhLlxyXG5cdCAqIEBwYXJhbSBlbWFpbCBlbWFpbCBkZWwgc29saWNpdGFudGUuXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cmVjb3ZlclBhc3N3b3JkKGVtYWlsOiBzdHJpbmcpIHtcclxuXHRcdHJldHVybiB0aGlzLl9jb25uZWN0aW9uLnB1dCh0aGlzLnJlY292ZXJQYXNzd29yZEFwaSgpLCB7IGVtYWlsIH0pO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBQYXJhIGNvbmZpcm1hciBlbCByZWdpc3RybyBkZSB1c3VhcmlvLlxyXG5cdCAqIEBwYXJhbSB0b2tlbiBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRjb25maXJtQWNjb3VudCh0b2tlbjogc3RyaW5nKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5nZXQodGhpcy5jb25maXJtQWNjb3VudEFwaSh0b2tlbikpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBQYXJhIHJlZ2lzdHJhciBhIHVuIHVzdWFyaW8gY29tw7puXHJcblx0ICogQHBhcmFtIGRhdGEgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c2luZ1VwKGRhdGE6IGFueSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZ2lzdGVyQXBpKCksIGRhdGEpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBQYXJhIHJlZ2lzdHJhciBhIHVuIHVzdWFyaW8gbWF5b3Jpc3RhLlxyXG5cdCAqIEBwYXJhbSBkYXRhIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHNpZ25VcFdob2xlc2FsZXIoZGF0YTogYW55KSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5wb3N0KHRoaXMucmVnaXN0ZXJXaG9sZXNhbGVyQXBpKCksIGRhdGEpO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBDaGVxdWVhIHNpIHVuIHVzdWFyaW8gZXN0YSBoYWJpbGl0YWRvIGEgY29tcHJhciBvIG5vLlxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdC8vIGlzQWJsZVRvQnV5KCk6Ym9vbGVhbiB7XHJcblx0Ly8gXHRjb25zdCBjdXJyZW50VXNlciA9IHRoaXMuZ2V0VXNlclByb2ZpbGVBc1VzZXIoKSBhcyBVc2VyO1xyXG5cdC8vIFx0Y29uc3QgaXNTZWxsZXIgPSBjdXJyZW50VXNlci50eXBlVXNlciAmJiBjdXJyZW50VXNlci50eXBlVXNlciA9PSAnc2VsbGVyJyB8fCBmYWxzZVxyXG5cdC8vIFx0cmV0dXJuICFpc1NlbGxlciB8fCAhdGhpcy5nZXRDdXN0b21lcigpO1xyXG5cdC8vIH1cclxuXHRwdWJsaWMgaXNBYmxlVG9CdXkgPSAoKTogYm9vbGVhbiA9PiAhdGhpcy5nZXRVc2VyUHJvZmlsZVNuYXBzaG90KCk/LmlzU2VsbGVyKCkgfHwgISF0aGlzLmdldEN1c3RvbWVyKClcclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgYWNjZWRlci92ZXIgZWwgZGFzaGJvYXJkIGRlIHZlbmRlZG9yLlxyXG5cdCAqIEVuIFNTUiBzaWVtcHJlIGRldnVlbHZlIGZhbHNlIHBhcmEgZXZpdGFyIGFjY2Vzb3MgYSBzdG9yYWdlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjYW5BY2Nlc3NTZWxsZXJEYXNoYm9hcmQoKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBmYWxzZTtcclxuXHRcdGNvbnN0IHVzZXIgPSB0aGlzLmdldFVzZXJQcm9maWxlU25hcHNob3QoKTtcclxuXHRcdGNvbnN0IGhhc0N1c3RvbWVycyA9ICEhdXNlcj8uY3VzdG9tZXJzPy5sZW5ndGg7XHJcblx0XHRjb25zdCBpc1NlbGxlciA9ICEhdXNlcj8uaXNTZWxsZXIoKTtcclxuXHRcdGNvbnN0IGhhc0FjdGl2ZUN1c3RvbWVyID0gISF0aGlzLmdldEN1c3RvbWVyKCk7XHJcblx0XHRyZXR1cm4gaXNTZWxsZXIgfHwgaGFzQ3VzdG9tZXJzIHx8IGhhc0FjdGl2ZUN1c3RvbWVyO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhIHNpIGRlYmUgbW9zdHJhcnNlIGVsIGFjY2VzbyBhIFwiTWkgY3VlbnRhXCIgZW4gZWwgbWVuw7ogZGVsIGhlYWRlci5cclxuXHQgKiAtIENsaWVudGVzIG5vcm1hbGVzOiBzaWVtcHJlIHRydWUgY3VhbmRvIGVzdMOhbiBsb2d1ZWFkb3MuXHJcblx0ICogLSBWZW5kZWRvcmVzOiB0cnVlIHNvbG8gY3VhbmRvIG9wZXJhbiBjb24gdW4gY2xpZW50ZSBzZWxlY2Npb25hZG8uXHJcblx0ICovXHJcblx0cHVibGljIGNhbkFjY2Vzc015QWNjb3VudE1lbnUoKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBmYWxzZTtcclxuXHRcdGNvbnN0IHVzZXIgPSB0aGlzLmdldFVzZXJQcm9maWxlU25hcHNob3QoKTtcclxuXHRcdGNvbnN0IGlzU2VsbGVyID0gISF1c2VyPy5pc1NlbGxlcigpO1xyXG5cdFx0aWYgKCFpc1NlbGxlcikgcmV0dXJuIHRydWU7XHJcblx0XHRyZXR1cm4gISF0aGlzLmdldEN1c3RvbWVyKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTbmFwc2hvdCBkZSB1c3VhcmlvIHNpbiBzaWRlLWVmZmVjdHMgKG5vIGRpc3BhcmEgbG9nb3V0KS5cclxuXHQgKiBTZSB1c2EgZW4gaGVscGVycyBkZSBVSSBwYXJhIGV2aXRhciBsb29wcyBkZSByZW5kZXIuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBnZXRVc2VyUHJvZmlsZVNuYXBzaG90KCk6IFVzZXIgfCBudWxsIHtcclxuXHRcdGlmICh0aGlzLl91c2VyKSByZXR1cm4gdGhpcy5fdXNlcjtcclxuXHRcdGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZFVzZXJGcm9tU3RvcmFnZSgpO1xyXG5cdFx0cmV0dXJuIGxvYWRlZCA/IHRoaXMuX3VzZXIgOiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0b3JuYSB1biB1c3VhcmlvIGRlIHRpcG8gY2xpZW50ZS5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRnZXRDdXN0b21lcigpOiBhbnkgfCBudWxsIHtcclxuXHRcdGlmICh0aGlzLl9jdXN0b21lcikgcmV0dXJuIHRoaXMuX2N1c3RvbWVyO1xyXG5cdFx0Y29uc3Qgc3RvcmVkID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DVVNUT01FUik7XHJcblx0XHRpZiAoIXN0b3JlZCkgcmV0dXJuIG51bGw7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aGlzLl9jdXN0b21lciA9IEpTT04ucGFyc2Uoc3RvcmVkKTtcclxuXHRcdFx0cmV0dXJuIHRoaXMuX2N1c3RvbWVyO1xyXG5cdFx0fSBjYXRjaCB7XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGV2dWVsdmUgbGEgbGxhdmUgZXN0YWJsZSBxdWUgaWRlbnRpZmljYSBlbCBjYXJyaXRvIGFjdGl2byBkZSBsYSBzZXNpw7NuIGFjdHVhbC5cclxuXHQgKiBTZSB1c2EgcGFyYSBldml0YXIgcmV1c2FyIGBjYXJ0X3Rva2VuYCBkZSBvdHJvIHVzdWFyaW8vY3VlbnRhLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRDYXJ0U2Vzc2lvbk93bmVyS2V5KCk6IHN0cmluZyB8IG51bGwge1xyXG5cdFx0Y29uc3QgY3VzdG9tZXIgPSB0aGlzLmdldEN1c3RvbWVyKCk7XHJcblx0XHRpZiAoY3VzdG9tZXI/LmlkICE9IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGBjdXN0b21lcjoke2N1c3RvbWVyLmlkfWA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgdXNlciA9IHRoaXMuZ2V0VXNlclByb2ZpbGVTbmFwc2hvdCgpO1xyXG5cdFx0aWYgKHVzZXI/LnVzZXJuYW1lKSB7XHJcblx0XHRcdHJldHVybiBgdXNlcjoke3VzZXIudXNlcm5hbWUudG9Mb3dlckNhc2UoKX1gO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBEZXZ1ZWx2ZSBlbCB1c3VhcmlvIGFjdHVhbCBsb2d1ZWFkby5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRnZXRVc2VyUHJvZmlsZUFzVXNlcigpOiBVc2VyIHtcclxuXHRcdHJldHVybiB0aGlzLl91c2VyISBhcyBVc2VyIHx8IHRoaXMuZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTtcclxuXHR9XHJcblx0LyoqXHJcblx0ICogQWdyZWdhIGRhdGEgZXh0cmEgYWwgb2JqZWN0byBkZSBVc3VhcmlvLlxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdGxvZ2luRXh0cmFEYXRhID0gKCkgPT4ge1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0Y2xpZW50X2lkOiAnZGVtb19jbGllbnQnLFxyXG5cdFx0XHRjbGllbnRfc2VjcmV0OiAnc2VjcmV0X2RlbW9fY2xpZW50JyxcclxuXHRcdFx0Z3JhbnRfdHlwZTogJ3Bhc3N3b3JkJ1xyXG5cdFx0fVxyXG5cdH1cclxuXHQvKiBQbGVhc2UgcmVtb3ZlIHRoaXMgQVNBUCAtIE5lZWRzICpjaGFubmVscyogYXJyYXkgaW4gdXNlciBvYmplY3QgQUxXQVlTICovXHJcblx0cHJpdmF0ZSBmb3JjZUNoYW5uZWxzRm9yU2VsbGVyKHRva2VuczogYW55KSB7XHJcblx0XHRpZiAoVXNlclJvbGVUeXBlLlNFTExFUiA9PSB0b2tlbnMudHlwZSBhcyBVc2VyUm9sZVR5cGUpXHJcblx0XHRcdHRoaXMuY2hhbm5lbHM/Lmxlbmd0aFxyXG5cdFx0XHRcdD8gdGhpcy5fdXNlciEuc2V0Q2hhbm5lbHMoLi4udGhpcy5jaGFubmVscylcclxuXHRcdFx0XHQ6IHRoaXMuX3VzZXIhLnNldENoYW5uZWxzKHRoaXMuY2hhbm5lbClcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCogQ2FyZ2EgZWwgY2xpZW50ZSBjb24gZWwgcXVlIHNlIHJlYWxpemFyYW4gcGVkaWRvcy4gU2kgcmVjaWJlIGVsIHZhbG9yIG51bGxcclxuXHQqIHNlIHZ1ZWx2ZSBhIGNhcmdhciBlbCB2ZW5kZWRvciBwYXJhIHN1IHVzby4gIFxyXG5cdCogQHBhcmFtIGN1c3RvbWVyIFxyXG5cdCovXHJcblx0cHVibGljIHNldEN1c3RvbWVyKGN1c3RvbWVyOiBhbnkpIHtcclxuXHRcdHRoaXMuX2N1c3RvbWVyID0gY3VzdG9tZXIgPz8gbnVsbDtcclxuXHJcblx0XHRpZiAoY3VzdG9tZXIpIHtcclxuXHRcdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DVVNUT01FUiwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tZXIpKVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DVVNUT01FUik7XHJcblx0XHRcdHRoaXMuX2N1c3RvbWVyID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBjdXN0b21lckNoYW5uZWwgPSBjdXN0b21lcj8uY2hhbm5lbHM/LlswXTtcclxuXHRcdGNvbnN0IGN1c3RvbWVyQ2hhbm5lbENvZGUgPSBjdXN0b21lckNoYW5uZWw/LmNvZGU7XHJcblx0XHRjb25zdCBjdXN0b21lckxvY2FsZUNvZGUgPSBjdXN0b21lckNoYW5uZWw/LmxvY2FsZXM/LmNvZGU7XHJcblx0XHRjb25zdCBzYW1lQ2hhbm5lbCA9IGN1c3RvbWVyQ2hhbm5lbENvZGUgJiYgY3VzdG9tZXJMb2NhbGVDb2RlXHJcblx0XHRcdD8gdGhpcy5zYW1lQ2hhbm5lbChjdXN0b21lckNoYW5uZWxDb2RlLCBjdXN0b21lckxvY2FsZUNvZGUpXHJcblx0XHRcdDogbnVsbFxyXG5cclxuXHRcdGlmIChjdXN0b21lcikge1xyXG5cdFx0XHRpZiAoIXNhbWVDaGFubmVsICYmIGN1c3RvbWVyQ2hhbm5lbENvZGUgJiYgY3VzdG9tZXJMb2NhbGVDb2RlKSB7XHJcblx0XHRcdFx0IXRoaXMuX2xvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUikgP1xyXG5cdFx0XHRcdFx0dGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSLCBKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0XHRcdGNoYW5uZWw6IHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMLFxyXG5cdFx0XHRcdFx0XHRsb2NhbGU6IHRoaXMuX2FwaUNvbnN0cy5MT0NBTEVcclxuXHRcdFx0XHRcdH0pKSA6IG51bGw7XHJcblx0XHRcdFx0dGhpcy5jaGFuZ2VDaGFubmVsKHtcclxuXHRcdFx0XHRcdGNoYW5uZWw6IGN1c3RvbWVyQ2hhbm5lbENvZGUsXHJcblx0XHRcdFx0XHRsb2NhbGU6IGN1c3RvbWVyTG9jYWxlQ29kZVxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxldCByZXMgPSBudWxsO1xyXG5cdFx0XHRjb25zdCBzdG9yZWQgPSB0aGlzLl9sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpO1xyXG5cdFx0XHRpZiAoc3RvcmVkKSB7XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHJlcyA9IEpTT04ucGFyc2Uoc3RvcmVkKTtcclxuXHRcdFx0XHR9IGNhdGNoIHtcclxuXHRcdFx0XHRcdHJlcyA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChyZXMpIHtcclxuXHRcdFx0XHRpZiAoIXRoaXMuc2FtZUNoYW5uZWwocmVzLmNoYW5uZWwsIHJlcy5sb2NhbGUpKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNoYW5nZUNoYW5uZWwocmVzKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUxTRUxMRVIpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvL3RoaXMuX2NhcnRTZXJ2aWNlLmNsZWFyQW5kUmVzZXRDdXN0b21lckNhcnQoKVxyXG5cdFx0dGhpcy5fY3VzdG9tZXJTdWJqZWN0Lm5leHQodGhpcy5fY3VzdG9tZXIgPz8gbnVsbCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wcnVlYmEgc2kgbG9zIHZhbG9yZXMgZGVsIGNhbmFsIGFjdHVhbCBzb24gaWd1YWxlcyBhIGxvcyBpbmdyZXNhZG8gcG9yIHBhcmFtZXRyb3MuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNoYW5uZWwgTm9tYnJlIGRlbCBjYW5hbFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbGUgIExvY2FsZSBkZWwgY2FuYWxcclxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBzaSBlcyBlbCBtaXNtbyBjYW5hbCwgRmFsc2UgY2FzbyBjb250cmFyaW8uXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzYW1lQ2hhbm5lbCA9IChjaGFubmVsOiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nKTogYm9vbGVhbiA9PiAoY2hhbm5lbCA9PSB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTCkgJiYgKGxvY2FsZSA9PSB0aGlzLl9hcGlDb25zdHMuTE9DQUxFKVxyXG5cclxuXHQvKipcclxuXHQgKiBDYW1iaWEgZGUgY2FuYWxcclxuXHQgKiBAcGFyYW0gY2hhbm5lbENvbmZpZyBkZWJlIHNlciB1biBvYmpldG8gcXVlIGNvbnRlbmdhIGFsIG1lbm9zIGxhcyBrZXlzIGNoYW5uZWwgeSBsb2NhbGUuXHJcblx0ICovXHJcblx0cHJpdmF0ZSBjaGFuZ2VDaGFubmVsID0gKGNoYW5uZWxDb25maWc6IGFueSkgPT4ge1xyXG5cdFx0dGhpcy5fY29uc3RhbnRzLm1vZGlmeUNoYW5uZWxDb25maWcoe1xyXG5cdFx0XHRjaGFubmVsOiBjaGFubmVsQ29uZmlnLmNoYW5uZWwsXHJcblx0XHRcdGxvY2FsZTogY2hhbm5lbENvbmZpZy5sb2NhbGUsXHJcblx0XHRcdGNoZWNrb3V0VmlldzogY2hhbm5lbENvbmZpZy5jaGVja291dFZpZXdcclxuXHRcdH0pXHJcblx0fVxyXG5cdGdldFVzZXJQcm9maWxlKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcclxuXHRcdHJldHVybiAodGhpcy5fdXNlciAmJiBvZih0aGlzLl91c2VyKSkgfHwgdGhpcy5nZXRDdXJyZW50VXNlcigpO1xyXG5cdH1cclxuXHRwcml2YXRlIGdldEN1cnJlbnRVc2VyKCk6IE9ic2VydmFibGU8VXNlciB8IG51bGw+IHtcclxuXHRcdHRoaXMuX3VzZXIgPSBuZXcgVXNlcigpO1xyXG5cdFx0aWYgKCF0aGlzLmxvYWRVc2VyRnJvbVN0b3JhZ2UoKSkge1xyXG5cdFx0XHR0aGlzLl91c2VyID0gbnVsbFxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG9mKHRoaXMuX3VzZXIpO1xyXG5cdH1cclxufVxyXG4iXX0=
601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLXNlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFHcEQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sV0FBVztJQUNaLGFBQWEsR0FBd0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDaEUsV0FBVyxHQUFzQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzRCxlQUFlLEdBQW1CLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6RCxVQUFVLEdBQXlCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2hFLFVBQVUsR0FB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QUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBQTEFURk9STV9JRCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVzZXJSb2xlVHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IsIHRhcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4vY2hhbm5lbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpQ29uc3RhbnRzU2VydmljZSwgQ29yZUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2F1dGguc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG4vKipcclxuICogU2VydmljaW8gZGUgYXV0ZW50aWZpY2FjacOzbiBkZWwgdXN1YXJpbyBlbiBsYSBwbGF0YWZvcm1hLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XHJcbiAgICBwcml2YXRlIF9sb2NhbFN0b3JhZ2U6IExvY2FsU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoTG9jYWxTdG9yYWdlU2VydmljZSlcclxuICAgIHByaXZhdGUgX2Nvbm5lY3Rpb246IENvbm5lY3Rpb25TZXJ2aWNlID0gaW5qZWN0KENvbm5lY3Rpb25TZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2NoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSA9IGluamVjdChDaGFubmVsU2VydmljZSk7XHJcbiAgICBwcml2YXRlIF9jb25zdGFudHM6IENvcmVDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KENvcmVDb25zdGFudHNTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2FwaUNvbnN0czogQXBpQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKTtcclxuICAgIHByaXZhdGUgX2F1dGhTdG9yYWdlOiBBdXRoU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoQXV0aFN0b3JhZ2VTZXJ2aWNlKTtcclxuICAgIFxyXG4gICAgLy8gQ29udGFudGVzIHBhcmEgZWwgc3RvcmFnZS5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgSldUX1RPS0VOID0gJ0pXVF9UT0tFTidcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVGUkVTSF9UT0tFTiA9ICdSRUZSRVNIX1RPS0VOJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBFWFBJUkFURVNfSU4gPSAnRVhQSVJBVEVTX0lOJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBVU0VSID0gJ1VTRVInXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IE1BSUwgPSAnbWFpbCdcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgTE9DQUxFID0gJ0xPQ0FMRSdcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgQ0hBTk5FTCA9ICdDSEFOTkVMJ1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBDVVNUT01FUiA9ICdDVVNUT01FUidcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgQ0hBTk5FTFNFTExFUiA9ICdDSEFOTkVMU0VMTEVSJ1xyXG5cclxuICAgIHByaXZhdGUgY2hhbm5lbHNVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKVxyXG4gICAgcHVibGljIGNoYW5uZWxzJCA9IHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKVxyXG4gICAgcHJpdmF0ZSBfY2hhbm5lbCQgPSB0aGlzLl9jaGFubmVsU2VydmljZS5nZXRDaGFubmVsKClcclxuICAgIHByaXZhdGUgX3VzZXJJblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXIgfCBudWxsPihudWxsKVxyXG4gICAgcHJpdmF0ZSBfbG9nZ2VkSW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHB1YmxpYyBsb2dnZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9sb2dnZWRJblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwcml2YXRlIF9sb2dnaW5nSW5TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHB1YmxpYyBsb2dnaW5nSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5fbG9nZ2luZ0luU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX2N1c3RvbWVyU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueSB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnkgfCBudWxsPihudWxsKTtcclxuICAgIHB1YmxpYyBjdXN0b21lciQ6IE9ic2VydmFibGU8YW55IHwgbnVsbD4gPSB0aGlzLl9jdXN0b21lclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhIGluZGljYXIgc2kgdW4gY2FuYWwgY2FtYmlvLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hY3RpdmVDaGFubmVsQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYSBsb3MgZGF0b3MgZGVsIHVzdWFyaW9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfdXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfY3VzdG9tZXI6IGFueSA9IG51bGw7XHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYSBsb3MgZGF0b3MgZGVsIGNhbmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGFubmVsOiBhbnkgPSBbXVxyXG4gICAgcHVibGljIGNoYW5uZWxzOiBhbnlbXSA9IFtdXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpemFkbyBwYXJhIHJlc29sdmVyIGhhY2lhIGRvbmRlIHNlIHRpZW5lIHF1ZSByZWRpcmVjY2lvbmFyXHJcbiAgICAgKiBsYSBwYWdpbmEgdHJhcyB1biBldmVudG8uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2hvbWVSZXNvbHZlcjogYW55O1xyXG4gICAgLyoqXHJcbiAgICAgKiBTaWduYWwgcGFyYSBndWFyZGFyIGVsIHRva2VuIGRlIHVzdWFyaW8gdW5hIHZleiBsb2d1ZWFkb1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF90b2tlblNpZ25hbCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuICAgIC8qKlxyXG4gICAgICogU2lnbmFsIHBhcmEgZ3VhcmRhciBlbCB1c3VhcmlvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3VzZXJTaWduYWwgPSBzaWduYWw8VXNlciB8IG51bGw+KG51bGwpO1xyXG4gICAgLy9BUElzXHJcbiAgICBwcml2YXRlIHNob3BBcGk6IHN0cmluZyA9IHRoaXMuX2FwaUNvbnN0cy5TSE9QX0FQSV9VUkxcclxuICAgIHByaXZhdGUgY2hhbm5lbEFwaTogc3RyaW5nID0gdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUxcclxuICAgIHByaXZhdGUgdG9rZW5BcGkoKSB7IHJldHVybiB0aGlzLnNob3BBcGkgKyAnbG9naW5fY2hlY2snIH1cclxuICAgIC8vIC0tLSBOVUVWTzogRW5kcG9pbnQgcGFyYSBlbCByZWZyZXNjbyBkZWwgdG9rZW4gLS0tXHJcbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlbkFwaSgpIHsgcmV0dXJuIHRoaXMuc2hvcEFwaSArICd0b2tlbi9yZWZyZXNoJyB9IFxyXG4gICAgcHJpdmF0ZSByZWNvdmVyUGFzc3dvcmRBcGkoKSB7IHJldHVybiBgJHt0aGlzLnNob3BBcGl9JHt0aGlzLmNoYW5uZWxBcGl9L3JlcXVlc3QtcGFzc3dvcmQtcmVzZXRgIH1cclxuICAgIHByaXZhdGUgcmVzZXRQYXNzd29yZEFwaSA9ICh0b2tlbjogc3RyaW5nKSA9PiBgJHt0aGlzLnNob3BBcGl9JHt0aGlzLmNoYW5uZWxBcGl9L3Bhc3N3b3JkLXJlc2V0LyR7dG9rZW59YDtcclxuICAgIHByaXZhdGUgY29uZmlybUFjY291bnRBcGkodG9rZW46IHN0cmluZykgeyByZXR1cm4gYCR7dGhpcy5zaG9wQXBpfSR7dGhpcy5jaGFubmVsQXBpfS92ZXJpZnktYWNjb3VudD90b2tlbj0ke3Rva2VufWAgfVxyXG4gICAgcHJpdmF0ZSByZWdpc3RlckFwaSgpIHsgcmV0dXJuIGAke3RoaXMuc2hvcEFwaX0ke3RoaXMuY2hhbm5lbEFwaX0vcmVnaXN0ZXJgIH1cclxuICAgIHByaXZhdGUgcmVnaXN0ZXJXaG9sZXNhbGVyQXBpKCkgeyByZXR1cm4gYCR7dGhpcy5zaG9wQXBpfSR7dGhpcy5jaGFubmVsQXBpfS9yZWdpc3Rlci13aG9sZXNhbGVyYCB9XHJcbiAgICBwcm90ZWN0ZWQgcGxhdGZvcm1JZDogYW55ID0gaW5qZWN0KFBMQVRGT1JNX0lEKVxyXG4gICAgcHJpdmF0ZSBzZWN1cml0eVVybCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBgJHt0aGlzLnNob3BBcGl9JHt0aGlzLmNoYW5uZWxBcGl9L21lL2NoYW5nZS1wYXNzd29yZGA7ICBcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgd2luZG93PzogV2luZG93O1xyXG4gICAgcHVibGljIGxvY2FsU3RvcmFnZT86IFN0b3JhZ2U7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2luZG93ID0gd2luZG93XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRUb2tlbkZyb21TdG9yYWdlKCk7XHJcbiAgICAgICAgdGhpcy5fY3VzdG9tZXJTdWJqZWN0Lm5leHQodGhpcy5nZXRDdXN0b21lcigpKTtcclxuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuX2xvZ2dlZEluU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9ndWVhIGFsIHVzdWFyaW8gZW4gbGEgYXBsaWNhY2nDs24uXHJcbiAgICAgKiBAcGFyYW0gdXNlciBkYXRvcyBkZWwgdXN1YXJpb1xyXG4gICAgICogQHBhcmFtIHdpdGhSb2xlcyByb2xlcyBkZWwgdXN1YXJpb1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGxvZ2luKHVzZXI6IHsgdXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyB9LCB3aXRoUm9sZXM6IFVzZXJSb2xlVHlwZVtdID0gW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHRoaXMuX2NoYW5uZWwkLnN1YnNjcmliZShjaCA9PiB0aGlzLmNoYW5uZWwgPSBjaCk7XHJcbiAgICAgICAgdGhpcy5jaGFubmVscyQuc3Vic2NyaWJlKGNoID0+IHRoaXMuY2hhbm5lbHMgPSBjaCk7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2luZ0luU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHVzZXIgPSB7IC4uLnVzZXIsIC4uLnRoaXMubG9naW5FeHRyYURhdGEoKSB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24ucG9zdCh0aGlzLnRva2VuQXBpKCksIHVzZXIpLnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoYW5uZWxBY2Nlc3NQZXJtaXNzaW9uKHsgLi4udXNlciwgLi4ucmVzIH0pICYmIHRoaXMuaXNBbGxvd2VkUm9sZSh3aXRoUm9sZXMsIHJlcy50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9Mb2dpblVzZXIoeyAuLi51c2VyLCAuLi5yZXMgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Vycm9yJztcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dpbmdJblN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBOVUVWTzogTcOpdG9kbyBwYXJhIHNvbGljaXRhciBlbCByZWZyZXNjbyBkZWwgdG9rZW4gLS0tXHJcbiAgICAvKipcclxuICAgICAqIFNvbGljaXRhIHVuIG51ZXZvIEpXVCB1c2FuZG8gZWwgcmVmcmVzaCB0b2tlbiBhbG1hY2VuYWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaFRva2VuKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ05vIHJlZnJlc2ggdG9rZW4gYXZhaWxhYmxlJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24ucG9zdCh0aGlzLnJlZnJlc2hUb2tlbkFwaSgpLCB7IHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbiB9KS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkpXVF9UT0tFTiwgcmVzLnRva2VuKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2F1dGhTdG9yYWdlLnNldEF1dGhUb2tlbihyZXMudG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdG9rZW5TaWduYWwuc2V0KHJlcy50b2tlbik7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmIChyZXMucmVmcmVzaF90b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTiwgcmVzLnJlZnJlc2hfdG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocmVzLmV4cGlyZV9pbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuRVhQSVJBVEVTX0lOLCBtb21lbnQocmVzLmV4cGlyZV9pbikuYWRkKDEsICdoJykuZm9ybWF0KCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUGFzc3dvcmQoY3VycmVudFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcsIGNvbmZpcm1QYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgICAgICBjdXJyZW50UGFzc3dvcmQ6IGN1cnJlbnRQYXNzd29yZCxcclxuICAgICAgICAgICAgbmV3UGFzc3dvcmQ6IG5ld1Bhc3N3b3JkLFxyXG4gICAgICAgICAgICBjb25maXJtUGFzc3dvcmQ6IGNvbmZpcm1QYXNzd29yZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uLnB1dCh0aGlzLnNlY3VyaXR5VXJsKCksIHBheWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbGEgcXVlIGVsIHVzdWFyaW8gbG9ndWVhZG8gdGVuZ2EgcGVybWlzb3MgXHJcbiAgICAgKiBwYXJhIGVsIGNhbmFsIGFjdHVhbCBkZSBsYSBhcGxpY2FjacOzbi5cclxuICAgICAqIEBwYXJhbSByZXMgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGFubmVsQWNjZXNzUGVybWlzc2lvbihyZXM6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KFtdKTtcclxuXHJcbiAgICAgICAgLyogTm8gYXV0aG9yaXplZCBjaGFubmVscyAqL1xyXG4gICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICAvKiBTb21lIGF1dGhvcml6ZWQgY2hhbm5lbChzKSBpbmNsdWRpbmcgY3VycmVudCBjaGFubmVsICovXHJcbiAgICAgICAgaWYgKHJlcy5jaGFubmVscy5maW5kKCh1c2VyY2hhbm5lbDogYW55KSA9PiB1c2VyY2hhbm5lbC5jb2RlID09PSB0aGlzLmNoYW5uZWwuY29kZSkpIHtcclxuICAgICAgICAgICAgLyogTXVsdGlwbGUgYXV0aG9yaXplZCBjaGFubmVscyBpbmNsdWRpbmcgY3VycmVudCBjaGFubmVsICovXHJcbiAgICAgICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA+IDEgJiYgdGhpcy5fYWN0aXZlQ2hhbm5lbENoYW5nZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbHNVc2VyU3ViamVjdC5uZXh0KHJlcy5jaGFubmVscylcclxuICAgICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICAgICAgLyogT25lIGF1dGhvcml6ZWQgY2hhbm5lbCBub3QgaW5jbHVkaW5nIGN1cnJlbnQgY2hhbm5lbCAqL1xyXG4gICAgICAgIGlmIChyZXMuY2hhbm5lbHM/Lmxlbmd0aCA9PSAxICYmIHRoaXMuX2FjdGl2ZUNoYW5uZWxDaGFuZ2UpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHJlcy5wYXNzd29yZFxyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxBY2Nlc3MocmVzLmNoYW5uZWxzWzBdLCByZXMpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qIE11bHRpcGxlIGF1dGhvcml6ZWQgY2hhbm5lbHMgbm90IGluY2x1ZGluZyBjdXJyZW50IGNoYW5uZWwgKi9cclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ2hhbm5lbENoYW5nZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWxzVXNlclN1YmplY3QubmV4dChyZXMuY2hhbm5lbHMpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbGEgZWwgYWNjZXNvIGFsIGNhbmFsLCBkZSBzZXIgb3RybyBudWV2byBjYW1iaWEgbG9zIHZhbG9yZXMuXHJcbiAgICAgKiBAcGFyYW0gY2hhbm5lbCBcclxuICAgICAqIEBwYXJhbSB1c2VyIFxyXG4gICAgICovXHJcbiAgICBjaGFubmVsQWNjZXNzKGNoYW5uZWw6IGFueSwgdXNlciA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy53aW5kb3c/LmxvY2F0aW9uLmhvc3RuYW1lICE9IGNoYW5uZWwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgbGV0IGVuY29kZWQgPSBidG9hKEpTT04uc3RyaW5naWZ5KHVzZXIgIT0gbnVsbCA/IHVzZXIgOiB0aGlzLl91c2VyKSlcclxuICAgICAgICAgICAgdGhpcy53aW5kb3c/LmxvY2F0aW9uLnJlcGxhY2UoYCR7dGhpcy53aW5kb3c/LmxvY2F0aW9uLnByb3RvY29sfS8vJHtjaGFubmVsLmhvc3RuYW1lfS9hdXRoL3JlZGlyZWN0LyR7ZW5jb2RlZH1gKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0YW50cy5tb2RpZnlDaGFubmVsQ29uZmlnKGNoYW5uZWwpXHJcbiAgICAgICAgICAgIHRoaXMud2luZG93Py5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xhIHF1ZSBlbCByb2wgZGVsIHVzdWFyaW8gc2VhIHVuIHJvbCBwZXJtaXRpZG8gcG9yIGxhIGFwbGljYWNpw7NuLlxyXG4gICAgICogQHBhcmFtIGFsbG93ZWRSb2xlcyByb2xlcyBxdWUgcGVybWl0ZSBsYSBhcGxpY2FjacOzbi5cclxuICAgICAqIEBwYXJhbSByb2xlIHJvbCBkZWwgdXN1YXJpb3NcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGlzQWxsb3dlZFJvbGUoYWxsb3dlZFJvbGVzOiBVc2VyUm9sZVR5cGVbXSwgcm9sZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcy5sZW5ndGhcclxuICAgICAgICAgICAgPyBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZSBhcyBVc2VyUm9sZVR5cGUpXHJcbiAgICAgICAgICAgIDogdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhcyB1biBsb2d1ZW8gZXhpdG9zbywgZ3VhcmRhIGxvcyBkYXRvcyBuZWNlc2FyaW9zIGVuIGVsIHN0b3JhZ2UgeSBkZW3DoXNcclxuICAgICAqIGNvbmZpZ3VyYWNpb25lcyBuZWNlc2FyaWFzLlxyXG4gICAgICogQHBhcmFtIHRva2VucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkb0xvZ2luVXNlcih0b2tlbnM6IGFueSkge1xyXG4gICAgICAgIHRoaXMuX3VzZXIgPSBuZXcgVXNlcigpXHJcbiAgICAgICAgdGhpcy5fdXNlci5pbml0aWxpemVkKHRva2VucylcclxuICAgICAgICB0aGlzLl9jdXN0b21lciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XHJcblxyXG4gICAgICAgIHRoaXMuZm9yY2VDaGFubmVsc0ZvclNlbGxlcih0b2tlbnMpXHJcbiAgICAgICAgLy9DaGFubmVsXHJcbiAgICAgICAgY29uc3QgdXNlckpzb25pZnkgPSB0aGlzLl91c2VyLmpzb25pZnkoKVxyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUiwgSlNPTi5zdHJpbmdpZnkodXNlckpzb25pZnkpKVxyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuRVhQSVJBVEVTX0lOLCBtb21lbnQodG9rZW5zLmV4cGlyZV9pbikuYWRkKDEsICdoJykuZm9ybWF0KCkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIC0tLSBNT0RJRklDQURPOiBGaXggZGVsIGJ1ZyBhbCBndWFyZGFyIGVsIHJlZnJlc2ggdG9rZW4gLS0tXHJcbiAgICAgICAgaWYgKHRva2Vucy5yZWZyZXNoX3Rva2VuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTiwgdG9rZW5zLnJlZnJlc2hfdG9rZW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuUkVGUkVTSF9UT0tFTik7IC8vIENvbXBhdGliaWxpZGFkIGNvbiBiYWNrZW5kcyBzaW4gcmVmcmVzaFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5KV1RfVE9LRU4sIHRva2Vucy50b2tlbik7XHJcbiAgICAgICAgdGhpcy5fYXV0aFN0b3JhZ2Uuc2V0QXV0aFRva2VuKHRva2Vucy50b2tlbilcclxuICAgICAgICB0aGlzLl90b2tlblNpZ25hbC5zZXQodG9rZW5zLnRva2VuKTtcclxuICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLk1BSUwsIHRva2Vucy51c2VybmFtZSk7XHJcbiAgICAgICAgLy9PYnNlcnZhYmxlc1xyXG4gICAgICAgIHRoaXMuX3VzZXJJblN1YmplY3QubmV4dCh0aGlzLl91c2VyKTtcclxuICAgICAgICB0aGlzLl9sb2dnZWRJblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgICB0aGlzLl9sb2dnaW5nSW5TdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FtYmlhIGxhIGZ1bmNpb24gcXVlIHNlIGVuY2FyZ2EgZGUgcmVzb2x2ZXIgaGFjaWEgZG9uZGUgc2UgcmVkaXJpZ2UgZWwgZnJvbnRlbmRcclxuICAgICAqIHRyYXMgdW5hIGFjY2nDs25cclxuICAgICAqIEBwYXJhbSByZXNvbHZlckZ1bmN0aW9uIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0SG9tZVJlc29sdmVyKHJlc29sdmVyRnVuY3Rpb246IGFueSkgeyB0aGlzLl9ob21lUmVzb2x2ZXIgPSByZXNvbHZlckZ1bmN0aW9uIH1cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBmdW5jaW9uIHF1ZSBzZSBlbmNhcmdhIGRlIHJlc29sdmVyIGhhY2lhIGRvbmRlIHNlIHJlZGlyaWdlIGVsIGZyb250ZW5kLlxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRIb21lUmVzb2x2ZXIoKSB7IHJldHVybiB0aGlzLl9ob21lUmVzb2x2ZXIgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFamVjdXRhIGVsIHJlc29sdmVyIGRlIGhvbWUgY29uZmlndXJhZG8gcG9yIGVsIGZyb250ZW5kIG8gdXNhIHVuIGZhbGxiYWNrLlxyXG4gICAgICogU2UgdXNhIHRhbnRvIGVuIGxvZ2luIGNvbW8gZW4gbG9nb3V0IHBhcmEgZXZpdGFyIGhhcmRjb2RlcyBwb3IgY29tcG9uZW50ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc29sdmVIb21lTmF2aWdhdGlvbihmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVyRnVuY3Rpb24gPSB0aGlzLmdldEhvbWVSZXNvbHZlcigpO1xyXG4gICAgICAgIHJlc29sdmVyRnVuY3Rpb25cclxuICAgICAgICAgICAgPyByZXNvbHZlckZ1bmN0aW9uKClcclxuICAgICAgICAgICAgOiBmYWxsYmFjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBlbCB0b2tlbiBkZWwgc3RvcmFnZSB5IGxvIGd1YXJkYSBlbiBsYSBzaWduYWwuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkVG9rZW5Gcm9tU3RvcmFnZSgpIHtcclxuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuX2xvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuSldUX1RPS0VOKTtcclxuICAgICAgICBpZiAodG9rZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdG9rZW5TaWduYWwuc2V0KHRva2VuKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXNsb2d1ZWEgYWwgdXN1YXJpby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvZ291dCgpIHtcclxuICAgICAgICB0aGlzLmRvTG9nb3V0VXNlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSBzaSBoYXkgdW4gdXN1YXJpbyBsb2d1ZWFkbyBvIG5vLlxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7XHJcbiAgICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1Rva2VuRXhwaXJlZCgpKSB7XHJcbiAgICAgICAgICAgIC8vIC0tLSBNT0RJRklDQURPOiBDb21wcm9iYXIgcmVmcmVzaCB0b2tlbiBwYXJhIG5vIGRlc2xvZ3VlYXIgcHJlbWF0dXJhbWVudGUgLS0tXHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1JlZnJlc2hUb2tlbiA9ICEhdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOKTtcclxuICAgICAgICAgICAgaWYgKCFoYXNSZWZyZXNoVG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50VXNlckFzVXNlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIGVsIHRva2VuIGRlIHVzdWFyaW9cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VG9rZW4oKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW5TaWduYWwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExpbXBpYSBlbCBzdG9yYWdlIHkgbGFzIGNvbmZpZ3VyYWNpb25lcyBpbnRlcm5hc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZG9Mb2dvdXRVc2VyKCkge1xyXG4gICAgICAgIHRoaXMuX3VzZXIgPSBudWxsXHJcbiAgICAgICAgdGhpcy5fY3VzdG9tZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2N1c3RvbWVyU3ViamVjdC5uZXh0KG51bGwpO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuVVNFUik7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5FWFBJUkFURVNfSU4pO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuSldUX1RPS0VOKTtcclxuICAgICAgICB0aGlzLl9hdXRoU3RvcmFnZS5zZXRBdXRoVG9rZW4obnVsbCk7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5SRUZSRVNIX1RPS0VOKTtcclxuICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjYXJ0X293bmVyJyk7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5NQUlMKTtcclxuICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkNIQU5ORUwpO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUik7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5MT0NBTEUpO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VTVE9NRVIpO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdNQVNURVJfQ0hBTk5FTCcpO1xyXG4gICAgICAgIHRoaXMuX2xvZ2dlZEluU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLl91c2VySW5TdWJqZWN0Lm5leHQodGhpcy5fdXNlcik7XHJcbiAgICAgICAgdGhpcy5jaGFubmVsc1VzZXJTdWJqZWN0Lm5leHQoW10pXHJcbiAgICAgICAgdGhpcy5fdG9rZW5TaWduYWwuc2V0KG51bGwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXZ1ZWx2ZSBgdHJ1ZWBzaSBlbCB0b2tlbiBleHBpcm8sIGBmYWxzZWAgY2FzbyBjb250cmFyaW8uXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc1Rva2VuRXhwaXJlZCgpIHtcclxuICAgICAgICBjb25zdCBmZWNoYV9leHBpcmFjaW9uID0gdGhpcy5nZXRFeHBpcmF0ZXNBdCgpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG1vbWVudCgpID49IG1vbWVudChmZWNoYV9leHBpcmFjaW9uKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBsYSBmZWNoYSBkZSBleHBpcmFjacOzbiBkZWwgdG9rZW4uXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRFeHBpcmF0ZXNBdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5FWFBJUkFURVNfSU4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBhbCB1c3VhcmlvIGFjdHVhbCB5IGxvIGNvbnZpZXJ0ZSBlbiB1bmEgaW5zdGFuY2lhIGRlIGBVc2VyYFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJBc1VzZXIoKTogVXNlciB8IG51bGwge1xyXG4gICAgICAgIHRoaXMuX3VzZXIgPSBuZXcgVXNlcigpO1xyXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZFVzZXJGcm9tU3RvcmFnZSgpO1xyXG4gICAgICAgIGlmICghbG9hZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl91c2VyPy5jaGFubmVscy5maW5kKCh1c2VyY2hhbm5lbDogYW55KSA9PiB1c2VyY2hhbm5lbD8uY29kZSA9PT0gdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEN1c3RvbWVyKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2J0aWVuZSBlbCB1c3VhcmlvIGRlbCBzdG9yYWdlLlxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvYWRVc2VyRnJvbVN0b3JhZ2Uoa2V5ID0gdGhpcy5VU0VSKSB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmVkID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBpZiAoc3RvcmVkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyT2JqID0gSlNPTi5wYXJzZShzdG9yZWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXNlciA9IE9iamVjdC5hc3NpZ24obmV3IFVzZXIoKSwgdXNlck9iaik7IFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhc3N3b3JkUmVzZXQgPSAobmV3X3Bhc3N3b3JkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0geyBwYXNzd29yZDogeyBmaXJzdDogbmV3X3Bhc3N3b3JkLCBzZWNvbmQ6IG5ld19wYXNzd29yZCB9IH07XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5yZXNldFBhc3N3b3JkQXBpKHRva2VuKSwgZGF0YSlcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5wdXQodGhpcy5yZXNldFBhc3N3b3JkQXBpKHRva2VuKSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbnZpYSBsYSBzb2xpY2l0dWQgcGFyYSBjYW1iaWFyIGxhIGNvbnRyYXNlw7FhLlxyXG4gICAgICogQHBhcmFtIGVtYWlsIGVtYWlsIGRlbCBzb2xpY2l0YW50ZS5cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICByZWNvdmVyUGFzc3dvcmQoZW1haWw6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uLnB1dCh0aGlzLnJlY292ZXJQYXNzd29yZEFwaSgpLCB7IGVtYWlsIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyYSBjb25maXJtYXIgZWwgcmVnaXN0cm8gZGUgdXN1YXJpby5cclxuICAgICAqIEBwYXJhbSB0b2tlbiBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBjb25maXJtQWNjb3VudCh0b2tlbjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb24uZ2V0KHRoaXMuY29uZmlybUFjY291bnRBcGkodG9rZW4pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcmEgcmVnaXN0cmFyIGEgdW4gdXN1YXJpbyBjb23Dum5cclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHNpbmdVcChkYXRhOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5wb3N0KHRoaXMucmVnaXN0ZXJBcGkoKSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJhIHJlZ2lzdHJhciBhIHVuIHVzdWFyaW8gbWF5b3Jpc3RhLlxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgc2lnblVwV2hvbGVzYWxlcihkYXRhOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbi5wb3N0KHRoaXMucmVnaXN0ZXJXaG9sZXNhbGVyQXBpKCksIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0FibGVUb0J1eSA9ICgpOiBib29sZWFuID0+ICF0aGlzLmdldFVzZXJQcm9maWxlU25hcHNob3QoKT8uaXNTZWxsZXIoKSB8fCAhIXRoaXMuZ2V0Q3VzdG9tZXIoKVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNpIGVsIHVzdWFyaW8gcHVlZGUgYWNjZWRlci92ZXIgZWwgZGFzaGJvYXJkIGRlIHZlbmRlZG9yLlxyXG4gICAgICogRW4gU1NSIHNpZW1wcmUgZGV2dWVsdmUgZmFsc2UgcGFyYSBldml0YXIgYWNjZXNvcyBhIHN0b3JhZ2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYW5BY2Nlc3NTZWxsZXJEYXNoYm9hcmQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHRoaXMuZ2V0VXNlclByb2ZpbGVTbmFwc2hvdCgpO1xyXG4gICAgICAgIGNvbnN0IGhhc0N1c3RvbWVycyA9ICEhdXNlcj8uY3VzdG9tZXJzPy5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgaXNTZWxsZXIgPSAhIXVzZXI/LmlzU2VsbGVyKCk7XHJcbiAgICAgICAgY29uc3QgaGFzQWN0aXZlQ3VzdG9tZXIgPSAhIXRoaXMuZ2V0Q3VzdG9tZXIoKTtcclxuICAgICAgICByZXR1cm4gaXNTZWxsZXIgfHwgaGFzQ3VzdG9tZXJzIHx8IGhhc0FjdGl2ZUN1c3RvbWVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhIHNpIGRlYmUgbW9zdHJhcnNlIGVsIGFjY2VzbyBhIFwiTWkgY3VlbnRhXCIgZW4gZWwgbWVuw7ogZGVsIGhlYWRlci5cclxuICAgICAqIC0gQ2xpZW50ZXMgbm9ybWFsZXM6IHNpZW1wcmUgdHJ1ZSBjdWFuZG8gZXN0w6FuIGxvZ3VlYWRvcy5cclxuICAgICAqIC0gVmVuZGVkb3JlczogdHJ1ZSBzb2xvIGN1YW5kbyBvcGVyYW4gY29uIHVuIGNsaWVudGUgc2VsZWNjaW9uYWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FuQWNjZXNzTXlBY2NvdW50TWVudSgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5nZXRVc2VyUHJvZmlsZVNuYXBzaG90KCk7XHJcbiAgICAgICAgY29uc3QgaXNTZWxsZXIgPSAhIXVzZXI/LmlzU2VsbGVyKCk7XHJcbiAgICAgICAgaWYgKCFpc1NlbGxlcikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRDdXN0b21lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU25hcHNob3QgZGUgdXN1YXJpbyBzaW4gc2lkZS1lZmZlY3RzIChubyBkaXNwYXJhIGxvZ291dCkuXHJcbiAgICAgKiBTZSB1c2EgZW4gaGVscGVycyBkZSBVSSBwYXJhIGV2aXRhciBsb29wcyBkZSByZW5kZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VXNlclByb2ZpbGVTbmFwc2hvdCgpOiBVc2VyIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3VzZXIpIHJldHVybiB0aGlzLl91c2VyO1xyXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZFVzZXJGcm9tU3RvcmFnZSgpO1xyXG4gICAgICAgIHJldHVybiBsb2FkZWQgPyB0aGlzLl91c2VyIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdW4gdXN1YXJpbyBkZSB0aXBvIGNsaWVudGUuXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgZ2V0Q3VzdG9tZXIoKTogYW55IHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2N1c3RvbWVyKSByZXR1cm4gdGhpcy5fY3VzdG9tZXI7XHJcbiAgICAgICAgY29uc3Qgc3RvcmVkID0gdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DVVNUT01FUik7XHJcbiAgICAgICAgaWYgKCFzdG9yZWQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbWVyID0gSlNPTi5wYXJzZShzdG9yZWQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tZXI7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldnVlbHZlIGxhIGxsYXZlIGVzdGFibGUgcXVlIGlkZW50aWZpY2EgZWwgY2Fycml0byBhY3Rpdm8gZGUgbGEgc2VzacOzbiBhY3R1YWwuXHJcbiAgICAgKiBTZSB1c2EgcGFyYSBldml0YXIgcmV1c2FyIGBjYXJ0X3Rva2VuYCBkZSBvdHJvIHVzdWFyaW8vY3VlbnRhLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2FydFNlc3Npb25Pd25lcktleSgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBjdXN0b21lciA9IHRoaXMuZ2V0Q3VzdG9tZXIoKTtcclxuICAgICAgICBpZiAoY3VzdG9tZXI/LmlkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGBjdXN0b21lcjoke2N1c3RvbWVyLmlkfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5nZXRVc2VyUHJvZmlsZVNuYXBzaG90KCk7XHJcbiAgICAgICAgaWYgKHVzZXI/LnVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgdXNlcjoke3VzZXIudXNlcm5hbWUudG9Mb3dlckNhc2UoKX1gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXZ1ZWx2ZSBlbCB1c3VhcmlvIGFjdHVhbCBsb2d1ZWFkby5cclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBnZXRVc2VyUHJvZmlsZUFzVXNlcigpOiBVc2VyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXNlciEgYXMgVXNlciB8fCB0aGlzLmdldEN1cnJlbnRVc2VyQXNVc2VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZ3JlZ2EgZGF0YSBleHRyYSBhbCBvYmplY3RvIGRlIFVzdWFyaW8uXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgbG9naW5FeHRyYURhdGEgPSAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY2xpZW50X2lkOiAnZGVtb19jbGllbnQnLFxyXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiAnc2VjcmV0X2RlbW9fY2xpZW50JyxcclxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3Bhc3N3b3JkJ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiBQbGVhc2UgcmVtb3ZlIHRoaXMgQVNBUCAtIE5lZWRzICpjaGFubmVscyogYXJyYXkgaW4gdXNlciBvYmplY3QgQUxXQVlTICovXHJcbiAgICBwcml2YXRlIGZvcmNlQ2hhbm5lbHNGb3JTZWxsZXIodG9rZW5zOiBhbnkpIHtcclxuICAgICAgICBpZiAoVXNlclJvbGVUeXBlLlNFTExFUiA9PSB0b2tlbnMudHlwZSBhcyBVc2VyUm9sZVR5cGUpXHJcbiAgICAgICAgICAgIHRoaXMuY2hhbm5lbHM/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLl91c2VyIS5zZXRDaGFubmVscyguLi50aGlzLmNoYW5uZWxzKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLl91c2VyIS5zZXRDaGFubmVscyh0aGlzLmNoYW5uZWwpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhcmdhIGVsIGNsaWVudGUgY29uIGVsIHF1ZSBzZSByZWFsaXphcmFuIHBlZGlkb3MuIFNpIHJlY2liZSBlbCB2YWxvciBudWxsXHJcbiAgICAqIHNlIHZ1ZWx2ZSBhIGNhcmdhciBlbCB2ZW5kZWRvciBwYXJhIHN1IHVzby4gIFxyXG4gICAgKiBAcGFyYW0gY3VzdG9tZXIgXHJcbiAgICAqL1xyXG4gICAgcHVibGljIHNldEN1c3RvbWVyKGN1c3RvbWVyOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9jdXN0b21lciA9IGN1c3RvbWVyID8/IG51bGw7XHJcblxyXG4gICAgICAgIGlmIChjdXN0b21lcikge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVU1RPTUVSLCBKU09OLnN0cmluZ2lmeShjdXN0b21lcikpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5DVVNUT01FUik7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbWVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbWVyQ2hhbm5lbCA9IGN1c3RvbWVyPy5jaGFubmVscz8uWzBdO1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbWVyQ2hhbm5lbENvZGUgPSBjdXN0b21lckNoYW5uZWw/LmNvZGU7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tZXJMb2NhbGVDb2RlID0gY3VzdG9tZXJDaGFubmVsPy5sb2NhbGVzPy5jb2RlO1xyXG4gICAgICAgIGNvbnN0IHNhbWVDaGFubmVsID0gY3VzdG9tZXJDaGFubmVsQ29kZSAmJiBjdXN0b21lckxvY2FsZUNvZGVcclxuICAgICAgICAgICAgPyB0aGlzLnNhbWVDaGFubmVsKGN1c3RvbWVyQ2hhbm5lbENvZGUsIGN1c3RvbWVyTG9jYWxlQ29kZSlcclxuICAgICAgICAgICAgOiBudWxsXHJcblxyXG4gICAgICAgIGlmIChjdXN0b21lcikge1xyXG4gICAgICAgICAgICBpZiAoIXNhbWVDaGFubmVsICYmIGN1c3RvbWVyQ2hhbm5lbENvZGUgJiYgY3VzdG9tZXJMb2NhbGVDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5fbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSKSA/XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5DSEFOTkVMU0VMTEVSLCBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IHRoaXMuX2FwaUNvbnN0cy5MT0NBTEVcclxuICAgICAgICAgICAgICAgICAgICB9KSkgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDaGFubmVsKHtcclxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiBjdXN0b21lckNoYW5uZWxDb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogY3VzdG9tZXJMb2NhbGVDb2RlXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJlcyA9IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMuX2xvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUik7XHJcbiAgICAgICAgICAgIGlmIChzdG9yZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShzdG9yZWQpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2FtZUNoYW5uZWwocmVzLmNoYW5uZWwsIHJlcy5sb2NhbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDaGFubmVsKHJlcylcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ0hBTk5FTFNFTExFUik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3VzdG9tZXJTdWJqZWN0Lm5leHQodGhpcy5fY3VzdG9tZXIgPz8gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wcnVlYmEgc2kgbG9zIHZhbG9yZXMgZGVsIGNhbmFsIGFjdHVhbCBzb24gaWd1YWxlcyBhIGxvcyBpbmdyZXNhZG8gcG9yIHBhcmFtZXRyb3MuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCBOb21icmUgZGVsIGNhbmFsXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxlICBMb2NhbGUgZGVsIGNhbmFsXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBzaSBlcyBlbCBtaXNtbyBjYW5hbCwgRmFsc2UgY2FzbyBjb250cmFyaW8uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2FtZUNoYW5uZWwgPSAoY2hhbm5lbDogc3RyaW5nLCBsb2NhbGU6IHN0cmluZyk6IGJvb2xlYW4gPT4gKGNoYW5uZWwgPT0gdGhpcy5fYXBpQ29uc3RzLkNIQU5ORUwpICYmIChsb2NhbGUgPT0gdGhpcy5fYXBpQ29uc3RzLkxPQ0FMRSlcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbWJpYSBkZSBjYW5hbFxyXG4gICAgICogQHBhcmFtIGNoYW5uZWxDb25maWcgZGViZSBzZXIgdW4gb2JqZXRvIHF1ZSBjb250ZW5nYSBhbCBtZW5vcyBsYXMga2V5cyBjaGFubmVsIHkgbG9jYWxlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNoYW5nZUNoYW5uZWwgPSAoY2hhbm5lbENvbmZpZzogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5fY29uc3RhbnRzLm1vZGlmeUNoYW5uZWxDb25maWcoe1xyXG4gICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsQ29uZmlnLmNoYW5uZWwsXHJcbiAgICAgICAgICAgIGxvY2FsZTogY2hhbm5lbENvbmZpZy5sb2NhbGUsXHJcbiAgICAgICAgICAgIGNoZWNrb3V0VmlldzogY2hhbm5lbENvbmZpZy5jaGVja291dFZpZXdcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRVc2VyUHJvZmlsZSgpOiBPYnNlcnZhYmxlPFVzZXIgfCBudWxsPiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLl91c2VyICYmIG9mKHRoaXMuX3VzZXIpKSB8fCB0aGlzLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFVzZXIoKTogT2JzZXJ2YWJsZTxVc2VyIHwgbnVsbD4ge1xyXG4gICAgICAgIHRoaXMuX3VzZXIgPSBuZXcgVXNlcigpO1xyXG4gICAgICAgIGlmICghdGhpcy5sb2FkVXNlckZyb21TdG9yYWdlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlciA9IG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMuX3VzZXIpO1xyXG4gICAgfVxyXG59Il19