@decaf-ts/for-angular 0.0.16 → 0.0.17

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.
Files changed (61) hide show
  1. package/assets/i18n/en.json +10 -0
  2. package/assets/i18n/pt.json +149 -0
  3. package/assets/icons/icon-128.webp +0 -0
  4. package/assets/icons/icon-192.webp +0 -0
  5. package/assets/icons/icon-256.webp +0 -0
  6. package/assets/icons/icon-48.webp +0 -0
  7. package/assets/icons/icon-512.webp +0 -0
  8. package/assets/icons/icon-72.webp +0 -0
  9. package/assets/icons/icon-96.webp +0 -0
  10. package/assets/images/apple-touch-icon.png +0 -0
  11. package/assets/images/favicon.png +0 -0
  12. package/assets/images/favicon.svg +29 -0
  13. package/components/component-renderer/component-renderer.component.d.ts +5 -4
  14. package/components/crud-field/crud-field.component.d.ts +174 -19
  15. package/components/crud-form/crud-form.component.d.ts +170 -6
  16. package/components/fieldset/fieldset.component.d.ts +374 -36
  17. package/components/list/list.component.d.ts +1 -1
  18. package/components/list-item/list-item.component.d.ts +2 -2
  19. package/components/model-renderer/model-renderer.component.d.ts +1 -5
  20. package/directives/collapsable.directive.d.ts +1 -0
  21. package/engine/NgxBaseComponent.d.ts +6 -6
  22. package/engine/NgxCrudFormField.d.ts +5 -2
  23. package/engine/NgxFormService.d.ts +113 -12
  24. package/engine/NgxRenderingEngine.d.ts +150 -25
  25. package/engine/constants.d.ts +11 -6
  26. package/engine/decorators.d.ts +2 -2
  27. package/engine/index.d.ts +4 -2
  28. package/engine/interfaces.d.ts +261 -0
  29. package/engine/types.d.ts +3 -206
  30. package/esm2022/components/component-renderer/component-renderer.component.mjs +13 -11
  31. package/esm2022/components/crud-field/crud-field.component.mjs +193 -8
  32. package/esm2022/components/crud-form/crud-form.component.mjs +116 -11
  33. package/esm2022/components/empty-state/empty-state.component.mjs +3 -3
  34. package/esm2022/components/fieldset/fieldset.component.mjs +482 -43
  35. package/esm2022/components/filter/filter.component.mjs +3 -3
  36. package/esm2022/components/layout/layout.component.mjs +3 -3
  37. package/esm2022/components/list/list.component.mjs +4 -5
  38. package/esm2022/components/list-item/list-item.component.mjs +9 -9
  39. package/esm2022/components/model-renderer/model-renderer.component.mjs +9 -8
  40. package/esm2022/components/pagination/pagination.component.mjs +4 -4
  41. package/esm2022/components/searchbar/searchbar.component.mjs +3 -3
  42. package/esm2022/directives/collapsable.directive.mjs +3 -2
  43. package/esm2022/engine/NgxBaseComponent.mjs +28 -22
  44. package/esm2022/engine/NgxCrudFormField.mjs +14 -4
  45. package/esm2022/engine/NgxFormService.mjs +239 -27
  46. package/esm2022/engine/NgxRenderingEngine.mjs +202 -46
  47. package/esm2022/engine/ValidatorFactory.mjs +6 -4
  48. package/esm2022/engine/constants.mjs +14 -9
  49. package/esm2022/engine/decorators.mjs +6 -6
  50. package/esm2022/engine/index.mjs +5 -3
  51. package/esm2022/engine/interfaces.mjs +4 -0
  52. package/esm2022/engine/types.mjs +1 -3
  53. package/esm2022/helpers/utils.mjs +6 -2
  54. package/fesm2022/decaf-ts-for-angular.mjs +2909 -2130
  55. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  56. package/helpers/utils.d.ts +1 -0
  57. package/package.json +2 -1
  58. package/engine/NgxRenderingEngine2.d.ts +0 -250
  59. package/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
  60. package/esm2022/interfaces.mjs +0 -2
  61. package/interfaces.d.ts +0 -28
@@ -7,6 +7,7 @@ import { OperationKeys } from '@decaf-ts/db-decorators';
7
7
  import { DefaultFormReactiveOptions } from './constants';
8
8
  import { ForAngularModule, getLogger } from '../../for-angular.module';
9
9
  import { IonIcon } from '@ionic/angular/standalone';
10
+ import { generateRandomValue } from '../../helpers';
10
11
  import * as i0 from "@angular/core";
11
12
  import * as i1 from "@ionic/angular/standalone";
12
13
  import * as i2 from "@angular/forms";
@@ -32,9 +33,57 @@ import * as i2 from "@angular/forms";
32
33
  */
33
34
  let CrudFormComponent = class CrudFormComponent {
34
35
  constructor() {
36
+ /**
37
+ * @description Field update trigger mode for form validation.
38
+ * @summary Determines when form field validation should be triggered. Options include
39
+ * 'change', 'blur', or 'submit'. This affects the user experience by controlling
40
+ * when validation feedback is shown to the user during form interaction.
41
+ *
42
+ * @type {FieldUpdateMode}
43
+ * @default 'change'
44
+ * @memberOf CrudFormComponent
45
+ */
35
46
  this.updateOn = 'change';
47
+ /**
48
+ * @description Form submission target specification.
49
+ * @summary Specifies where to display the response after form submission, similar
50
+ * to the HTML form target attribute. Options include '_self', '_blank', '_parent',
51
+ * '_top', or a named frame. Controls the browser behavior for form responses.
52
+ *
53
+ * @type {HTMLFormTarget}
54
+ * @default '_self'
55
+ * @memberOf CrudFormComponent
56
+ */
36
57
  this.target = '_self';
58
+ /**
59
+ * @description HTTP method or submission strategy for the form.
60
+ * @summary Defines how the form should be submitted. 'get' and 'post' correspond
61
+ * to standard HTTP methods for traditional form submission, while 'event' uses
62
+ * Angular event-driven submission for single-page application workflows.
63
+ *
64
+ * @type {'get' | 'post' | 'event'}
65
+ * @default 'event'
66
+ * @memberOf CrudFormComponent
67
+ */
37
68
  this.method = 'event';
69
+ /**
70
+ * @description Unique identifier for the current record.
71
+ * @summary A unique identifier for the current record being displayed or manipulated.
72
+ * This is typically used in conjunction with the primary key for operations on specific records.
73
+ *
74
+ * @type {string | number}
75
+ * @memberOf CrudFormComponent
76
+ */
77
+ this.uid = generateRandomValue(12);
78
+ /**
79
+ * @description Event emitter for form submission events.
80
+ * @summary Emits CrudFormEvent objects when the form is submitted, providing
81
+ * form data, component information, and any associated handlers to parent
82
+ * components. This enables decoupled handling of form submission logic.
83
+ *
84
+ * @type {EventEmitter<CrudFormEvent>}
85
+ * @memberOf CrudFormComponent
86
+ */
38
87
  this.submitEvent = new EventEmitter();
39
88
  /**
40
89
  * @description Angular Location service.
@@ -47,12 +96,34 @@ let CrudFormComponent = class CrudFormComponent {
47
96
  * @memberOf CrudFormComponent
48
97
  */
49
98
  this.location = inject(Location);
99
+ /**
100
+ * @description Reference to CRUD operation constants for template usage.
101
+ * @summary Exposes the OperationKeys enum to the component template, enabling
102
+ * conditional rendering and behavior based on operation types. This protected
103
+ * readonly property ensures that template logic can access operation constants
104
+ * while maintaining encapsulation and preventing accidental modification.
105
+ *
106
+ * @type {CrudOperations}
107
+ * @protected
108
+ * @readonly
109
+ * @memberOf CrudFormComponent
110
+ */
50
111
  this.OperationKeys = OperationKeys;
51
112
  }
52
113
  // ngAfterViewInit() {
53
114
  // if (![OperationKeys.READ, OperationKeys.DELETE].includes(this.operation))
54
115
  // NgxFormService.formAfterViewInit(this, this.rendererId);
55
116
  // }
117
+ /**
118
+ * @description Component initialization lifecycle method.
119
+ * @summary Initializes the component by setting up the logger, configuring form state
120
+ * based on the operation type, and merging configuration options. For READ and DELETE
121
+ * operations, the formGroup is set to undefined since these operations don't require
122
+ * form input. Configuration options are merged with default settings.
123
+ *
124
+ * @returns {Promise<void>}
125
+ * @memberOf CrudFormComponent
126
+ */
56
127
  async ngOnInit() {
57
128
  if (!this.logger)
58
129
  this.logger = getLogger(this);
@@ -60,43 +131,77 @@ let CrudFormComponent = class CrudFormComponent {
60
131
  this.formGroup = undefined;
61
132
  this.options = Object.assign({}, DefaultFormReactiveOptions, this.options || {});
62
133
  }
134
+ /**
135
+ * @description Component cleanup lifecycle method.
136
+ * @summary Performs cleanup operations when the component is destroyed.
137
+ * Unregisters the FormGroup from the NgxFormService to prevent memory leaks
138
+ * and ensure proper resource cleanup.
139
+ *
140
+ * @returns {void}
141
+ * @memberOf CrudFormComponent
142
+ */
63
143
  ngOnDestroy() {
64
144
  if (this.formGroup)
65
145
  NgxFormService.unregister(this.formGroup);
66
146
  }
67
147
  /**
68
- * @param {SubmitEvent} event
148
+ * @description Handles form submission with validation and event emission.
149
+ * @summary Processes form submission by first preventing default browser behavior,
150
+ * then validating all form fields using NgxFormService. If validation passes,
151
+ * extracts form data and emits a submitEvent with the data, component information,
152
+ * and any associated handlers. Returns false if validation fails.
153
+ *
154
+ * @param {SubmitEvent} event - The browser's native form submit event
155
+ * @returns {Promise<boolean | void>} Returns false if validation fails, void if successful
156
+ * @memberOf CrudFormComponent
69
157
  */
70
158
  async submit(event) {
71
159
  event.preventDefault();
72
160
  event.stopImmediatePropagation();
73
- event.stopPropagation();
74
161
  if (!NgxFormService.validateFields(this.formGroup))
75
162
  return false;
76
163
  const data = NgxFormService.getFormData(this.formGroup);
77
164
  this.submitEvent.emit({
78
165
  data,
79
166
  component: 'CrudFormComponent',
80
- name: this.action || EventConstants.SUBMIT_EVENT,
167
+ name: this.action || EventConstants.SUBMIT,
81
168
  handlers: this.handlers,
82
169
  });
83
170
  }
171
+ /**
172
+ * @description Handles form reset or navigation back functionality.
173
+ * @summary Provides different reset behavior based on the current operation.
174
+ * For CREATE and UPDATE operations, resets the form to its initial state.
175
+ * For READ and DELETE operations, navigates back in the browser history
176
+ * since these operations don't have modifiable form data to reset.
177
+ *
178
+ * @returns {void}
179
+ * @memberOf CrudFormComponent
180
+ */
84
181
  handleReset() {
182
+ if (![OperationKeys.DELETE, OperationKeys.READ].includes(this.operation))
183
+ return NgxFormService.reset(this.formGroup);
85
184
  this.location.back();
86
- // if(OperationKeys.DELETE !== this.operation)
87
- // NgxFormService.reset(this.formGroup);
88
- // else
89
- // this.location.back();
90
185
  }
186
+ /**
187
+ * @description Handles delete operations by emitting delete events.
188
+ * @summary Processes delete requests by emitting a submit event with the
189
+ * record's unique identifier as data. This allows parent components to
190
+ * handle the actual deletion logic while maintaining separation of concerns.
191
+ * The event includes the uid and standard component identification.
192
+ *
193
+ * @returns {void}
194
+ * @memberOf CrudFormComponent
195
+ */
91
196
  handleDelete() {
92
197
  this.submitEvent.emit({
93
198
  data: this.uid,
94
199
  component: 'CrudFormComponent',
95
- name: EventConstants.SUBMIT_EVENT,
200
+ name: EventConstants.SUBMIT,
96
201
  });
97
202
  }
98
203
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrudFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
99
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CrudFormComponent, isStandalone: true, selector: "ngx-decaf-crud-form", inputs: { model: "model", updateOn: "updateOn", target: "target", method: "method", options: "options", action: "action", operation: "operation", handlers: "handlers", formGroup: "formGroup", childOf: "childOf", rendererId: "rendererId", uid: "uid" }, outputs: { submitEvent: "submitEvent" }, viewQueries: [{ propertyName: "component", first: true, predicate: ["reactiveForm"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if(operation !== 'read' && operation !== 'delete') {\n <form #reactiveForm [id]=\"rendererId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" novalidate [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div id=\"dcf-buttons-container\" class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{ action ? action : options.buttons.submit.text}}\n </ion-button>\n </div>\n <div>\n @if(options.buttons.clear) {\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['create', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" id=\"dcf-buttons-container\">\n\n @if(operation === 'delete' && uid) {\n <div>\n <ion-button\n (click)=\"handleDelete()\"\n color=\"danger\"\n type=\"button\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n Delete\n </ion-button>\n </div>\n\n }\n @if(operation === OperationKeys.CREATE || operation === OperationKeys.UPDATE) {\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n </div>\n }\n\n @if(options.buttons.clear) {\n <div>\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['delete', 'read', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n </div>\n\n }\n </div>\n}\n\n", styles: ["#dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 991px){#dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 990px){#dcf-buttons-container.dcf-flex div{width:100%}#dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
204
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CrudFormComponent, isStandalone: true, selector: "ngx-decaf-crud-form", inputs: { model: "model", updateOn: "updateOn", target: "target", method: "method", options: "options", action: "action", operation: "operation", handlers: "handlers", formGroup: "formGroup", childOf: "childOf", rendererId: "rendererId", uid: "uid" }, outputs: { submitEvent: "submitEvent" }, host: { properties: { "attr.id": "uid" } }, viewQueries: [{ propertyName: "component", first: true, predicate: ["reactiveForm"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if(operation !== 'read' && operation !== 'delete') {\n <form #reactiveForm [id]=\"rendererId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" novalidate [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{ action ? action : options.buttons.submit.text}}\n </ion-button>\n </div>\n <div>\n @if(options.buttons.clear) {\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['create', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" [id]=\"uid\">\n\n @if(operation === 'delete' && uid) {\n <div>\n <ion-button\n (click)=\"handleDelete()\"\n color=\"danger\"\n type=\"button\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n Delete\n </ion-button>\n </div>\n\n }\n @if(operation === OperationKeys.CREATE || operation === OperationKeys.UPDATE) {\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n </div>\n }\n\n @if(options.buttons.clear) {\n <div>\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['delete', 'read', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n </div>\n\n }\n </div>\n}\n\n", styles: [".dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 991px){.dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 990px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
100
205
  };
101
206
  CrudFormComponent = __decorate([
102
207
  Dynamic()
@@ -104,7 +209,7 @@ CrudFormComponent = __decorate([
104
209
  export { CrudFormComponent };
105
210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrudFormComponent, decorators: [{
106
211
  type: Component,
107
- args: [{ standalone: true, selector: 'ngx-decaf-crud-form', imports: [ForAngularModule, IonIcon], template: "@if(operation !== 'read' && operation !== 'delete') {\n <form #reactiveForm [id]=\"rendererId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" novalidate [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div id=\"dcf-buttons-container\" class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{ action ? action : options.buttons.submit.text}}\n </ion-button>\n </div>\n <div>\n @if(options.buttons.clear) {\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['create', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" id=\"dcf-buttons-container\">\n\n @if(operation === 'delete' && uid) {\n <div>\n <ion-button\n (click)=\"handleDelete()\"\n color=\"danger\"\n type=\"button\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n Delete\n </ion-button>\n </div>\n\n }\n @if(operation === OperationKeys.CREATE || operation === OperationKeys.UPDATE) {\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n </div>\n }\n\n @if(options.buttons.clear) {\n <div>\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['delete', 'read', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n </div>\n\n }\n </div>\n}\n\n", styles: ["#dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 991px){#dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 990px){#dcf-buttons-container.dcf-flex div{width:100%}#dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}\n"] }]
212
+ args: [{ standalone: true, selector: 'ngx-decaf-crud-form', imports: [ForAngularModule, IonIcon], host: { '[attr.id]': 'uid' }, template: "@if(operation !== 'read' && operation !== 'delete') {\n <form #reactiveForm [id]=\"rendererId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" novalidate [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{ action ? action : options.buttons.submit.text}}\n </ion-button>\n </div>\n <div>\n @if(options.buttons.clear) {\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['create', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" [id]=\"uid\">\n\n @if(operation === 'delete' && uid) {\n <div>\n <ion-button\n (click)=\"handleDelete()\"\n color=\"danger\"\n type=\"button\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n Delete\n </ion-button>\n </div>\n\n }\n @if(operation === OperationKeys.CREATE || operation === OperationKeys.UPDATE) {\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n </div>\n }\n\n @if(options.buttons.clear) {\n <div>\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['delete', 'read', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n </div>\n\n }\n </div>\n}\n\n", styles: [".dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 991px){.dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 990px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}\n"] }]
108
213
  }], propDecorators: { model: [{
109
214
  type: Input
110
215
  }], updateOn: [{
@@ -136,4 +241,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
136
241
  }], submitEvent: [{
137
242
  type: Output
138
243
  }] } });
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFpQixPQUFPLEVBQUUsY0FBYyxFQUFrRCxNQUFNLGNBQWMsQ0FBQztBQUV0SCxPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBS3BEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBU0ksSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBaUI7SUFBdkI7UUFhTCxhQUFRLEdBQW9CLFFBQVEsQ0FBQztRQU1yQyxXQUFNLEdBQW1CLE9BQU8sQ0FBQztRQUdqQyxXQUFNLEdBQTZCLE9BQU8sQ0FBQztRQTBDM0MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQWtCaEQ7Ozs7Ozs7OztXQVNHO1FBQ0ssYUFBUSxHQUFhLE1BQU0sQ0FBQyxR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TixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFXTixHQUFHO3NCQURGLEtBQUs7Z0JBS04sV0FBVztzQkFEVixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4Rm9ybVNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1FdmVudCwgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEZpZWxkVXBkYXRlTW9kZSwgSFRNTEZvcm1UYXJnZXQsIFJlbmRlcmVkTW9kZWwgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1PcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IERlZmF1bHRGb3JtUmVhY3RpdmVPcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRm9yQW5ndWxhck1vZHVsZSwgZ2V0TG9nZ2VyIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BkZWNhZi10cy9sb2dnaW5nJztcblxuXG4vKipcbiAqIEBjb21wb25lbnQgQ3J1ZEZvcm1Db21wb25lbnRcbiAqIEBleGFtcGxlIDxuZ3gtZGVjYWYtY3J1ZC1mb3JtXG4gKiAgIGFjdGlvbj1cImNyZWF0ZVwiXG4gKiAgIG9wZXJhdGlvbj1cImNyZWF0ZVwiXG4gKiAgIGZvcm1Hcm91cD1cImZvcm1Hcm91cFwiXG4gKiAgIHJlbmRlcmVySWQ9XCJyZW5kZXJlcklkXCJcbiAqICAgc3VibWl0RXZlbnQ9XCJzdWJtaXRFdmVudFwiXG4gKiAgIHRhcmdldD1cIl9zZWxmXCJcbiAqICAgbWV0aG9kPVwiZXZlbnRcIj5cbiAqIDwvbmd4LWRlY2FmLWNydWQtZm9ybT5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcGVyYXRpb24gLSBUaGUgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBmb3JtIGdyb3VwXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVuZGVyZXJJZCAtIFRoZSByZW5kZXJlciBpZFxuICogQHBhcmFtIHtTdWJtaXRFdmVudH0gc3VibWl0RXZlbnQgLSBUaGUgc3VibWl0IGV2ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gVGhlIHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2RcbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWNydWQtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcnVkLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW0ZvckFuZ3VsYXJNb2R1bGUsIElvbkljb25dLFxufSlcbmV4cG9ydCBjbGFzcyBDcnVkRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRm9ybUVsZW1lbnQsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZWwhOiBNb2RlbCB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICB1cGRhdGVPbjogRmllbGRVcGRhdGVNb2RlID0gJ2NoYW5nZSc7XG5cbiAgQFZpZXdDaGlsZCgncmVhY3RpdmVGb3JtJywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgdGFyZ2V0OiBIVE1MRm9ybVRhcmdldCA9ICdfc2VsZic7XG5cbiAgQElucHV0KClcbiAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdldmVudCcgPSAnZXZlbnQnO1xuXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnMhOiBDcnVkRm9ybU9wdGlvbnM7XG5cbiAgQElucHV0KClcbiAgYWN0aW9uPzogc3RyaW5nO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4+O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdGggdG8gdGhlIHBhcmVudCBGb3JtR3JvdXAsIGlmIG5lc3RlZC5cbiAgICogQHN1bW1hcnkgRnVsbCBkb3QtZGVsaW1pdGVkIHBhdGggb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAuIFNldCBvbmx5IHdoZW4gaXMgcGFydCBvZiBhIG5lc3RlZCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2hpbGRPZj86IHN0cmluZztcblxuICBASW5wdXQoKVxuICByZW5kZXJlcklkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZC5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkIGJlaW5nIGRpc3BsYXllZCBvciBtYW5pcHVsYXRlZC5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmltYXJ5IGtleSBmb3Igb3BlcmF0aW9ucyBvbiBzcGVjaWZpYyByZWNvcmRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfVxuICAgKi9cbiAgQElucHV0KClcbiAgdWlkITogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG5cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDcnVkRm9ybUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBsb2dnaW5nIGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbXBvbmVudCwgYWxsb3dpbmcgZm9yIGNvbnNpc3RlbnRcbiAgICogYW5kIHN0cnVjdHVyZWQgbG9nZ2luZyBvZiBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMuIFRoaXMgbG9nZ2VyIGlzIGluaXRpYWxpemVkXG4gICAqIGluIHRoZSBuZ09uSW5pdCBtZXRob2QgdXNpbmcgdGhlIGdldExvZ2dlciBmdW5jdGlvbiBmcm9tIHRoZSBGb3JBbmd1bGFyTW9kdWxlLlxuICAgKlxuICAgKiBUaGUgbG9nZ2VyIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcG9uZW50IHRvIHJlY29yZCBpbXBvcnRhbnQgZXZlbnRzLCBkZWJ1ZyBpbmZvcm1hdGlvbixcbiAgICogYW5kIHBvdGVudGlhbCBpc3N1ZXMuIEl0IGhlbHBzIGluIG1vbml0b3JpbmcgdGhlIGNvbXBvbmVudCdzIGJlaGF2aW9yLCB0cmFja2luZyB0aGUgZmxvd1xuICAgKiBvZiBvcGVyYXRpb25zLCBhbmQgZmFjaWxpdGF0aW5nIGVhc2llciBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLlxuICAgKlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBMb2NhdGlvbiBzZXJ2aWNlLlxuICAgKiBAc3VtbWFyeSBJbmplY3RlZCBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBicm93c2VyJ3MgVVJMIGFuZCBoaXN0b3J5LlxuICAgKiBUaGlzIHNlcnZpY2UgaXMgdXNlZCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYnJvd3NlcidzIGhpc3RvcnkgQVBJLCBhbGxvd2luZ1xuICAgKiBmb3IgYmFjayBuYXZpZ2F0aW9uIGFuZCBVUkwgbWFuaXB1bGF0aW9uIG91dHNpZGUgb2YgQW5ndWxhcidzIHJvdXRlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uID0gaW5qZWN0KExvY2F0aW9uKTtcblxuICAvLyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gaWYgKCFbT3BlcmF0aW9uS2V5cy5SRUFELCBPcGVyYXRpb25LZXlzLkRFTEVURV0uaW5jbHVkZXModGhpcy5vcGVyYXRpb24pKVxuICAgIC8vICAgTmd4Rm9ybVNlcnZpY2UuZm9ybUFmdGVyVmlld0luaXQodGhpcywgdGhpcy5yZW5kZXJlcklkKTtcbiAgLy8gfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5sb2dnZXIpXG4gICAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcih0aGlzKTtcbiAgICBpZiAodGhpcy5vcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuUkVBRCB8fCB0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpXG4gICAgICB0aGlzLmZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9ucyxcbiAgICAgIHRoaXMub3B0aW9ucyB8fCB7fSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwKVxuICAgICAgTmd4Rm9ybVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmZvcm1Hcm91cCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtICB7U3VibWl0RXZlbnR9IGV2ZW50XG4gICAqL1xuICBhc3luYyBzdWJtaXQoZXZlbnQ6IFN1Ym1pdEV2ZW50KTogUHJvbWlzZTxib29sZWFuIHwgdm9pZD4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoIU5neEZvcm1TZXJ2aWNlLnZhbGlkYXRlRmllbGRzKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBkYXRhID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQoe1xuICAgICAgZGF0YSxcbiAgICAgIGNvbXBvbmVudDogJ0NydWRGb3JtQ29tcG9uZW50JyxcbiAgICAgIG5hbWU6IHRoaXMuYWN0aW9uIHx8IEV2ZW50Q29uc3RhbnRzLlNVQk1JVF9FVkVOVCxcbiAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlUmVzZXQoKSB7XG4gICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgLy8gaWYoT3BlcmF0aW9uS2V5cy5ERUxFVEUgIT09IHRoaXMub3BlcmF0aW9uKVxuICAgIC8vICAgTmd4Rm9ybVNlcnZpY2UucmVzZXQodGhpcy5mb3JtR3JvdXApO1xuICAgIC8vIGVsc2VcbiAgICAvLyAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICB9XG5cbiAgaGFuZGxlRGVsZXRlKCkge1xuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh7XG4gICAgICBkYXRhOiB0aGlzLnVpZCxcbiAgICAgIGNvbXBvbmVudDogJ0NydWRGb3JtQ29tcG9uZW50JyxcbiAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLlNVQk1JVF9FVkVOVCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBPcGVyYXRpb25LZXlzID0gT3BlcmF0aW9uS2V5cztcbn1cbiIsIkBpZihvcGVyYXRpb24gIT09ICdyZWFkJyAmJiBvcGVyYXRpb24gIT09ICdkZWxldGUnKSB7XG4gIDxmb3JtICNyZWFjdGl2ZUZvcm0gW2lkXT1cInJlbmRlcmVySWRcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChzdWJtaXQpPVwic3VibWl0KCRldmVudClcIiBub3ZhbGlkYXRlIFt0YXJnZXRdPVwidGFyZ2V0XCI+XG4gICAgPG5nLWNvbnRlbnQgI2Zvcm1Db250ZW50PjwvbmctY29udGVudD5cbiAgICA8ZGl2IGlkPVwiZGNmLWJ1dHRvbnMtY29udGFpbmVyXCIgY2xhc3M9XCJkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleCBkY2YtZmxleC1sZWZ0XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3Nsb3RdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uU2xvdFwiIFtuYW1lXT1cIm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIHt7IGFjdGlvbiA/IGFjdGlvbiA6IG9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudGV4dH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwiaGFuZGxlUmVzZXQoKVwiPlxuICAgICAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uICBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB7eyBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pID8gJ0JhY2snIDogb3B0aW9ucy5idXR0b25zLmNsZWFyPy50ZXh0fX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG59IEBlbHNlIHtcbiAgPGRpdiBbY2xhc3NdPVwiJ2RjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LWxlZnQgJyArIG9wZXJhdGlvblwiIGlkPVwiZGNmLWJ1dHRvbnMtY29udGFpbmVyXCI+XG5cbiAgICBAaWYob3BlcmF0aW9uID09PSAnZGVsZXRlJyAmJiB1aWQpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURlbGV0ZSgpXCJcbiAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgfVxuICAgIEBpZihvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8IG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cInN1Ym1pdFwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge3tvcHRpb25zLmJ1dHRvbnMuc3VibWl0LnRleHR9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyKSB7XG4gICAgICA8ZGl2PlxuICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIChjbGljayk9XCJoYW5kbGVSZXNldCgpXCI+XG4gICAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvbikge1xuICAgICAgICAgICAgPGlvbi1pY29uICBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge3sgWydkZWxldGUnLCAncmVhZCcsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pID8gJ0JhY2snIDogb3B0aW9ucy5idXR0b25zLmNsZWFyPy50ZXh0fX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICB9XG4gIDwvZGl2PlxufVxuXG4iXX0=
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFpQixPQUFPLEVBQUUsY0FBYyxFQUErRCxNQUFNLGNBQWMsQ0FBQztBQUVuSSxPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQUdwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQVVJLElBQU0saUJBQWlCLEdBQXZCLE1BQU0saUJBQWlCO0lBQXZCO1FBYUw7Ozs7Ozs7OztXQVNHO1FBRUgsYUFBUSxHQUFvQixRQUFRLENBQUM7UUFjckM7Ozs7Ozs7OztXQVNHO1FBRUgsV0FBTSxHQUFtQixPQUFPLENBQUM7UUFFakM7Ozs7Ozs7OztXQVNHO1FBRUgsV0FBTSxHQUE2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Z0IsRUFBRSxPQUFPLENBQUMsUUFDOUIsRUFBQyxXQUFXLEVBQUUsS0FBSyxFQUFDOzhCQWExQixLQUFLO3NCQURKLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQWFOLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBYzlELE1BQU07c0JBREwsS0FBSztnQkFjTixNQUFNO3NCQURMLEtBQUs7Z0JBYU4sT0FBTztzQkFETixLQUFLO2dCQWFOLE1BQU07c0JBREwsS0FBSztnQkFjTixTQUFTO3NCQURSLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQWF6QixRQUFRO3NCQURQLEtBQUs7Z0JBYU4sU0FBUztzQkFEUixLQUFLO2dCQVdOLE9BQU87c0JBRE4sS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBWU4sR0FBRztzQkFERixLQUFLO2dCQWNOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSUZvcm1FbGVtZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4Rm9ybVNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1FdmVudCwgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEZpZWxkVXBkYXRlTW9kZSwgSGFuZGxlckxpa2UsIEhUTUxGb3JtVGFyZ2V0LCBSZW5kZXJlZE1vZGVsIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IENydWRGb3JtT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUsIGdldExvZ2dlciB9IGZyb20gJy4uLy4uL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQgeyBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZGVjYWYtdHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJhbmRvbVZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5cblxuLyoqXG4gKiBAY29tcG9uZW50IENydWRGb3JtQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8bmd4LWRlY2FmLWNydWQtZm9ybVxuICogICBhY3Rpb249XCJjcmVhdGVcIlxuICogICBvcGVyYXRpb249XCJjcmVhdGVcIlxuICogICBmb3JtR3JvdXA9XCJmb3JtR3JvdXBcIlxuICogICByZW5kZXJlcklkPVwicmVuZGVyZXJJZFwiXG4gKiAgIHN1Ym1pdEV2ZW50PVwic3VibWl0RXZlbnRcIlxuICogICB0YXJnZXQ9XCJfc2VsZlwiXG4gKiAgIG1ldGhvZD1cImV2ZW50XCI+XG4gKiA8L25neC1kZWNhZi1jcnVkLWZvcm0+XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtDcnVkT3BlcmF0aW9uc30gb3BlcmF0aW9uIC0gVGhlIENSVUQgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbmRlcmVySWQgLSBUaGUgcmVuZGVyZXIgaWRcbiAqIEBwYXJhbSB7U3VibWl0RXZlbnR9IHN1Ym1pdEV2ZW50IC0gVGhlIHN1Ym1pdCBldmVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIFRoZSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBUaGUgbWV0aG9kXG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1jcnVkLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtGb3JBbmd1bGFyTW9kdWxlLCBJb25JY29uXSxcbiAgaG9zdDogeydbYXR0ci5pZF0nOiAndWlkJ30sXG59KVxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBJRm9ybUVsZW1lbnQsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGVsITogTW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCB1cGRhdGUgdHJpZ2dlciBtb2RlIGZvciBmb3JtIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hlbiBmb3JtIGZpZWxkIHZhbGlkYXRpb24gc2hvdWxkIGJlIHRyaWdnZXJlZC4gT3B0aW9ucyBpbmNsdWRlXG4gICAqICdjaGFuZ2UnLCAnYmx1cicsIG9yICdzdWJtaXQnLiBUaGlzIGFmZmVjdHMgdGhlIHVzZXIgZXhwZXJpZW5jZSBieSBjb250cm9sbGluZ1xuICAgKiB3aGVuIHZhbGlkYXRpb24gZmVlZGJhY2sgaXMgc2hvd24gdG8gdGhlIHVzZXIgZHVyaW5nIGZvcm0gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtGaWVsZFVwZGF0ZU1vZGV9XG4gICAqIEBkZWZhdWx0ICdjaGFuZ2UnXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdXBkYXRlT246IEZpZWxkVXBkYXRlTW9kZSA9ICdjaGFuZ2UnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSByZWFjdGl2ZSBmb3JtIERPTSBlbGVtZW50LlxuICAgKiBAc3VtbWFyeSBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRoYXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgZm9ybSdzIERPTSBlbGVtZW50LlxuICAgKiBUaGlzIGVuYWJsZXMgcHJvZ3JhbW1hdGljIG1hbmlwdWxhdGlvbiBvZiB0aGUgZm9ybSBlbGVtZW50IGFuZCBhY2Nlc3MgdG8gbmF0aXZlXG4gICAqIEhUTUwgZm9ybSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHdoZW4gbmVlZGVkLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdyZWFjdGl2ZUZvcm0nLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm0gc3VibWlzc2lvbiB0YXJnZXQgc3BlY2lmaWNhdGlvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIHJlc3BvbnNlIGFmdGVyIGZvcm0gc3VibWlzc2lvbiwgc2ltaWxhclxuICAgKiB0byB0aGUgSFRNTCBmb3JtIHRhcmdldCBhdHRyaWJ1dGUuIE9wdGlvbnMgaW5jbHVkZSAnX3NlbGYnLCAnX2JsYW5rJywgJ19wYXJlbnQnLFxuICAgKiAnX3RvcCcsIG9yIGEgbmFtZWQgZnJhbWUuIENvbnRyb2xzIHRoZSBicm93c2VyIGJlaGF2aW9yIGZvciBmb3JtIHJlc3BvbnNlcy5cbiAgICpcbiAgICogQHR5cGUge0hUTUxGb3JtVGFyZ2V0fVxuICAgKiBAZGVmYXVsdCAnX3NlbGYnXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdGFyZ2V0OiBIVE1MRm9ybVRhcmdldCA9ICdfc2VsZic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIVFRQIG1ldGhvZCBvciBzdWJtaXNzaW9uIHN0cmF0ZWd5IGZvciB0aGUgZm9ybS5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgdGhlIGZvcm0gc2hvdWxkIGJlIHN1Ym1pdHRlZC4gJ2dldCcgYW5kICdwb3N0JyBjb3JyZXNwb25kXG4gICAqIHRvIHN0YW5kYXJkIEhUVFAgbWV0aG9kcyBmb3IgdHJhZGl0aW9uYWwgZm9ybSBzdWJtaXNzaW9uLCB3aGlsZSAnZXZlbnQnIHVzZXNcbiAgICogQW5ndWxhciBldmVudC1kcml2ZW4gc3VibWlzc2lvbiBmb3Igc2luZ2xlLXBhZ2UgYXBwbGljYXRpb24gd29ya2Zsb3dzLlxuICAgKlxuICAgKiBAdHlwZSB7J2dldCcgfCAncG9zdCcgfCAnZXZlbnQnfVxuICAgKiBAZGVmYXVsdCAnZXZlbnQnXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdldmVudCcgPSAnZXZlbnQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQ1JVRCBmb3JtIGJlaGF2aW9yLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdGhhdCBjb250cm9sIGZvcm0gcmVuZGVyaW5nLFxuICAgKiB2YWxpZGF0aW9uLCBhbmQgYmVoYXZpb3IuIFRoZXNlIG9wdGlvbnMgYXJlIG1lcmdlZCB3aXRoIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiB0byBjdXN0b21pemUgdGhlIGZvcm0ncyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZEZvcm1PcHRpb25zfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnMhOiBDcnVkRm9ybU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25hbCBhY3Rpb24gaWRlbnRpZmllciBmb3IgZm9ybSBzdWJtaXNzaW9uIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhIGN1c3RvbSBhY3Rpb24gbmFtZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHN1Ym1pdCBldmVudC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgc3VibWl0IGV2ZW50IGNvbnN0YW50LiBVc2VkIHRvXG4gICAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHR5cGVzIG9mIGZvcm0gc3VibWlzc2lvbnMgd2l0aGluIHRoZSBzYW1lIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBhY3Rpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBvcGVyYXRpb24gdGhpcyBmb3JtIGlzIGhhbmRsaW5nIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAgICogVGhpcyBpcyBhIHJlcXVpcmVkIGlucHV0IHRoYXQgZGV0ZXJtaW5lcyBmb3JtIGJlaGF2aW9yLCB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgYXZhaWxhYmxlIGFjdGlvbnMuXG4gICAqIFRoZSBvcGVyYXRpb24gYWZmZWN0cyBmb3JtIHN0YXRlLCBidXR0b24gdmlzaWJpbGl0eSwgYW5kIHN1Ym1pc3Npb24gbG9naWMuXG4gICAqXG4gICAqIEB0eXBlIHtDcnVkT3BlcmF0aW9uc31cbiAgICogQHJlcXVpcmVkXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgb3BlcmF0aW9uITogQ3J1ZE9wZXJhdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZXZlbnQgaGFuZGxlcnMgZm9yIGZvcm0gYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgQSByZWNvcmQgb2YgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMga2V5ZWQgYnkgZXZlbnQgbmFtZXMgdGhhdCBjYW4gYmVcbiAgICogdHJpZ2dlcmVkIGR1cmluZyBmb3JtIG9wZXJhdGlvbnMuIFRoZXNlIGhhbmRsZXJzIHByb3ZpZGUgZXh0ZW5zaWJpbGl0eSBmb3JcbiAgICogY3VzdG9tIGJ1c2luZXNzIGxvZ2ljIGFuZCBjYW4gYmUgaW52b2tlZCBmb3IgdmFyaW91cyBmb3JtIGV2ZW50cyBhbmQgYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge0hhbmRsZXJMaWtlfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogSGFuZGxlckxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIHJlYWN0aXZlIEZvcm1Hcm91cCBmb3IgZm9ybSBzdGF0ZSBtYW5hZ2VtZW50LlxuICAgKiBAc3VtbWFyeSBUaGUgRm9ybUdyb3VwIGluc3RhbmNlIHRoYXQgbWFuYWdlcyBhbGwgZm9ybSBjb250cm9scywgdmFsaWRhdGlvbixcbiAgICogYW5kIGZvcm0gc3RhdGUuIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgZm9ybSB2YWx1ZXMgYW5kXG4gICAqIGNvbnRyb2xsaW5nIGZvcm0gYmVoYXZpb3IuIE1heSBiZSB1bmRlZmluZWQgZm9yIHJlYWQtb25seSBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdGggdG8gdGhlIHBhcmVudCBGb3JtR3JvdXAsIGlmIG5lc3RlZC5cbiAgICogQHN1bW1hcnkgRnVsbCBkb3QtZGVsaW1pdGVkIHBhdGggb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAuIFNldCBvbmx5IHdoZW4gaXMgcGFydCBvZiBhIG5lc3RlZCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2hpbGRPZj86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZm9ybSByZW5kZXJlci5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgc3RyaW5nIGlkZW50aWZpZXIgdXNlZCB0byByZWdpc3RlciBhbmQgbWFuYWdlIHRoaXMgZm9ybVxuICAgKiBpbnN0YW5jZSB3aXRoaW4gdGhlIE5neEZvcm1TZXJ2aWNlLiBUaGlzIElEIGlzIGFsc28gdXNlZCBhcyB0aGUgSFRNTCBpZFxuICAgKiBhdHRyaWJ1dGUgZm9yIHRoZSBmb3JtIGVsZW1lbnQsIGVuYWJsaW5nIERPTSBxdWVyaWVzIGFuZCBmb3JtIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3IgbWFuaXB1bGF0ZWQuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJpbWFyeSBrZXkgZm9yIG9wZXJhdGlvbnMgb24gc3BlY2lmaWMgcmVjb3Jkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlcn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB1aWQ6IHN0cmluZyA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBmb3JtIHN1Ym1pc3Npb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBFbWl0cyBDcnVkRm9ybUV2ZW50IG9iamVjdHMgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQsIHByb3ZpZGluZ1xuICAgKiBmb3JtIGRhdGEsIGNvbXBvbmVudCBpbmZvcm1hdGlvbiwgYW5kIGFueSBhc3NvY2lhdGVkIGhhbmRsZXJzIHRvIHBhcmVudFxuICAgKiBjb21wb25lbnRzLiBUaGlzIGVuYWJsZXMgZGVjb3VwbGVkIGhhbmRsaW5nIG9mIGZvcm0gc3VibWlzc2lvbiBsb2dpYy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxDcnVkRm9ybUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxDcnVkRm9ybUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q3J1ZEZvcm1FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgbG9nZ2luZyBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb21wb25lbnQsIGFsbG93aW5nIGZvciBjb25zaXN0ZW50XG4gICAqIGFuZCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgb2YgaW5mb3JtYXRpb24sIHdhcm5pbmdzLCBhbmQgZXJyb3JzLiBUaGlzIGxvZ2dlciBpcyBpbml0aWFsaXplZFxuICAgKiBpbiB0aGUgbmdPbkluaXQgbWV0aG9kIHVzaW5nIHRoZSBnZXRMb2dnZXIgZnVuY3Rpb24gZnJvbSB0aGUgRm9yQW5ndWxhck1vZHVsZS5cbiAgICpcbiAgICogVGhlIGxvZ2dlciBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBvbmVudCB0byByZWNvcmQgaW1wb3J0YW50IGV2ZW50cywgZGVidWcgaW5mb3JtYXRpb24sXG4gICAqIGFuZCBwb3RlbnRpYWwgaXNzdWVzLiBJdCBoZWxwcyBpbiBtb25pdG9yaW5nIHRoZSBjb21wb25lbnQncyBiZWhhdmlvciwgdHJhY2tpbmcgdGhlIGZsb3dcbiAgICogb2Ygb3BlcmF0aW9ucywgYW5kIGZhY2lsaXRhdGluZyBlYXNpZXIgZGVidWdnaW5nIGFuZCBtYWludGVuYW5jZS5cbiAgICpcbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgTG9jYXRpb24gc2VydmljZS5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnJvd3NlcidzIFVSTCBhbmQgaGlzdG9yeS5cbiAgICogVGhpcyBzZXJ2aWNlIGlzIHVzZWQgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGJyb3dzZXIncyBoaXN0b3J5IEFQSSwgYWxsb3dpbmdcbiAgICogZm9yIGJhY2sgbmF2aWdhdGlvbiBhbmQgVVJMIG1hbmlwdWxhdGlvbiBvdXRzaWRlIG9mIEFuZ3VsYXIncyByb3V0ZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbiA9IGluamVjdChMb2NhdGlvbik7XG5cbiAgLy8gbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIGlmICghW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSlcbiAgICAvLyAgIE5neEZvcm1TZXJ2aWNlLmZvcm1BZnRlclZpZXdJbml0KHRoaXMsIHRoaXMucmVuZGVyZXJJZCk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBpbml0aWFsaXphdGlvbiBsaWZlY3ljbGUgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGJ5IHNldHRpbmcgdXAgdGhlIGxvZ2dlciwgY29uZmlndXJpbmcgZm9ybSBzdGF0ZVxuICAgKiBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHR5cGUsIGFuZCBtZXJnaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gRm9yIFJFQUQgYW5kIERFTEVURVxuICAgKiBvcGVyYXRpb25zLCB0aGUgZm9ybUdyb3VwIGlzIHNldCB0byB1bmRlZmluZWQgc2luY2UgdGhlc2Ugb3BlcmF0aW9ucyBkb24ndCByZXF1aXJlXG4gICAqIGZvcm0gaW5wdXQuIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcilcbiAgICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKHRoaXMpO1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5SRUFEIHx8IHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSlcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIERlZmF1bHRGb3JtUmVhY3RpdmVPcHRpb25zLFxuICAgICAgdGhpcy5vcHRpb25zIHx8IHt9LFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGNsZWFudXAgbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gICAqIFVucmVnaXN0ZXJzIHRoZSBGb3JtR3JvdXAgZnJvbSB0aGUgTmd4Rm9ybVNlcnZpY2UgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICogYW5kIGVuc3VyZSBwcm9wZXIgcmVzb3VyY2UgY2xlYW51cC5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwKVxuICAgICAgTmd4Rm9ybVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmZvcm1Hcm91cCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZm9ybSBzdWJtaXNzaW9uIHdpdGggdmFsaWRhdGlvbiBhbmQgZXZlbnQgZW1pc3Npb24uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBmb3JtIHN1Ym1pc3Npb24gYnkgZmlyc3QgcHJldmVudGluZyBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IsXG4gICAqIHRoZW4gdmFsaWRhdGluZyBhbGwgZm9ybSBmaWVsZHMgdXNpbmcgTmd4Rm9ybVNlcnZpY2UuIElmIHZhbGlkYXRpb24gcGFzc2VzLFxuICAgKiBleHRyYWN0cyBmb3JtIGRhdGEgYW5kIGVtaXRzIGEgc3VibWl0RXZlbnQgd2l0aCB0aGUgZGF0YSwgY29tcG9uZW50IGluZm9ybWF0aW9uLFxuICAgKiBhbmQgYW55IGFzc29jaWF0ZWQgaGFuZGxlcnMuIFJldHVybnMgZmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAgICpcbiAgICogQHBhcmFtIHtTdWJtaXRFdmVudH0gZXZlbnQgLSBUaGUgYnJvd3NlcidzIG5hdGl2ZSBmb3JtIHN1Ym1pdCBldmVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuIHwgdm9pZD59IFJldHVybnMgZmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdm9pZCBpZiBzdWNjZXNzZnVsXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgc3VibWl0KGV2ZW50OiBTdWJtaXRFdmVudCk6IFByb21pc2U8Ym9vbGVhbiB8IHZvaWQ+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGlmICghTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHModGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkYXRhID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQoe1xuICAgICAgZGF0YSxcbiAgICAgIGNvbXBvbmVudDogJ0NydWRGb3JtQ29tcG9uZW50JyxcbiAgICAgIG5hbWU6IHRoaXMuYWN0aW9uIHx8IEV2ZW50Q29uc3RhbnRzLlNVQk1JVCxcbiAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZvcm0gcmVzZXQgb3IgbmF2aWdhdGlvbiBiYWNrIGZ1bmN0aW9uYWxpdHkuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGRpZmZlcmVudCByZXNldCBiZWhhdmlvciBiYXNlZCBvbiB0aGUgY3VycmVudCBvcGVyYXRpb24uXG4gICAqIEZvciBDUkVBVEUgYW5kIFVQREFURSBvcGVyYXRpb25zLCByZXNldHMgdGhlIGZvcm0gdG8gaXRzIGluaXRpYWwgc3RhdGUuXG4gICAqIEZvciBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucywgbmF2aWdhdGVzIGJhY2sgaW4gdGhlIGJyb3dzZXIgaGlzdG9yeVxuICAgKiBzaW5jZSB0aGVzZSBvcGVyYXRpb25zIGRvbid0IGhhdmUgbW9kaWZpYWJsZSBmb3JtIGRhdGEgdG8gcmVzZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGhhbmRsZVJlc2V0KCk6IHZvaWQge1xuICAgIGlmKCFbT3BlcmF0aW9uS2V5cy5ERUxFVEUsIE9wZXJhdGlvbktleXMuUkVBRF0uaW5jbHVkZXModGhpcy5vcGVyYXRpb24pKVxuICAgICAgcmV0dXJuIE5neEZvcm1TZXJ2aWNlLnJlc2V0KHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCk7XG4gICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZGVsZXRlIG9wZXJhdGlvbnMgYnkgZW1pdHRpbmcgZGVsZXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGRlbGV0ZSByZXF1ZXN0cyBieSBlbWl0dGluZyBhIHN1Ym1pdCBldmVudCB3aXRoIHRoZVxuICAgKiByZWNvcmQncyB1bmlxdWUgaWRlbnRpZmllciBhcyBkYXRhLiBUaGlzIGFsbG93cyBwYXJlbnQgY29tcG9uZW50cyB0b1xuICAgKiBoYW5kbGUgdGhlIGFjdHVhbCBkZWxldGlvbiBsb2dpYyB3aGlsZSBtYWludGFpbmluZyBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLlxuICAgKiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIHVpZCBhbmQgc3RhbmRhcmQgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVEZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHtcbiAgICAgIGRhdGE6IHRoaXMudWlkLFxuICAgICAgY29tcG9uZW50OiAnQ3J1ZEZvcm1Db21wb25lbnQnLFxuICAgICAgbmFtZTogRXZlbnRDb25zdGFudHMuU1VCTUlULFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nXG4gICAqIGNvbmRpdGlvbmFsIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZFxuICAgKiByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzXG4gICAqIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtDcnVkT3BlcmF0aW9uc31cbiAgICogQHByb3RlY3RlZFxuICAgKiBAcmVhZG9ubHlcbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgT3BlcmF0aW9uS2V5cyA9IE9wZXJhdGlvbktleXM7XG59XG4iLCJAaWYob3BlcmF0aW9uICE9PSAncmVhZCcgJiYgb3BlcmF0aW9uICE9PSAnZGVsZXRlJykge1xuICA8Zm9ybSAjcmVhY3RpdmVGb3JtIFtpZF09XCJyZW5kZXJlcklkXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiAoc3VibWl0KT1cInN1Ym1pdCgkZXZlbnQpXCIgbm92YWxpZGF0ZSBbdGFyZ2V0XT1cInRhcmdldFwiPlxuICAgIDxuZy1jb250ZW50ICNmb3JtQ29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cImRjZi1idXR0b25zLWNvbnRhaW5lciBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleCBkY2YtZmxleC1sZWZ0XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3Nsb3RdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uU2xvdFwiIFtuYW1lXT1cIm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIHt7IGFjdGlvbiA/IGFjdGlvbiA6IG9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudGV4dH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwiaGFuZGxlUmVzZXQoKVwiPlxuICAgICAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uICBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB7eyBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pID8gJ0JhY2snIDogb3B0aW9ucy5idXR0b25zLmNsZWFyPy50ZXh0fX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG59IEBlbHNlIHtcbiAgPGRpdiBbY2xhc3NdPVwiJ2RjZi1idXR0b25zLWNvbnRhaW5lciBkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleCBkY2YtZmxleC1sZWZ0ICcgKyBvcGVyYXRpb25cIiBbaWRdPVwidWlkXCI+XG5cbiAgICBAaWYob3BlcmF0aW9uID09PSAnZGVsZXRlJyAmJiB1aWQpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURlbGV0ZSgpXCJcbiAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgfVxuICAgIEBpZihvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8IG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cInN1Ym1pdFwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge3tvcHRpb25zLmJ1dHRvbnMuc3VibWl0LnRleHR9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyKSB7XG4gICAgICA8ZGl2PlxuICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIChjbGljayk9XCJoYW5kbGVSZXNldCgpXCI+XG4gICAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvbikge1xuICAgICAgICAgICAgPGlvbi1pY29uICBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge3sgWydkZWxldGUnLCAncmVhZCcsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pID8gJ0JhY2snIDogb3B0aW9ucy5idXR0b25zLmNsZWFyPy50ZXh0fX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICB9XG4gIDwvZGl2PlxufVxuXG4iXX0=
@@ -300,7 +300,7 @@ let EmptyStateComponent = class EmptyStateComponent extends NgxBaseComponent {
300
300
  return this.sanitizer.bypassSecurityTrustHtml(result);
301
301
  }
302
302
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EmptyStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
303
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: EmptyStateComponent, isStandalone: true, selector: "ngx-decaf-empty-state", inputs: { title: "title", titleColor: "titleColor", subtitle: "subtitle", subtitleColor: "subtitleColor", showIcon: "showIcon", icon: "icon", iconSize: "iconSize", iconColor: "iconColor", buttonLink: "buttonLink", buttonText: "buttonText", buttonFill: "buttonFill", buttonColor: "buttonColor", buttonSize: "buttonSize", searchValue: "searchValue" }, usesInheritance: true, ngImport: i0, template: "\n<ion-card id=\"dcf-card-empty-state\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--ion-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
303
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: EmptyStateComponent, isStandalone: true, selector: "ngx-decaf-empty-state", inputs: { title: "title", titleColor: "titleColor", subtitle: "subtitle", subtitleColor: "subtitleColor", showIcon: "showIcon", icon: "icon", iconSize: "iconSize", iconColor: "iconColor", buttonLink: "buttonLink", buttonText: "buttonText", buttonFill: "buttonFill", buttonColor: "buttonColor", buttonSize: "buttonSize", searchValue: "searchValue" }, usesInheritance: true, ngImport: i0, template: "\n<ion-card [id]=\"uid\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--dcf-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
304
304
  };
305
305
  EmptyStateComponent = __decorate([
306
306
  Dynamic(),
@@ -315,7 +315,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
315
315
  IonCardContent,
316
316
  IonTitle,
317
317
  IonIcon
318
- ], template: "\n<ion-card id=\"dcf-card-empty-state\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--ion-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"] }]
318
+ ], template: "\n<ion-card [id]=\"uid\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--dcf-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"] }]
319
319
  }], ctorParameters: () => [], propDecorators: { title: [{
320
320
  type: Input
321
321
  }], titleColor: [{
@@ -345,4 +345,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
345
345
  }], searchValue: [{
346
346
  type: Input
347
347
  }] } });
348
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktc3RhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFDTCxPQUFPLEVBQ1AsY0FBYyxFQUNkLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQ0ksMkJBQTJCLENBQUM7QUFDakMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBSXZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBZ0JJLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW9CLFNBQVEsZ0JBQWdCO0lBa012RDs7Ozs7OztPQU9HO0lBQ0g7UUFDRSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQXpNL0I7Ozs7Ozs7OztXQVNH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LGthRDRCSSxnQkFBZ0IsNlhBQ2hCLE9BQU8seUxBQ1AsY0FBYywrRUFFZCxPQUFPOztBQUlFLG1CQUFtQjtJQWYvQixPQUFPLEVBQUU7O0dBZUcsbUJBQW1CLENBb1UvQjs7NEZBcFVZLG1CQUFtQjtrQkFkL0IsU0FBUzsrQkFDRSx1QkFBdUIsY0FHckIsSUFBSSxXQUNQO3dCQUNQLGdCQUFnQjt3QkFDaEIsT0FBTzt3QkFDUCxjQUFjO3dCQUNkLFFBQVE7d0JBQ1IsT0FBTztxQkFDUjt3REFnQkQsS0FBSztzQkFESixLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSztnQkFhTixRQUFRO3NCQURQLEtBQUs7Z0JBY04sYUFBYTtzQkFEWixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFjTixJQUFJO3NCQURILEtBQUs7Z0JBYU4sUUFBUTtzQkFEUCxLQUFLO2dCQWFOLFNBQVM7c0JBRFIsS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBYU4sVUFBVTtzQkFEVCxLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSztnQkFhTixXQUFXO3NCQURWLEtBQUs7Z0JBYU4sVUFBVTtzQkFEVCxLQUFLO2dCQWFOLFdBQVc7c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sb3IsIFByZWRlZmluZWRDb2xvcnMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge1xuICBJb25DYXJkLFxuICBJb25DYXJkQ29udGVudCxcbiAgSW9uSWNvbixcbiAgSW9uVGl0bGUsXG4gIE5hdkNvbnRyb2xsZXJcbn1cbmZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0ICogYXMgYWxsSWNvbnMgZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IER5bmFtaWMsIFN0cmluZ09yQm9vbGVhbiB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBzdHJpbmdUb0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4QmFzZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvdHlwZXMnO1xuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBmb3IgZGlzcGxheWluZyBlbXB0eSBzdGF0ZSBtZXNzYWdlcyB3aXRoIG9wdGlvbmFsIGFjdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZGlzcGxheSBlbXB0eSBzdGF0ZSBtZXNzYWdlc1xuICogd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBvciB3aGVuIGEgdXNlciBuZWVkcyB0byB0YWtlIGFuIGFjdGlvbiB0byBwb3B1bGF0ZSBjb250ZW50LlxuICogSXQgaW5jbHVkZXMgY3VzdG9taXphYmxlIHRpdGxlLCBzdWJ0aXRsZSwgaWNvbiwgYW5kIGFjdGlvbiBidXR0b24gZWxlbWVudHMgdGhhdCBjYW4gYmVcbiAqIHN0eWxlZCBhbmQgY29uZmlndXJlZCB0aHJvdWdoIGlucHV0IHByb3BlcnRpZXMuIFRoZSBjb21wb25lbnQgc3VwcG9ydHMgbG9jYWxpemF0aW9uXG4gKiBhbmQgY2FuIHRyaWdnZXIgbmF2aWdhdGlvbiBvciBjdXN0b20gYWN0aW9ucyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cbiAqXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIEVtcHR5U3RhdGVDb21wb25lbnQge1xuICogICAgICtzdHJpbmcgdGl0bGVcbiAqICAgICArc3RyaW5nIHRpdGxlQ29sb3JcbiAqICAgICArc3RyaW5nIHN1YnRpdGxlXG4gKiAgICAgK3N0cmluZyBzdWJ0aXRsZUNvbG9yXG4gKiAgICAgK1N0cmluZ09yQm9vbGVhbiBzaG93SWNvblxuICogICAgICtzdHJpbmcgaWNvblxuICogICAgICtzdHJpbmcgaWNvblNpemVcbiAqICAgICArUHJlZGVmaW5lZENvbG9ycyBpY29uQ29sb3JcbiAqICAgICArc3RyaW5nfEZ1bmN0aW9uIGJ1dHRvbkxpbmtcbiAqICAgICArc3RyaW5nIGJ1dHRvblRleHRcbiAqICAgICArc3RyaW5nIGJ1dHRvbkZpbGxcbiAqICAgICArQ29sb3IgYnV0dG9uQ29sb3JcbiAqICAgICArc3RyaW5nIGJ1dHRvblNpemVcbiAqICAgICArc3RyaW5nIHNlYXJjaFZhbHVlXG4gKiAgICAgLU5hdkNvbnRyb2xsZXIgbmF2Q29udHJvbGxlclxuICogICAgICtuZ09uSW5pdCgpXG4gKiAgICAgK2hhbmRsZUNsaWNrKClcbiAqICAgfVxuICogICBFbXB0eVN0YXRlQ29tcG9uZW50IC0tfD4gTmd4QmFzZUNvbXBvbmVudFxuICogICBFbXB0eVN0YXRlQ29tcG9uZW50IC0tfD4gT25Jbml0XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtZW1wdHktc3RhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1wdHktc3RhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbXB0eS1zdGF0ZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9yQW5ndWxhck1vZHVsZSxcbiAgICBJb25DYXJkLFxuICAgIElvbkNhcmRDb250ZW50LFxuICAgIElvblRpdGxlLFxuICAgIElvbkljb25cbiAgXVxuXG59KVxuZXhwb3J0IGNsYXNzIEVtcHR5U3RhdGVDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYWluIHRpdGxlIGRpc3BsYXllZCBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgcHJpbWFyeSBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGVtcHR5IHN0YXRlIGNvbXBvbmVudC5cbiAgICogVGhpcyB0ZXh0IGlzIHR5cGljYWxseSB1c2VkIHRvIGluZm9ybSB0aGUgdXNlciBhYm91dCB3aHkgdGhleSdyZSBzZWVpbmcgYW4gZW1wdHkgdmlldy5cbiAgICogSWYgdHJhbnNsYXRhYmxlIGlzIHRydWUsIHRoaXMgd2lsbCBiZSBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgbG9jYWxpemF0aW9uIHN5c3RlbS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgXCJ0aXRsZVwiXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nID0gXCJ0aXRsZVwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSB0aXRsZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbG9yIGZvciB0aGUgdGl0bGUgdGV4dCB1c2luZyB0aGUgYXBwbGljYXRpb24ncyBjb2xvciBzeXN0ZW0uXG4gICAqIFRoZSB2YWx1ZSBzaG91bGQgY29ycmVzcG9uZCB0byBhIGNvbG9yIHZhcmlhYmxlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgdGhlbWUuXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHByZWZpeCB0aGlzIHdpdGggXCJjb2xvci1cIiB0byBjcmVhdGUgdGhlIENTUyBjbGFzcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2dyYXktNidcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlQ29sb3IgPSAnZ3JheS02JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzZWNvbmRhcnkgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRleHQgb3IgaW5zdHJ1Y3Rpb25zIGJlbG93IHRoZSBtYWluIHRpdGxlLlxuICAgKiBUaGlzIHRleHQgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZ3VpZGUgdGhlIHVzZXIgb24gd2hhdCBhY3Rpb25zIHRoZXkgY2FuIHRha2UuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJ0aXRsZTogc3RyaW5nID0gXCJcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb2xvciBvZiB0aGUgc3VidGl0bGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIHN1YnRpdGxlIHRleHQgdXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc3lzdGVtLlxuICAgKiBUaGUgdmFsdWUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBjb2xvciB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHRoZW1lLlxuICAgKiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBwcmVmaXggdGhpcyB3aXRoIFwiY29sb3ItXCIgdG8gY3JlYXRlIHRoZSBDU1MgY2xhc3MuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdncmF5LTQnXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJ0aXRsZUNvbG9yOiBzdHJpbmcgPSAnZ3JheS00JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGljb24gaXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHRoZSB2aXN1YWwgaWNvbiBzaG91bGQgYmUgc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIGJvb2xlYW4gb3IgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uXG4gICAqIEljb25zIGhlbHAgdmlzdWFsbHkgY29tbXVuaWNhdGUgdGhlIGVtcHR5IHN0YXRlIGNvbnRleHQgdG8gdXNlcnMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dJY29uOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG5hbWUgb2YgdGhlIGljb24gdG8gZGlzcGxheS5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIGljb24gdG8gc2hvdyB3aGVuIHNob3dJY29uIGlzIHRydWUuXG4gICAqIFRoZSBjb21wb25lbnQgdXNlcyB0aGUgaWNvbiBzeXN0ZW0gZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24sXG4gICAqIGFuZCB0aGlzIHZhbHVlIHNob3VsZCBjb3JyZXNwb25kIHRvIGFuIGF2YWlsYWJsZSBpY29uIG5hbWUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwidGktaW5mby1zcXVhcmUtcm91bmRlZFwiXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpY29uOiBzdHJpbmcgPSBcInRpLWluZm8tc3F1YXJlLXJvdW5kZWRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBkaXNwbGF5ZWQgaWNvbi5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBDYW4gYmUgZWl0aGVyICdsYXJnZScgb3IgJ3NtYWxsJyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgbGF5b3V0IG5lZWRzLlxuICAgKlxuICAgKiBAdHlwZSB7J2xhcmdlJyB8ICdzbWFsbCcgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICdsYXJnZSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb25TaXplPzogJ2xhcmdlJyB8ICdzbWFsbCcgPSAnbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSBkaXNwbGF5ZWQgaWNvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIGljb24gdXNpbmcgSW9uaWMncyBwcmVkZWZpbmVkIGNvbG9yIHN5c3RlbS5cbiAgICogVGhpcyBhbGxvd3MgdGhlIGljb24gdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc2NoZW1lLlxuICAgKlxuICAgKiBAdHlwZSB7UHJlZGVmaW5lZENvbG9ycyB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgJ21lZGl1bSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb25Db2xvcj86IFByZWRlZmluZWRDb2xvcnMgPSAnbWVkaXVtJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCBvciBhY3Rpb24gZm9yIHRoZSBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGVyZSB0aGUgYnV0dG9uIHNob3VsZCBuYXZpZ2F0ZSB0byB3aGVuIGNsaWNrZWQgb3Igd2hhdCBmdW5jdGlvblxuICAgKiBpdCBzaG91bGQgZXhlY3V0ZS4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgVVJMIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBuYXZpZ2F0aW9uLlxuICAgKiBXaGVuIG5vdCBwcm92aWRlZCwgdGhlIGJ1dHRvbiB3aWxsIG5vdCBwZXJmb3JtIGFueSBhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2UgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBidXR0b25MaW5rPzogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGxhYmVsIGZvciB0aGUgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdGhlIGJ1dHRvbiB3aWxsIG5vdCBkaXNwbGF5IGFueSB0ZXh0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWxsIHN0eWxlIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgdmlzdWFsIHN0eWxlIG9mIHRoZSBidXR0b24gdXNpbmcgSW9uaWMncyBidXR0b24gZmlsbCBvcHRpb25zLlxuICAgKiAnc29saWQnIGNyZWF0ZXMgYSBidXR0b24gd2l0aCBhIHNvbGlkIGJhY2tncm91bmQsICdvdXRsaW5lJyBjcmVhdGVzIGEgYnV0dG9uIHdpdGhcbiAgICoganVzdCBhIGJvcmRlciwgYW5kICdjbGVhcicgY3JlYXRlcyBhIGJ1dHRvbiB3aXRoIG5vIGJhY2tncm91bmQgb3IgYm9yZGVyLlxuICAgKlxuICAgKiBAdHlwZSB7J2NsZWFyJyB8ICdzb2xpZCcgfCAnb3V0bGluZSd9XG4gICAqIEBkZWZhdWx0ICdzb2xpZCdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvbkZpbGw6ICdjbGVhcicgfCAnc29saWQnIHwgJ291dGxpbmUnID0gICdzb2xpZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29sb3Igb2YgdGhlIGFjdGlvbiBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHRoZSBidXR0b24gdXNpbmcgSW9uaWMncyBjb2xvciBzeXN0ZW0uXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBidXR0b24gdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc2NoZW1lLlxuICAgKlxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZWZhdWx0ICdwcmltYXJ5J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uQ29sb3I6IENvbG9yID0gICdwcmltYXJ5JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uIHNob3duIGluIHRoZSBlbXB0eSBzdGF0ZS5cbiAgICogQ2FuIGJlICdsYXJnZScsICdzbWFsbCcsIG9yICdkZWZhdWx0JyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgbGF5b3V0IG5lZWRzLlxuICAgKlxuICAgKiBAdHlwZSB7J2xhcmdlJyB8ICdzbWFsbCcgfCAnZGVmYXVsdCd9XG4gICAqIEBkZWZhdWx0ICdkZWZhdWx0J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uU2l6ZTogJ2xhcmdlJyB8ICdzbWFsbCcgfCAnZGVmYXVsdCcgPSAgJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlYXJjaCB2YWx1ZSB0aGF0IHJlc3VsdGVkIGluIG5vIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdGhlIGVtcHR5IHN0YXRlIGlzIHNob3duIGR1ZSB0byBhIHNlYXJjaCB3aXRoIG5vIHJlc3VsdHMsXG4gICAqIHRoaXMgcHJvcGVydHkgY2FuIGhvbGQgdGhlIHNlYXJjaCB0ZXJtIHRoYXQgd2FzIHVzZWQuIFRoaXMgY2FuIGJlIGRpc3BsYXllZFxuICAgKiBpbiB0aGUgZW1wdHkgc3RhdGUgbWVzc2FnZSB0byBwcm92aWRlIGNvbnRleHQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzZWFyY2hWYWx1ZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcnZpY2UgZm9yIGhhbmRsaW5nIG5hdmlnYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIG5hdmlnYXRpbmcgYmV0d2VlbiByb3V0ZXMuXG4gICAqIFRoaXMgc2VydmljZSBpcyB1c2VkIHdoZW4gdGhlIGJ1dHRvbkxpbmsgaXMgYSBzdHJpbmcgVVJMIHRvIG5hdmlnYXRlIHRvIHRoYXQgbG9jYXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtOYXZDb250cm9sbGVyfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyID0gaW5qZWN0KE5hdkNvbnRyb2xsZXIpO1xuXG4gIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcblxuICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBzZWFyY2hTdWJ0aXRsZSE6IFNhZmVIdG1sXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRW1wdHlTdGF0ZUNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRW1wdHlTdGF0ZUNvbXBvbmVudCBieSBjYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgY29uc3RydWN0b3JcbiAgICogd2l0aCB0aGUgY29tcG9uZW50IG5hbWUgZm9yIGxvZ2dpbmcgYW5kIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLiBUaGlzIGNvbXBvbmVudCBwcm92aWRlc1xuICAgKiBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZGlzcGxheSBlbXB0eSBzdGF0ZSBtZXNzYWdlcyB3aXRoIG9wdGlvbmFsIGljb25zIGFuZCBhY3Rpb24gYnV0dG9ucy5cbiAgICpcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiRW1wdHlTdGF0ZUNvbXBvbmVudFwiKTtcbiAgICBhZGRJY29ucyhhbGxJY29ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBmaXJzdCBkaXNwbGF5cyB0aGUgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgcHJvY2Vzc2luZyBib29sZWFuIGlucHV0cywgYXBwbHlpbmcgbG9jYWxpemF0aW9uIHRvIHRleHRcbiAgICogZWxlbWVudHMgaWYgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCwgYW5kIGZvcm1hdHRpbmcgQ1NTIGNsYXNzZXMgZm9yIHRpdGxlIGFuZCBzdWJ0aXRsZSBjb2xvcnMuXG4gICAqIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXIgaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlXG4gICAqIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBsb2NhbGl6ZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICpcbiAgICogICBBLT4+RTogbmdPbkluaXQoKVxuICAgKiAgIEUtPj5FOiBQcm9jZXNzIHRyYW5zbGF0YWJsZSBmbGFnXG4gICAqICAgRS0+PkU6IFByb2Nlc3Mgc2hvd0ljb24gZmxhZ1xuICAgKiAgIEUtPj5FOiBHZXQgbG9jYWxlIHNldHRpbmdzXG4gICAqICAgYWx0IHRyYW5zbGF0YWJsZSBpcyB0cnVlXG4gICAqICAgICBFLT4+RTogTG9jYWxpemUgdGl0bGVcbiAgICogICAgIEUtPj5FOiBMb2NhbGl6ZSBzdWJ0aXRsZVxuICAgKiAgICAgRS0+PkU6IExvY2FsaXplIGJ1dHRvblRleHRcbiAgICogICBlbmRcbiAgICogICBFLT4+RTogRm9ybWF0IHRpdGxlIENTUyBjbGFzc1xuICAgKiAgIEUtPj5FOiBGb3JtYXQgc3VidGl0bGUgQ1NTIGNsYXNzXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBhcnNlUHJvcHModGhpcyk7XG4gICAgdGhpcy50cmFuc2xhdGFibGUgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy50cmFuc2xhdGFibGUpO1xuICAgIHRoaXMuc2hvd0ljb24gPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93SWNvbik7XG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG5cbiAgICAvLyBpZih0aGlzLnRyYW5zbGF0YWJsZSkge1xuICAgIC8vICAgdGhpcy50aXRsZSA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy50aXRsZSk7XG4gICAgLy8gICB0aGlzLnN1YnRpdGxlID0gZ2VuZXJhdGVMb2NhbGVGcm9tU3RyaW5nKHRoaXMubG9jYWxlLCB0aGlzLnN1YnRpdGxlKTtcbiAgICAvLyAgIHRoaXMuYnV0dG9uVGV4dCA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5idXR0b25UZXh0KTtcbiAgICAvLyB9XG5cbiAgICB0aGlzLnRpdGxlQ29sb3IgPSBgZGNmLXRpdGxlIGNvbG9yLSR7dGhpcy50aXRsZUNvbG9yfWA7XG4gICAgdGhpcy5zdWJ0aXRsZUNvbG9yID0gYGRjZi1zdWJ0aXRsZSBjb2xvci0ke3RoaXMudGl0bGVDb2xvcn1gO1xuXG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSAmJiB0aGlzLnRyYW5zbGF0YWJsZSlcbiAgICAgIHRoaXMuc2VhcmNoU3VidGl0bGUgPSBhd2FpdCB0aGlzLmdldFNlYXJjaFN1YnRpdGxlKHRoaXMuc3VidGl0bGUgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgb24gdGhlIGFjdGlvbiBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgZW1wdHkgc3RhdGVcbiAgICogY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aHJlZSBuYXZpZ2F0aW9uIHBhdHRlcm5zOiAxKSBubyBhY3Rpb24gd2hlbiBidXR0b25MaW5rIGlzIG5vdCBwcm92aWRlZCxcbiAgICogMikgY3VzdG9tIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aGVuIGJ1dHRvbkxpbmsgaXMgYSBmdW5jdGlvbiwgYW5kIDMpIG5hdmlnYXRpb24gdG8gYSBzcGVjaWZpYyBVUkxcbiAgICogd2hlbiBidXR0b25MaW5rIGlzIGEgc3RyaW5nLiBUaGlzIGZsZXhpYmlsaXR5IGFsbG93cyB0aGUgZW1wdHkgc3RhdGUgdG8gdHJpZ2dlciB2YXJpb3VzIGFjdGlvbnNcbiAgICogYmFzZWQgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQncyB1c2VkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBOIGFzIE5hdkNvbnRyb2xsZXJcbiAgICpcbiAgICogICBVLT4+RTogQ2xpY2sgYWN0aW9uIGJ1dHRvblxuICAgKiAgIEUtPj5FOiBoYW5kbGVDbGljaygpXG4gICAqICAgYWx0IGJ1dHRvbkxpbmsgaXMgbm90IHByb3ZpZGVkXG4gICAqICAgICBFLS0+PlU6IFJldHVybiBmYWxzZSAobm8gYWN0aW9uKVxuICAgKiAgIGVsc2UgYnV0dG9uTGluayBpcyBhIGZ1bmN0aW9uXG4gICAqICAgICBFLT4+RTogRXhlY3V0ZSBidXR0b25MaW5rIGZ1bmN0aW9uXG4gICAqICAgICBFLS0+PlU6IFJldHVybiBmdW5jdGlvbiByZXN1bHRcbiAgICogICBlbHNlIGJ1dHRvbkxpbmsgaXMgYSBVUkwgc3RyaW5nXG4gICAqICAgICBFLT4+TjogbmF2aWdhdGVGb3J3YXJkKGJ1dHRvbkxpbmspXG4gICAqICAgICBOLS0+PkU6IFJldHVybiBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgKiAgICAgRS0tPj5VOiBSZXR1cm4gbmF2aWdhdGlvbiByZXN1bHRcbiAgICogICBlbmRcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+fVxuICAgKiAgIC0gZmFsc2UgaWYgbm8gYWN0aW9uIGlzIHRha2VuXG4gICAqICAgLSBUaGUgcmVzdWx0IG9mIHRoZSBidXR0b25MaW5rIGZ1bmN0aW9uIGlmIGl0J3MgYSBmdW5jdGlvblxuICAgKiAgIC0gQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbmF2aWdhdGlvbiByZXN1bHQgaWYgYnV0dG9uTGluayBpcyBhIFVSTFxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2xpY2soKTogYm9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuYnV0dG9uTGluaztcbiAgICBpZighZm4pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbilcbiAgICAgIHJldHVybiBmbigpO1xuICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVGb3J3YXJkKGZuIGFzIHN0cmluZyk7XG4gIH1cblxuXG4gLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBsb2NhbGl6ZWQgYW5kIHNhbml0aXplZCBzdWJ0aXRsZSBmb3Igc2VhcmNoIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHRha2VzIGEgY29udGVudCBzdHJpbmcsIHR5cGljYWxseSB0aGUgc3VidGl0bGUsIGFuZCBwcm9jZXNzZXMgaXRcbiAgICogdGhyb3VnaCB0aGUgdHJhbnNsYXRpb24gc2VydmljZS4gSXQgcmVwbGFjZXMgYSBwbGFjZWhvbGRlciAoJ3ZhbHVlMCcpIHdpdGggdGhlIGFjdHVhbFxuICAgKiBzZWFyY2ggdmFsdWUsIHRoZW4gc2FuaXRpemVzIHRoZSByZXN1bHQgdG8gc2FmZWx5IHVzZSBhcyBIVE1MLiBUaGlzIGlzIHBhcnRpY3VsYXJseVxuICAgKiB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgZHluYW1pYywgbG9jYWxpemVkIG1lc3NhZ2VzIGluIHRoZSBlbXB0eSBzdGF0ZSB3aGVuIGEgc2VhcmNoXG4gICAqIHlpZWxkcyBubyByZXN1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFRoZSBjb250ZW50IHN0cmluZyB0byBiZSB0cmFuc2xhdGVkIGFuZCBwcm9jZXNzZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxTYWZlSHRtbD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgc2FuaXRpemVkIEhUTUwgc3RyaW5nXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgVHJhbnNsYXRlU2VydmljZVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgRG9tU2FuaXRpemVyXG4gICAqXG4gICAqICAgRS0+PlQ6IGluc3RhbnQoY29udGVudCwgeyd2YWx1ZTAnOiBzZWFyY2hWYWx1ZX0pXG4gICAqICAgVC0tPj5FOiBSZXR1cm4gdHJhbnNsYXRlZCBzdHJpbmdcbiAgICogICBFLT4+UzogYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodHJhbnNsYXRlZFN0cmluZylcbiAgICogICBTLS0+PkU6IFJldHVybiBzYW5pdGl6ZWQgU2FmZUh0bWxcbiAgICpcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGdldFNlYXJjaFN1YnRpdGxlKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8U2FmZUh0bWw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGNvbnRlbnQsIHsndmFsdWUwJzogdGhpcy5zZWFyY2hWYWx1ZX0pO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChyZXN1bHQpO1xuICB9XG59XG4iLCJcbjxpb24tY2FyZCBpZD1cImRjZi1jYXJkLWVtcHR5LXN0YXRlXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxpb24tY2FyZC1jb250ZW50PlxuICAgIEBpZihpY29uICYmIHNob3dJY29uKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZGNmLWljb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxpb24taWNvblxuICAgICAgICAgIG5hbWU9XCJhbGVydC1jaXJjbGUtb3V0bGluZVwiXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYodGl0bGUpIHtcbiAgICAgIDxoNSBbY2xhc3NdPVwidGl0bGVDb2xvclwiIFtpbm5lckhUTUxdPVwidGl0bGVcIj48L2g1PlxuICAgIH1cbiAgICBAaWYoc3VidGl0bGUpIHtcbiAgICAgIEBpZighc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cInN1YnRpdGxlQ29sb3JcIiBbaW5uZXJIVE1MXT1cInN1YnRpdGxlXCI+PC9wPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJzdWJ0aXRsZUNvbG9yXCIgW2lubmVySFRNTF09XCJzZWFyY2hTdWJ0aXRsZVwiPjwvcD5cbiAgICAgIH1cbiAgICB9XG4gICAgQGlmKGJ1dHRvbkxpbmsgJiYgYnV0dG9uVGV4dCkge1xuICAgICAgPGRpdj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBbc2l6ZV09XCJidXR0b25TaXplXCJcbiAgICAgICAgICBbZmlsbF09XCJidXR0b25GaWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiYnV0dG9uQ29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygpXCI+XG4gICAgICAgICAge3sgIGJ1dHRvblRleHQgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG48L2lvbi1jYXJkPlxuIl19
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktc3RhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFDTCxPQUFPLEVBQ1AsY0FBYyxFQUNkLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQ0ksMkJBQTJCLENBQUM7QUFDakMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBSXZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBZ0JJLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW9CLFNBQVEsZ0JBQWdCO0lBa012RDs7Ozs7OztPQU9HO0lBQ0g7UUFDRSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQXpNL0I7Ozs7Ozs7OztXQVNH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LGthRDRCSSxnQkFBZ0IsNlhBQ2hCLE9BQU8seUxBQ1AsY0FBYywrRUFFZCxPQUFPOztBQUlFLG1CQUFtQjtJQWYvQixPQUFPLEVBQUU7O0dBZUcsbUJBQW1CLENBb1UvQjs7NEZBcFVZLG1CQUFtQjtrQkFkL0IsU0FBUzsrQkFDRSx1QkFBdUIsY0FHckIsSUFBSSxXQUNQO3dCQUNQLGdCQUFnQjt3QkFDaEIsT0FBTzt3QkFDUCxjQUFjO3dCQUNkLFFBQVE7d0JBQ1IsT0FBTztxQkFDUjt3REFnQkQsS0FBSztzQkFESixLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSztnQkFhTixRQUFRO3NCQURQLEtBQUs7Z0JBY04sYUFBYTtzQkFEWixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFjTixJQUFJO3NCQURILEtBQUs7Z0JBYU4sUUFBUTtzQkFEUCxLQUFLO2dCQWFOLFNBQVM7c0JBRFIsS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBYU4sVUFBVTtzQkFEVCxLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSztnQkFhTixXQUFXO3NCQURWLEtBQUs7Z0JBYU4sVUFBVTtzQkFEVCxLQUFLO2dCQWFOLFdBQVc7c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sb3IsIFByZWRlZmluZWRDb2xvcnMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge1xuICBJb25DYXJkLFxuICBJb25DYXJkQ29udGVudCxcbiAgSW9uSWNvbixcbiAgSW9uVGl0bGUsXG4gIE5hdkNvbnRyb2xsZXJcbn1cbmZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0ICogYXMgYWxsSWNvbnMgZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IER5bmFtaWMsIFN0cmluZ09yQm9vbGVhbiB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBzdHJpbmdUb0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4QmFzZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvdHlwZXMnO1xuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBmb3IgZGlzcGxheWluZyBlbXB0eSBzdGF0ZSBtZXNzYWdlcyB3aXRoIG9wdGlvbmFsIGFjdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZGlzcGxheSBlbXB0eSBzdGF0ZSBtZXNzYWdlc1xuICogd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBvciB3aGVuIGEgdXNlciBuZWVkcyB0byB0YWtlIGFuIGFjdGlvbiB0byBwb3B1bGF0ZSBjb250ZW50LlxuICogSXQgaW5jbHVkZXMgY3VzdG9taXphYmxlIHRpdGxlLCBzdWJ0aXRsZSwgaWNvbiwgYW5kIGFjdGlvbiBidXR0b24gZWxlbWVudHMgdGhhdCBjYW4gYmVcbiAqIHN0eWxlZCBhbmQgY29uZmlndXJlZCB0aHJvdWdoIGlucHV0IHByb3BlcnRpZXMuIFRoZSBjb21wb25lbnQgc3VwcG9ydHMgbG9jYWxpemF0aW9uXG4gKiBhbmQgY2FuIHRyaWdnZXIgbmF2aWdhdGlvbiBvciBjdXN0b20gYWN0aW9ucyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cbiAqXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIEVtcHR5U3RhdGVDb21wb25lbnQge1xuICogICAgICtzdHJpbmcgdGl0bGVcbiAqICAgICArc3RyaW5nIHRpdGxlQ29sb3JcbiAqICAgICArc3RyaW5nIHN1YnRpdGxlXG4gKiAgICAgK3N0cmluZyBzdWJ0aXRsZUNvbG9yXG4gKiAgICAgK1N0cmluZ09yQm9vbGVhbiBzaG93SWNvblxuICogICAgICtzdHJpbmcgaWNvblxuICogICAgICtzdHJpbmcgaWNvblNpemVcbiAqICAgICArUHJlZGVmaW5lZENvbG9ycyBpY29uQ29sb3JcbiAqICAgICArc3RyaW5nfEZ1bmN0aW9uIGJ1dHRvbkxpbmtcbiAqICAgICArc3RyaW5nIGJ1dHRvblRleHRcbiAqICAgICArc3RyaW5nIGJ1dHRvbkZpbGxcbiAqICAgICArQ29sb3IgYnV0dG9uQ29sb3JcbiAqICAgICArc3RyaW5nIGJ1dHRvblNpemVcbiAqICAgICArc3RyaW5nIHNlYXJjaFZhbHVlXG4gKiAgICAgLU5hdkNvbnRyb2xsZXIgbmF2Q29udHJvbGxlclxuICogICAgICtuZ09uSW5pdCgpXG4gKiAgICAgK2hhbmRsZUNsaWNrKClcbiAqICAgfVxuICogICBFbXB0eVN0YXRlQ29tcG9uZW50IC0tfD4gTmd4QmFzZUNvbXBvbmVudFxuICogICBFbXB0eVN0YXRlQ29tcG9uZW50IC0tfD4gT25Jbml0XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtZW1wdHktc3RhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1wdHktc3RhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbXB0eS1zdGF0ZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9yQW5ndWxhck1vZHVsZSxcbiAgICBJb25DYXJkLFxuICAgIElvbkNhcmRDb250ZW50LFxuICAgIElvblRpdGxlLFxuICAgIElvbkljb25cbiAgXVxuXG59KVxuZXhwb3J0IGNsYXNzIEVtcHR5U3RhdGVDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYWluIHRpdGxlIGRpc3BsYXllZCBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgcHJpbWFyeSBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGVtcHR5IHN0YXRlIGNvbXBvbmVudC5cbiAgICogVGhpcyB0ZXh0IGlzIHR5cGljYWxseSB1c2VkIHRvIGluZm9ybSB0aGUgdXNlciBhYm91dCB3aHkgdGhleSdyZSBzZWVpbmcgYW4gZW1wdHkgdmlldy5cbiAgICogSWYgdHJhbnNsYXRhYmxlIGlzIHRydWUsIHRoaXMgd2lsbCBiZSBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgbG9jYWxpemF0aW9uIHN5c3RlbS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgXCJ0aXRsZVwiXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nID0gXCJ0aXRsZVwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSB0aXRsZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbG9yIGZvciB0aGUgdGl0bGUgdGV4dCB1c2luZyB0aGUgYXBwbGljYXRpb24ncyBjb2xvciBzeXN0ZW0uXG4gICAqIFRoZSB2YWx1ZSBzaG91bGQgY29ycmVzcG9uZCB0byBhIGNvbG9yIHZhcmlhYmxlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgdGhlbWUuXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHByZWZpeCB0aGlzIHdpdGggXCJjb2xvci1cIiB0byBjcmVhdGUgdGhlIENTUyBjbGFzcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2dyYXktNidcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlQ29sb3IgPSAnZ3JheS02JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzZWNvbmRhcnkgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRleHQgb3IgaW5zdHJ1Y3Rpb25zIGJlbG93IHRoZSBtYWluIHRpdGxlLlxuICAgKiBUaGlzIHRleHQgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZ3VpZGUgdGhlIHVzZXIgb24gd2hhdCBhY3Rpb25zIHRoZXkgY2FuIHRha2UuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJ0aXRsZTogc3RyaW5nID0gXCJcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb2xvciBvZiB0aGUgc3VidGl0bGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIHN1YnRpdGxlIHRleHQgdXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc3lzdGVtLlxuICAgKiBUaGUgdmFsdWUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBjb2xvciB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHRoZW1lLlxuICAgKiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBwcmVmaXggdGhpcyB3aXRoIFwiY29sb3ItXCIgdG8gY3JlYXRlIHRoZSBDU1MgY2xhc3MuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdncmF5LTQnXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJ0aXRsZUNvbG9yOiBzdHJpbmcgPSAnZ3JheS00JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGljb24gaXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHRoZSB2aXN1YWwgaWNvbiBzaG91bGQgYmUgc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIGJvb2xlYW4gb3IgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uXG4gICAqIEljb25zIGhlbHAgdmlzdWFsbHkgY29tbXVuaWNhdGUgdGhlIGVtcHR5IHN0YXRlIGNvbnRleHQgdG8gdXNlcnMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dJY29uOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG5hbWUgb2YgdGhlIGljb24gdG8gZGlzcGxheS5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIGljb24gdG8gc2hvdyB3aGVuIHNob3dJY29uIGlzIHRydWUuXG4gICAqIFRoZSBjb21wb25lbnQgdXNlcyB0aGUgaWNvbiBzeXN0ZW0gZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24sXG4gICAqIGFuZCB0aGlzIHZhbHVlIHNob3VsZCBjb3JyZXNwb25kIHRvIGFuIGF2YWlsYWJsZSBpY29uIG5hbWUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwidGktaW5mby1zcXVhcmUtcm91bmRlZFwiXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpY29uOiBzdHJpbmcgPSBcInRpLWluZm8tc3F1YXJlLXJvdW5kZWRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBkaXNwbGF5ZWQgaWNvbi5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBDYW4gYmUgZWl0aGVyICdsYXJnZScgb3IgJ3NtYWxsJyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgbGF5b3V0IG5lZWRzLlxuICAgKlxuICAgKiBAdHlwZSB7J2xhcmdlJyB8ICdzbWFsbCcgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICdsYXJnZSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb25TaXplPzogJ2xhcmdlJyB8ICdzbWFsbCcgPSAnbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSBkaXNwbGF5ZWQgaWNvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIGljb24gdXNpbmcgSW9uaWMncyBwcmVkZWZpbmVkIGNvbG9yIHN5c3RlbS5cbiAgICogVGhpcyBhbGxvd3MgdGhlIGljb24gdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc2NoZW1lLlxuICAgKlxuICAgKiBAdHlwZSB7UHJlZGVmaW5lZENvbG9ycyB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgJ21lZGl1bSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb25Db2xvcj86IFByZWRlZmluZWRDb2xvcnMgPSAnbWVkaXVtJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCBvciBhY3Rpb24gZm9yIHRoZSBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGVyZSB0aGUgYnV0dG9uIHNob3VsZCBuYXZpZ2F0ZSB0byB3aGVuIGNsaWNrZWQgb3Igd2hhdCBmdW5jdGlvblxuICAgKiBpdCBzaG91bGQgZXhlY3V0ZS4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgVVJMIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBuYXZpZ2F0aW9uLlxuICAgKiBXaGVuIG5vdCBwcm92aWRlZCwgdGhlIGJ1dHRvbiB3aWxsIG5vdCBwZXJmb3JtIGFueSBhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2UgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBidXR0b25MaW5rPzogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGxhYmVsIGZvciB0aGUgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdGhlIGJ1dHRvbiB3aWxsIG5vdCBkaXNwbGF5IGFueSB0ZXh0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWxsIHN0eWxlIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgdmlzdWFsIHN0eWxlIG9mIHRoZSBidXR0b24gdXNpbmcgSW9uaWMncyBidXR0b24gZmlsbCBvcHRpb25zLlxuICAgKiAnc29saWQnIGNyZWF0ZXMgYSBidXR0b24gd2l0aCBhIHNvbGlkIGJhY2tncm91bmQsICdvdXRsaW5lJyBjcmVhdGVzIGEgYnV0dG9uIHdpdGhcbiAgICoganVzdCBhIGJvcmRlciwgYW5kICdjbGVhcicgY3JlYXRlcyBhIGJ1dHRvbiB3aXRoIG5vIGJhY2tncm91bmQgb3IgYm9yZGVyLlxuICAgKlxuICAgKiBAdHlwZSB7J2NsZWFyJyB8ICdzb2xpZCcgfCAnb3V0bGluZSd9XG4gICAqIEBkZWZhdWx0ICdzb2xpZCdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvbkZpbGw6ICdjbGVhcicgfCAnc29saWQnIHwgJ291dGxpbmUnID0gICdzb2xpZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29sb3Igb2YgdGhlIGFjdGlvbiBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHRoZSBidXR0b24gdXNpbmcgSW9uaWMncyBjb2xvciBzeXN0ZW0uXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBidXR0b24gdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc2NoZW1lLlxuICAgKlxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZWZhdWx0ICdwcmltYXJ5J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uQ29sb3I6IENvbG9yID0gICdwcmltYXJ5JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uIHNob3duIGluIHRoZSBlbXB0eSBzdGF0ZS5cbiAgICogQ2FuIGJlICdsYXJnZScsICdzbWFsbCcsIG9yICdkZWZhdWx0JyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgbGF5b3V0IG5lZWRzLlxuICAgKlxuICAgKiBAdHlwZSB7J2xhcmdlJyB8ICdzbWFsbCcgfCAnZGVmYXVsdCd9XG4gICAqIEBkZWZhdWx0ICdkZWZhdWx0J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uU2l6ZTogJ2xhcmdlJyB8ICdzbWFsbCcgfCAnZGVmYXVsdCcgPSAgJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlYXJjaCB2YWx1ZSB0aGF0IHJlc3VsdGVkIGluIG5vIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdGhlIGVtcHR5IHN0YXRlIGlzIHNob3duIGR1ZSB0byBhIHNlYXJjaCB3aXRoIG5vIHJlc3VsdHMsXG4gICAqIHRoaXMgcHJvcGVydHkgY2FuIGhvbGQgdGhlIHNlYXJjaCB0ZXJtIHRoYXQgd2FzIHVzZWQuIFRoaXMgY2FuIGJlIGRpc3BsYXllZFxuICAgKiBpbiB0aGUgZW1wdHkgc3RhdGUgbWVzc2FnZSB0byBwcm92aWRlIGNvbnRleHQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzZWFyY2hWYWx1ZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcnZpY2UgZm9yIGhhbmRsaW5nIG5hdmlnYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIG5hdmlnYXRpbmcgYmV0d2VlbiByb3V0ZXMuXG4gICAqIFRoaXMgc2VydmljZSBpcyB1c2VkIHdoZW4gdGhlIGJ1dHRvbkxpbmsgaXMgYSBzdHJpbmcgVVJMIHRvIG5hdmlnYXRlIHRvIHRoYXQgbG9jYXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtOYXZDb250cm9sbGVyfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyID0gaW5qZWN0KE5hdkNvbnRyb2xsZXIpO1xuXG4gIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcblxuICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBzZWFyY2hTdWJ0aXRsZSE6IFNhZmVIdG1sXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRW1wdHlTdGF0ZUNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRW1wdHlTdGF0ZUNvbXBvbmVudCBieSBjYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgY29uc3RydWN0b3JcbiAgICogd2l0aCB0aGUgY29tcG9uZW50IG5hbWUgZm9yIGxvZ2dpbmcgYW5kIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLiBUaGlzIGNvbXBvbmVudCBwcm92aWRlc1xuICAgKiBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZGlzcGxheSBlbXB0eSBzdGF0ZSBtZXNzYWdlcyB3aXRoIG9wdGlvbmFsIGljb25zIGFuZCBhY3Rpb24gYnV0dG9ucy5cbiAgICpcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiRW1wdHlTdGF0ZUNvbXBvbmVudFwiKTtcbiAgICBhZGRJY29ucyhhbGxJY29ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBmaXJzdCBkaXNwbGF5cyB0aGUgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgcHJvY2Vzc2luZyBib29sZWFuIGlucHV0cywgYXBwbHlpbmcgbG9jYWxpemF0aW9uIHRvIHRleHRcbiAgICogZWxlbWVudHMgaWYgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCwgYW5kIGZvcm1hdHRpbmcgQ1NTIGNsYXNzZXMgZm9yIHRpdGxlIGFuZCBzdWJ0aXRsZSBjb2xvcnMuXG4gICAqIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXIgaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlXG4gICAqIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBsb2NhbGl6ZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICpcbiAgICogICBBLT4+RTogbmdPbkluaXQoKVxuICAgKiAgIEUtPj5FOiBQcm9jZXNzIHRyYW5zbGF0YWJsZSBmbGFnXG4gICAqICAgRS0+PkU6IFByb2Nlc3Mgc2hvd0ljb24gZmxhZ1xuICAgKiAgIEUtPj5FOiBHZXQgbG9jYWxlIHNldHRpbmdzXG4gICAqICAgYWx0IHRyYW5zbGF0YWJsZSBpcyB0cnVlXG4gICAqICAgICBFLT4+RTogTG9jYWxpemUgdGl0bGVcbiAgICogICAgIEUtPj5FOiBMb2NhbGl6ZSBzdWJ0aXRsZVxuICAgKiAgICAgRS0+PkU6IExvY2FsaXplIGJ1dHRvblRleHRcbiAgICogICBlbmRcbiAgICogICBFLT4+RTogRm9ybWF0IHRpdGxlIENTUyBjbGFzc1xuICAgKiAgIEUtPj5FOiBGb3JtYXQgc3VidGl0bGUgQ1NTIGNsYXNzXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBhcnNlUHJvcHModGhpcyk7XG4gICAgdGhpcy50cmFuc2xhdGFibGUgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy50cmFuc2xhdGFibGUpO1xuICAgIHRoaXMuc2hvd0ljb24gPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93SWNvbik7XG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG5cbiAgICAvLyBpZih0aGlzLnRyYW5zbGF0YWJsZSkge1xuICAgIC8vICAgdGhpcy50aXRsZSA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy50aXRsZSk7XG4gICAgLy8gICB0aGlzLnN1YnRpdGxlID0gZ2VuZXJhdGVMb2NhbGVGcm9tU3RyaW5nKHRoaXMubG9jYWxlLCB0aGlzLnN1YnRpdGxlKTtcbiAgICAvLyAgIHRoaXMuYnV0dG9uVGV4dCA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5idXR0b25UZXh0KTtcbiAgICAvLyB9XG5cbiAgICB0aGlzLnRpdGxlQ29sb3IgPSBgZGNmLXRpdGxlIGNvbG9yLSR7dGhpcy50aXRsZUNvbG9yfWA7XG4gICAgdGhpcy5zdWJ0aXRsZUNvbG9yID0gYGRjZi1zdWJ0aXRsZSBjb2xvci0ke3RoaXMudGl0bGVDb2xvcn1gO1xuXG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSAmJiB0aGlzLnRyYW5zbGF0YWJsZSlcbiAgICAgIHRoaXMuc2VhcmNoU3VidGl0bGUgPSBhd2FpdCB0aGlzLmdldFNlYXJjaFN1YnRpdGxlKHRoaXMuc3VidGl0bGUgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgb24gdGhlIGFjdGlvbiBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgZW1wdHkgc3RhdGVcbiAgICogY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aHJlZSBuYXZpZ2F0aW9uIHBhdHRlcm5zOiAxKSBubyBhY3Rpb24gd2hlbiBidXR0b25MaW5rIGlzIG5vdCBwcm92aWRlZCxcbiAgICogMikgY3VzdG9tIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aGVuIGJ1dHRvbkxpbmsgaXMgYSBmdW5jdGlvbiwgYW5kIDMpIG5hdmlnYXRpb24gdG8gYSBzcGVjaWZpYyBVUkxcbiAgICogd2hlbiBidXR0b25MaW5rIGlzIGEgc3RyaW5nLiBUaGlzIGZsZXhpYmlsaXR5IGFsbG93cyB0aGUgZW1wdHkgc3RhdGUgdG8gdHJpZ2dlciB2YXJpb3VzIGFjdGlvbnNcbiAgICogYmFzZWQgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQncyB1c2VkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBOIGFzIE5hdkNvbnRyb2xsZXJcbiAgICpcbiAgICogICBVLT4+RTogQ2xpY2sgYWN0aW9uIGJ1dHRvblxuICAgKiAgIEUtPj5FOiBoYW5kbGVDbGljaygpXG4gICAqICAgYWx0IGJ1dHRvbkxpbmsgaXMgbm90IHByb3ZpZGVkXG4gICAqICAgICBFLS0+PlU6IFJldHVybiBmYWxzZSAobm8gYWN0aW9uKVxuICAgKiAgIGVsc2UgYnV0dG9uTGluayBpcyBhIGZ1bmN0aW9uXG4gICAqICAgICBFLT4+RTogRXhlY3V0ZSBidXR0b25MaW5rIGZ1bmN0aW9uXG4gICAqICAgICBFLS0+PlU6IFJldHVybiBmdW5jdGlvbiByZXN1bHRcbiAgICogICBlbHNlIGJ1dHRvbkxpbmsgaXMgYSBVUkwgc3RyaW5nXG4gICAqICAgICBFLT4+TjogbmF2aWdhdGVGb3J3YXJkKGJ1dHRvbkxpbmspXG4gICAqICAgICBOLS0+PkU6IFJldHVybiBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgKiAgICAgRS0tPj5VOiBSZXR1cm4gbmF2aWdhdGlvbiByZXN1bHRcbiAgICogICBlbmRcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+fVxuICAgKiAgIC0gZmFsc2UgaWYgbm8gYWN0aW9uIGlzIHRha2VuXG4gICAqICAgLSBUaGUgcmVzdWx0IG9mIHRoZSBidXR0b25MaW5rIGZ1bmN0aW9uIGlmIGl0J3MgYSBmdW5jdGlvblxuICAgKiAgIC0gQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbmF2aWdhdGlvbiByZXN1bHQgaWYgYnV0dG9uTGluayBpcyBhIFVSTFxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2xpY2soKTogYm9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuYnV0dG9uTGluaztcbiAgICBpZighZm4pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbilcbiAgICAgIHJldHVybiBmbigpO1xuICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVGb3J3YXJkKGZuIGFzIHN0cmluZyk7XG4gIH1cblxuXG4gLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBsb2NhbGl6ZWQgYW5kIHNhbml0aXplZCBzdWJ0aXRsZSBmb3Igc2VhcmNoIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHRha2VzIGEgY29udGVudCBzdHJpbmcsIHR5cGljYWxseSB0aGUgc3VidGl0bGUsIGFuZCBwcm9jZXNzZXMgaXRcbiAgICogdGhyb3VnaCB0aGUgdHJhbnNsYXRpb24gc2VydmljZS4gSXQgcmVwbGFjZXMgYSBwbGFjZWhvbGRlciAoJ3ZhbHVlMCcpIHdpdGggdGhlIGFjdHVhbFxuICAgKiBzZWFyY2ggdmFsdWUsIHRoZW4gc2FuaXRpemVzIHRoZSByZXN1bHQgdG8gc2FmZWx5IHVzZSBhcyBIVE1MLiBUaGlzIGlzIHBhcnRpY3VsYXJseVxuICAgKiB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgZHluYW1pYywgbG9jYWxpemVkIG1lc3NhZ2VzIGluIHRoZSBlbXB0eSBzdGF0ZSB3aGVuIGEgc2VhcmNoXG4gICAqIHlpZWxkcyBubyByZXN1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFRoZSBjb250ZW50IHN0cmluZyB0byBiZSB0cmFuc2xhdGVkIGFuZCBwcm9jZXNzZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxTYWZlSHRtbD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgc2FuaXRpemVkIEhUTUwgc3RyaW5nXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgVHJhbnNsYXRlU2VydmljZVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgRG9tU2FuaXRpemVyXG4gICAqXG4gICAqICAgRS0+PlQ6IGluc3RhbnQoY29udGVudCwgeyd2YWx1ZTAnOiBzZWFyY2hWYWx1ZX0pXG4gICAqICAgVC0tPj5FOiBSZXR1cm4gdHJhbnNsYXRlZCBzdHJpbmdcbiAgICogICBFLT4+UzogYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodHJhbnNsYXRlZFN0cmluZylcbiAgICogICBTLS0+PkU6IFJldHVybiBzYW5pdGl6ZWQgU2FmZUh0bWxcbiAgICpcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGdldFNlYXJjaFN1YnRpdGxlKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8U2FmZUh0bWw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGNvbnRlbnQsIHsndmFsdWUwJzogdGhpcy5zZWFyY2hWYWx1ZX0pO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChyZXN1bHQpO1xuICB9XG59XG4iLCJcbjxpb24tY2FyZCBbaWRdPVwidWlkXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxpb24tY2FyZC1jb250ZW50PlxuICAgIEBpZihpY29uICYmIHNob3dJY29uKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZGNmLWljb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxpb24taWNvblxuICAgICAgICAgIG5hbWU9XCJhbGVydC1jaXJjbGUtb3V0bGluZVwiXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYodGl0bGUpIHtcbiAgICAgIDxoNSBbY2xhc3NdPVwidGl0bGVDb2xvclwiIFtpbm5lckhUTUxdPVwidGl0bGVcIj48L2g1PlxuICAgIH1cbiAgICBAaWYoc3VidGl0bGUpIHtcbiAgICAgIEBpZighc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cInN1YnRpdGxlQ29sb3JcIiBbaW5uZXJIVE1MXT1cInN1YnRpdGxlXCI+PC9wPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJzdWJ0aXRsZUNvbG9yXCIgW2lubmVySFRNTF09XCJzZWFyY2hTdWJ0aXRsZVwiPjwvcD5cbiAgICAgIH1cbiAgICB9XG4gICAgQGlmKGJ1dHRvbkxpbmsgJiYgYnV0dG9uVGV4dCkge1xuICAgICAgPGRpdj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBbc2l6ZV09XCJidXR0b25TaXplXCJcbiAgICAgICAgICBbZmlsbF09XCJidXR0b25GaWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiYnV0dG9uQ29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygpXCI+XG4gICAgICAgICAge3sgIGJ1dHRvblRleHQgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG48L2lvbi1jYXJkPlxuIl19