@decaf-ts/for-angular 0.0.9 → 0.0.10

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 (120) hide show
  1. package/dist/{lib/components → components}/empty-state/empty-state.component.d.ts +3 -3
  2. package/dist/{lib/components → components}/fieldset/fieldset.component.d.ts +1 -1
  3. package/dist/{lib/components → components}/filter/filter.component.d.ts +2 -2
  4. package/dist/{lib/components → components}/layout/layout.component.d.ts +2 -2
  5. package/dist/{lib/components → components}/list/list.component.d.ts +3 -3
  6. package/dist/{lib/components → components}/list-item/list-item.component.d.ts +3 -3
  7. package/dist/{lib/components → components}/model-renderer/model-renderer.component.d.ts +1 -1
  8. package/dist/{lib/components → components}/pagination/constants.d.ts +1 -1
  9. package/dist/{lib/components → components}/pagination/pagination.component.d.ts +2 -2
  10. package/dist/{lib/components → components}/searchbar/searchbar.component.d.ts +2 -2
  11. package/dist/{lib/engine → engine}/NgxBaseComponent.d.ts +1 -1
  12. package/dist/{lib/esm2022 → esm2022}/components/component-renderer/component-renderer.component.mjs +3 -3
  13. package/dist/esm2022/components/crud-field/crud-field.component.mjs +301 -0
  14. package/dist/esm2022/components/crud-form/constants.mjs +14 -0
  15. package/dist/esm2022/components/crud-form/crud-form.component.mjs +139 -0
  16. package/dist/esm2022/components/crud-form/types.mjs +2 -0
  17. package/dist/esm2022/components/empty-state/empty-state.component.mjs +348 -0
  18. package/dist/esm2022/components/fieldset/fieldset.component.mjs +225 -0
  19. package/dist/esm2022/components/filter/filter.component.mjs +689 -0
  20. package/dist/esm2022/components/for-angular-components.module.mjs +71 -0
  21. package/dist/esm2022/components/index.mjs +20 -0
  22. package/dist/esm2022/components/layout/layout.component.mjs +176 -0
  23. package/dist/esm2022/components/list/constants.mjs +6 -0
  24. package/dist/esm2022/components/list/list.component.mjs +1236 -0
  25. package/dist/{lib/esm2022 → esm2022}/components/list-item/list-item.component.mjs +6 -6
  26. package/dist/esm2022/components/model-renderer/model-renderer.component.mjs +138 -0
  27. package/dist/esm2022/components/pagination/constants.mjs +2 -0
  28. package/dist/esm2022/components/pagination/pagination.component.mjs +323 -0
  29. package/dist/esm2022/components/searchbar/searchbar.component.mjs +493 -0
  30. package/dist/esm2022/decaf-ts-for-angular.mjs +5 -0
  31. package/dist/esm2022/directives/collapsable.directive.mjs +28 -0
  32. package/dist/esm2022/directives/index.mjs +2 -0
  33. package/dist/esm2022/engine/DynamicModule.mjs +18 -0
  34. package/dist/esm2022/engine/NgxBaseComponent.mjs +539 -0
  35. package/dist/esm2022/engine/NgxCrudFormField.mjs +125 -0
  36. package/dist/esm2022/engine/NgxFormService.mjs +315 -0
  37. package/dist/esm2022/engine/NgxRenderingEngine.mjs +192 -0
  38. package/dist/esm2022/engine/NgxRenderingEngine2.mjs +332 -0
  39. package/dist/esm2022/engine/ValidatorFactory.mjs +102 -0
  40. package/dist/esm2022/engine/constants.mjs +160 -0
  41. package/dist/esm2022/engine/decorators.mjs +38 -0
  42. package/dist/esm2022/engine/index.mjs +17 -0
  43. package/dist/esm2022/engine/types.mjs +4 -0
  44. package/dist/esm2022/for-angular.module.mjs +118 -0
  45. package/dist/esm2022/helpers/index.mjs +13 -0
  46. package/dist/esm2022/helpers/utils.mjs +415 -0
  47. package/dist/esm2022/interfaces.mjs +2 -0
  48. package/dist/esm2022/public-apis.mjs +14 -0
  49. package/dist/{lib/fesm2022 → fesm2022}/decaf-ts-for-angular.mjs +3029 -3036
  50. package/dist/fesm2022/decaf-ts-for-angular.mjs.map +1 -0
  51. package/package.json +4 -2
  52. package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -301
  53. package/dist/lib/esm2022/components/crud-form/constants.mjs +0 -14
  54. package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -139
  55. package/dist/lib/esm2022/components/crud-form/types.mjs +0 -2
  56. package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -348
  57. package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -225
  58. package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -689
  59. package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -71
  60. package/dist/lib/esm2022/components/index.mjs +0 -20
  61. package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -176
  62. package/dist/lib/esm2022/components/list/constants.mjs +0 -6
  63. package/dist/lib/esm2022/components/list/list.component.mjs +0 -1236
  64. package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -138
  65. package/dist/lib/esm2022/components/pagination/constants.mjs +0 -2
  66. package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -323
  67. package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -493
  68. package/dist/lib/esm2022/decaf-ts-for-angular.mjs +0 -5
  69. package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
  70. package/dist/lib/esm2022/directives/index.mjs +0 -2
  71. package/dist/lib/esm2022/engine/DynamicModule.mjs +0 -18
  72. package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -540
  73. package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +0 -125
  74. package/dist/lib/esm2022/engine/NgxFormService.mjs +0 -315
  75. package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +0 -192
  76. package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
  77. package/dist/lib/esm2022/engine/ValidatorFactory.mjs +0 -102
  78. package/dist/lib/esm2022/engine/constants.mjs +0 -160
  79. package/dist/lib/esm2022/engine/decorators.mjs +0 -38
  80. package/dist/lib/esm2022/engine/index.mjs +0 -17
  81. package/dist/lib/esm2022/engine/types.mjs +0 -4
  82. package/dist/lib/esm2022/for-angular.module.mjs +0 -118
  83. package/dist/lib/esm2022/helpers/index.mjs +0 -13
  84. package/dist/lib/esm2022/helpers/utils.mjs +0 -415
  85. package/dist/lib/esm2022/interfaces.mjs +0 -2
  86. package/dist/lib/esm2022/public-apis.mjs +0 -14
  87. package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
  88. /package/dist/{lib/README.md → README.md} +0 -0
  89. /package/dist/{lib/assets → assets}/i18n/en.json +0 -0
  90. /package/dist/{lib/assets → assets}/images/angular-logo.svg +0 -0
  91. /package/dist/{lib/assets → assets}/images/decaf-logo-black.svg +0 -0
  92. /package/dist/{lib/assets → assets}/images/decaf-logo-lw.svg +0 -0
  93. /package/dist/{lib/assets → assets}/images/decaf-logo-white.svg +0 -0
  94. /package/dist/{lib/assets → assets}/images/decaf-logo.svg +0 -0
  95. /package/dist/{lib/components → components}/component-renderer/component-renderer.component.d.ts +0 -0
  96. /package/dist/{lib/components → components}/crud-field/crud-field.component.d.ts +0 -0
  97. /package/dist/{lib/components → components}/crud-form/constants.d.ts +0 -0
  98. /package/dist/{lib/components → components}/crud-form/crud-form.component.d.ts +0 -0
  99. /package/dist/{lib/components → components}/crud-form/types.d.ts +0 -0
  100. /package/dist/{lib/components → components}/for-angular-components.module.d.ts +0 -0
  101. /package/dist/{lib/components → components}/index.d.ts +0 -0
  102. /package/dist/{lib/components → components}/list/constants.d.ts +0 -0
  103. /package/dist/{lib/directives → directives}/collapsable.directive.d.ts +0 -0
  104. /package/dist/{lib/directives → directives}/index.d.ts +0 -0
  105. /package/dist/{lib/engine → engine}/DynamicModule.d.ts +0 -0
  106. /package/dist/{lib/engine → engine}/NgxCrudFormField.d.ts +0 -0
  107. /package/dist/{lib/engine → engine}/NgxFormService.d.ts +0 -0
  108. /package/dist/{lib/engine → engine}/NgxRenderingEngine.d.ts +0 -0
  109. /package/dist/{lib/engine → engine}/NgxRenderingEngine2.d.ts +0 -0
  110. /package/dist/{lib/engine → engine}/ValidatorFactory.d.ts +0 -0
  111. /package/dist/{lib/engine → engine}/constants.d.ts +0 -0
  112. /package/dist/{lib/engine → engine}/decorators.d.ts +0 -0
  113. /package/dist/{lib/engine → engine}/index.d.ts +0 -0
  114. /package/dist/{lib/engine → engine}/types.d.ts +0 -0
  115. /package/dist/{lib/for-angular.module.d.ts → for-angular.module.d.ts} +0 -0
  116. /package/dist/{lib/helpers → helpers}/index.d.ts +0 -0
  117. /package/dist/{lib/helpers → helpers}/utils.d.ts +0 -0
  118. /package/dist/{lib/index.d.ts → index.d.ts} +0 -0
  119. /package/dist/{lib/interfaces.d.ts → interfaces.d.ts} +0 -0
  120. /package/dist/{lib/public-apis.d.ts → public-apis.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/for-angular",
3
- "version": "0.0.9",
3
+ "version": "0.0.10",
4
4
  "scripts": {
5
5
  "ng": "ng",
6
6
  "decaf": "npx decaf angular generate",
@@ -37,7 +37,9 @@
37
37
  "storybook:build": "ng run for-angular:build-storybook",
38
38
  "playwright": "npx playwright test --config=./playwright.config.ts",
39
39
  "playwright-ui": "npx playwright test --config=./playwright.config.ts --ui",
40
- "playwright-setup": "npm init playwright@latest"
40
+ "playwright-setup": "npm init playwright@latest",
41
+ "link": "npm run unlink && npm run build:new && cd dist && npm link && npm ls -g --depth=0 --link=true",
42
+ "unlink": "npm rm --global @decaf-ts/for-angular && npm ls -g --depth=0 --link=true"
41
43
  },
42
44
  "files": [
43
45
  "dist"
@@ -1,301 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, Input, ViewChild, } from '@angular/core';
3
- import { FormControl } from '@angular/forms';
4
- import { OperationKeys } from '@decaf-ts/db-decorators';
5
- import { NgxCrudFormField } from '../../engine/NgxCrudFormField';
6
- import { Dynamic } from '../../engine/decorators';
7
- import { ForAngularModule } from 'src/lib/for-angular.module';
8
- import { IonCheckbox, IonIcon, IonInput, IonItem, IonLabel, IonRadio, IonRadioGroup, IonSelect, IonSelectOption, IonText, IonTextarea, } from '@ionic/angular/standalone';
9
- import { HTML5InputTypes } from '@decaf-ts/ui-decorators';
10
- import { addIcons } from 'ionicons';
11
- import { chevronDownOutline, chevronUpOutline } from 'ionicons/icons';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@ionic/angular/standalone";
14
- import * as i2 from "@angular/forms";
15
- import * as i3 from "@ngx-translate/core";
16
- /**
17
- * @description A dynamic form field component for CRUD operations.
18
- * @summary The CrudFieldComponent is a versatile form field component that adapts to different
19
- * input types and CRUD operations. It extends NgxCrudFormField to inherit form handling capabilities
20
- * and implements lifecycle hooks to properly initialize, render, and clean up. This component
21
- * supports various input types (text, number, date, select, etc.), validation rules, and styling
22
- * options, making it suitable for building dynamic forms for create, read, update, and delete
23
- * operations.
24
- *
25
- * @param {CrudOperations} operation - The CRUD operation being performed (create, read, update, delete)
26
- * @param {string} name - The field name, used as form control identifier
27
- * @param {PossibleInputTypes} type - The input type (text, number, date, select, etc.)
28
- * @param {string|number|Date} value - The initial value of the field
29
- * @param {boolean} disabled - Whether the field is disabled
30
- * @param {string} label - The display label for the field
31
- * @param {string} placeholder - Placeholder text when field is empty
32
- * @param {string} format - Format pattern for the field value
33
- * @param {boolean} hidden - Whether the field should be hidden
34
- * @param {number|Date} max - Maximum allowed value
35
- * @param {number} maxlength - Maximum allowed length
36
- * @param {number|Date} min - Minimum allowed value
37
- * @param {number} minlength - Minimum allowed length
38
- * @param {string} pattern - Validation pattern
39
- * @param {boolean} readonly - Whether the field is read-only
40
- * @param {boolean} required - Whether the field is required
41
- * @param {number} step - Step value for number inputs
42
- * @param {FormGroup} formGroup - The parent form group
43
- * @param {StringOrBoolean} translatable - Whether field labels should be translated
44
- *
45
- * @component CrudFieldComponent
46
- * @example
47
- * <ngx-decaf-crud-field
48
- * operation="create"
49
- * name="firstName"
50
- * type="text"
51
- * label="<NAME>"
52
- * placeholder="<NAME>"
53
- * [value]="model.firstName"
54
- * [disabled]="model.readOnly">
55
- *
56
- *
57
- * @memberOf module:for-angular
58
- */
59
- let CrudFieldComponent = class CrudFieldComponent extends NgxCrudFormField {
60
- constructor() {
61
- super(...arguments);
62
- /**
63
- * @description The parent field path, if this field is nested.
64
- * @summary Specifies the full dot-delimited path of the parent field. This is only set when the field is nested.
65
- *
66
- * @type {string}
67
- * @memberOf CrudFieldComponent
68
- */
69
- this.childOf = '';
70
- /**
71
- * @description The initial value of the field.
72
- * @summary Sets the initial value of the form field. This can be a string, number, or Date
73
- * depending on the field type. For select fields, this should match one of the option values.
74
- *
75
- * @type {string | number | Date}
76
- * @default ''
77
- * @memberOf CrudFieldComponent
78
- */
79
- this.value = '';
80
- /**
81
- * @description Interface style for select inputs.
82
- * @summary Specifies the interface style for select inputs, such as 'alert', 'action-sheet', or 'popover'.
83
- * This determines how the select options are presented to the user.
84
- *
85
- * @type {SelectInterface}
86
- * @memberOf CrudFieldComponent
87
- */
88
- this.interface = 'popover';
89
- /**
90
- * @description Spellcheck attribute for text inputs.
91
- * @summary Enables or disables spellchecking for text inputs.
92
- * When true, the browser will check the spelling of the input text.
93
- *
94
- * @type {boolean}
95
- * @default false
96
- * @memberOf CrudFieldComponent
97
- */
98
- this.spellcheck = false;
99
- /**
100
- * @description Input mode for text inputs.
101
- * @summary Hints at the type of data that might be entered by the user while editing the element.
102
- * This can affect the virtual keyboard layout on mobile devices.
103
- *
104
- * @type {'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'}
105
- * @default 'none'
106
- * @memberOf CrudFieldComponent
107
- */
108
- this.inputmode = 'none';
109
- /**
110
- * @description Autocomplete behavior for the field.
111
- * @summary Specifies whether and how the browser should automatically complete the input.
112
- * This can improve user experience by suggesting previously entered values.
113
- *
114
- * @type {AutocompleteTypes}
115
- * @default 'off'
116
- * @memberOf CrudFieldComponent
117
- */
118
- this.autocomplete = 'off';
119
- /**
120
- * @description Fill style for the field.
121
- * @summary Determines the fill style of the field, such as 'outline' or 'solid'.
122
- * This affects the border and background of the field.
123
- *
124
- * @type {'outline' | 'solid'}
125
- * @default 'outline'
126
- * @memberOf CrudFieldComponent
127
- */
128
- this.fill = 'outline';
129
- /**
130
- * @description Placement of the label relative to the field.
131
- * @summary Specifies where the label should be placed relative to the field.
132
- * Options include 'start', 'end', 'floating', 'stacked', and 'fixed'.
133
- *
134
- * @type {'start' | 'end' | 'floating' | 'stacked' | 'fixed'}
135
- * @default 'floating'
136
- * @memberOf CrudFieldComponent
137
- */
138
- this.labelPlacement = 'floating';
139
- /**
140
- * @description Update mode for the field.
141
- * @summary Determines when the field value should be updated in the form model.
142
- * Options include 'change', 'blur', and 'submit'.
143
- *
144
- * @type {FieldUpdateMode}
145
- * @default 'change'
146
- * @memberOf CrudFieldComponent
147
- */
148
- this.updateOn = 'change';
149
- /**
150
- * @description Translatability of field labels.
151
- * @summary Indicates whether the field labels should be translated based on the current language settings.
152
- * This is useful for applications supporting multiple languages.
153
- *
154
- * @type {StringOrBoolean}
155
- * @default true
156
- * @memberOf CrudFieldComponent
157
- */
158
- this.translatable = true;
159
- }
160
- // constructor() {
161
- // }
162
- ngOnInit() {
163
- // super.onInit(this.updateOn);
164
- if ([OperationKeys.READ, OperationKeys.DELETE].includes(this.operation)) {
165
- this.formGroup = undefined;
166
- }
167
- else {
168
- addIcons({ chevronDownOutline, chevronUpOutline });
169
- if (this.type === HTML5InputTypes.RADIO && !this.value)
170
- this.formGroup?.get(this.name)?.setValue(this.options[0].value); // TODO: migrate to RenderingEngine
171
- }
172
- }
173
- ngAfterViewInit() {
174
- if ([OperationKeys.READ, OperationKeys.DELETE].includes(this.operation))
175
- super.afterViewInit();
176
- }
177
- ngOnDestroy() {
178
- if ([OperationKeys.READ, OperationKeys.DELETE].includes(this.operation))
179
- this.onDestroy();
180
- }
181
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrudFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
182
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CrudFieldComponent, isStandalone: true, selector: "ngx-decaf-crud-field", inputs: { operation: "operation", name: "name", path: "path", childOf: "childOf", type: "type", value: "value", disabled: "disabled", label: "label", placeholder: "placeholder", format: "format", hidden: "hidden", max: "max", maxlength: "maxlength", min: "min", minlength: "minlength", pattern: "pattern", readonly: "readonly", required: "required", step: "step", equals: "equals", different: "different", lessThan: "lessThan", lessThanOrEqual: "lessThanOrEqual", greaterThan: "greaterThan", greaterThanOrEqual: "greaterThanOrEqual", cols: "cols", rows: "rows", alignment: "alignment", checked: "checked", justify: "justify", cancelText: "cancelText", interface: "interface", options: "options", mode: "mode", spellcheck: "spellcheck", inputmode: "inputmode", autocomplete: "autocomplete", fill: "fill", labelPlacement: "labelPlacement", updateOn: "updateOn", formGroup: "formGroup", formControl: "formControl", translatable: "translatable", uid: "uid" }, viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "@if(operation === 'read' || operation === 'delete') {\n <ng-container #component>\n <div [class]=\"'dcf-input-item ' + operation\">\n <ion-item>\n <ion-label>\n {{ label | translate }}<br />\n @if(value) {\n <ion-text [innerHTML]=\"type === 'password' ? '********' : value\"></ion-text>\n } @else {\n <br />\n }\n </ion-label>\n </ion-item>\n </div>\n </ng-container>\n} @else {\n <ng-container #component [formGroup]=\"formGroup\">\n <div #container [class]=\"'dcf-input-item ' + (operation || 'create')\">\n @if(type === 'textarea') {\n <ion-textarea\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [required]=\"required !== undefined ? required : null\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [inputmode]=\"inputmode\"\n [spellcheck]=\"spellcheck\"\n [rows]=\"rows\"\n [labelPlacement]=\"labelPlacement\"\n [value]=\"value\"\n [fill]=\"fill\"\n [errorText]=\"getErrors(container)\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [label]=\"translatable ? (label | translate) : label\"\n >\n </ion-textarea>\n }\n @else if(type === 'checkbox') {\n <ion-item>\n <ion-checkbox\n #checkboxElement\n [name]=\"path\"\n [mode]=\"mode\"\n [errorText]=\"getErrors(container)\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [justify]=\"justify\"\n [value]=\"value\"\n [checked]=\"checked\"\n [readonly]=\"readonly\"\n (ionChange)=\"checked = !checked\"\n [formControlName]=\"name\"\n >\n <span [innerHTML]=\"label | translate\"></span>\n </ion-checkbox>\n </ion-item>\n }\n @else if(type === 'radio') {\n <ion-radio-group [formControlName]=\"name\" [name]=\"path\" [value]=\"value\" #component>\n <label class=\"dcf-radio-group-label\" [for]=\"path\">{{label | translate}}</label>\n @for(option of options; track option) {\n <ion-item>\n <ion-radio\n [errorText]=\"getErrors(container)\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [alignment]=\"alignment\"\n [justify]=\"justify\"\n [readonly]=\"readonly\"\n [value]=\"option.value\"\n >{{ translatable ? (option?.text | translate) : option?.text }}</ion-radio>\n </ion-item>\n }\n </ion-radio-group>\n }\n @else if(type === 'select') {\n <ion-select\n toggleIcon=\"chevron-down-outline\"\n expandedIcon=\"chevron-up-outline\"\n [name]=\"path\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [label]=\"translatable ? (label | translate) : label\"\n [value]=\"value\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [interface]=\"interface\">\n @for(option of options; track option.value) {\n <ion-select-option [value]=\"option.value\">\n {{ translatable ? (option.text | translate) : options.text }}\n </ion-select-option>\n }\n </ion-select>\n }\n @else {\n <ion-input\n [name]=\"path\"\n [type]=\"type\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [inputmode]=\"inputmode\"\n [labelPlacement]=\"labelPlacement\"\n [required]=\"required !== undefined ? required : false\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [max]=\"max !== undefined ? max : null\"\n [min]=\"min !== undefined ? min : null\"\n [pattern]=\"pattern !== undefined ? pattern : null\"\n [step]=\"step !== undefined ? step : null\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [label]=\"translatable ? (label | translate) : label\">\n </ion-input>\n }\n </div>\n </ng-container>\n}\n\n", styles: [".dcf-input-item.create,.dcf-input-item.update{margin-bottom:1.8rem;margin-top:0!important}.dcf-input-item.create.checkbox+.checkbox,.dcf-input-item.update.checkbox+.checkbox{margin-top:-.25rem!important}.dcf-input-item.create ion-item,.dcf-input-item.update ion-item{--border-color: transparent}.dcf-input-item.create ion-item.dcf-text-wrap ion-label>*,.dcf-input-item.update ion-item.dcf-text-wrap ion-label>*{white-space:wrap!important;word-break:break-all!important}.dcf-input-item.read ion-label,.dcf-input-item.delete ion-label{font-weight:600;color:var(--ion-color-gray-7)}.dcf-input-item.read ion-text,.dcf-input-item.delete ion-text{display:block;margin-top:.5rem!important;color:var(--ion-color-gray-5)}.dcf-input-item ion-item{--padding-end: 0rem;--padding-start: 0px !important;--padding-top: 0px !important;--background: transparent;--background-hover-opacity: .1;--background-hover: var(--ion-color-primary);--background-activated-opacity: .15;--background-focused: var(--ion-color-primary);--background-focused-opacity: .15;--border-color: var(--ion-color-gray-2)}.dcf-input-item ion-item span,.dcf-input-item ion-item ion-text{font-weight:400!important;font-size:.925rem;min-height:.5rem!important}.dcf-input-item ion-item span:not(.dcf-display-block),.dcf-input-item ion-item ion-text:not(.dcf-display-block){display:inline-block}.dcf-input-item ion-item span.dcf-display-block,.dcf-input-item ion-item ion-text.dcf-display-block{display:block!important}ion-textarea textarea{scrollbar-width:thin!important;margin-bottom:.5rem!important}ion-select.dcf-select-label-placement-floating::part(label){line-height:1.2rem!important}.dcf-proccessing,.dcf-proccessing *{pointer-events:none;touch-action:none;cursor:text}ion-checkbox{--size: 1.5rem;--checkbox-background-checked: var(--ion-color-primary);--checkmark-width: 2px}ion-item{--inner-padding-start: .75rem}ion-checkbox::part(container){border-radius:50%;border:2px solid var(--ion-color-primary);padding:3px}ion-item .dcf-radio-group-label,ion-radio-group .dcf-radio-group-label{font-weight:600}ion-item .dcf-radio-group-label~ion-item,ion-radio-group .dcf-radio-group-label~ion-item{margin-top:.5rem;--inner-padding-start: .75rem}ion-item+.dcf-helper,ion-radio-group+.dcf-helper{padding-left:.75rem;position:relative}.dcf-error{position:absolute;color:var(--ion-color-danger)!important;font-size:.8rem!important;font-weight:600!important;line-height:1.1rem;box-sizing:border-box;z-index:9999;margin-top:0;animation-duration:.1s;animation-timing-function:ease-out;animation-fill-mode:both;animation-name:fadeTopSmallAnimation;display:flex;align-items:flex-start;gap:.25rem}.dcf-error .ti,.dcf-error ion-icon{position:relative;top:2px!important;min-width:20px;font-size:1rem!important;text-align:left}.dcf-helper{font-size:.875rem!important;font-weight:500;margin-top:.25rem;margin-bottom:-.75rem}.dcf-helper.dcf-has-action{cursor:pointer;color:var(--ion-color-gray-7)!important;text-decoration:underline}.dcf-error+.dcf-helper{padding-top:1rem}@keyframes fadeTopSmallAnimation{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeBottomSmallAnimation{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeTopMediumAnimation{0%{opacity:0;transform:translateY(-50px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "compareWith", "errorText", "helperText", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
183
- };
184
- CrudFieldComponent = __decorate([
185
- Dynamic()
186
- ], CrudFieldComponent);
187
- export { CrudFieldComponent };
188
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrudFieldComponent, decorators: [{
189
- type: Component,
190
- args: [{ standalone: true, imports: [
191
- ForAngularModule,
192
- IonInput,
193
- IonItem,
194
- IonCheckbox,
195
- IonRadioGroup,
196
- IonRadio,
197
- IonSelect,
198
- IonSelectOption,
199
- IonLabel,
200
- IonText,
201
- IonTextarea,
202
- IonIcon
203
- ], selector: 'ngx-decaf-crud-field', schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "@if(operation === 'read' || operation === 'delete') {\n <ng-container #component>\n <div [class]=\"'dcf-input-item ' + operation\">\n <ion-item>\n <ion-label>\n {{ label | translate }}<br />\n @if(value) {\n <ion-text [innerHTML]=\"type === 'password' ? '********' : value\"></ion-text>\n } @else {\n <br />\n }\n </ion-label>\n </ion-item>\n </div>\n </ng-container>\n} @else {\n <ng-container #component [formGroup]=\"formGroup\">\n <div #container [class]=\"'dcf-input-item ' + (operation || 'create')\">\n @if(type === 'textarea') {\n <ion-textarea\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [required]=\"required !== undefined ? required : null\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [inputmode]=\"inputmode\"\n [spellcheck]=\"spellcheck\"\n [rows]=\"rows\"\n [labelPlacement]=\"labelPlacement\"\n [value]=\"value\"\n [fill]=\"fill\"\n [errorText]=\"getErrors(container)\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [label]=\"translatable ? (label | translate) : label\"\n >\n </ion-textarea>\n }\n @else if(type === 'checkbox') {\n <ion-item>\n <ion-checkbox\n #checkboxElement\n [name]=\"path\"\n [mode]=\"mode\"\n [errorText]=\"getErrors(container)\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [justify]=\"justify\"\n [value]=\"value\"\n [checked]=\"checked\"\n [readonly]=\"readonly\"\n (ionChange)=\"checked = !checked\"\n [formControlName]=\"name\"\n >\n <span [innerHTML]=\"label | translate\"></span>\n </ion-checkbox>\n </ion-item>\n }\n @else if(type === 'radio') {\n <ion-radio-group [formControlName]=\"name\" [name]=\"path\" [value]=\"value\" #component>\n <label class=\"dcf-radio-group-label\" [for]=\"path\">{{label | translate}}</label>\n @for(option of options; track option) {\n <ion-item>\n <ion-radio\n [errorText]=\"getErrors(container)\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [alignment]=\"alignment\"\n [justify]=\"justify\"\n [readonly]=\"readonly\"\n [value]=\"option.value\"\n >{{ translatable ? (option?.text | translate) : option?.text }}</ion-radio>\n </ion-item>\n }\n </ion-radio-group>\n }\n @else if(type === 'select') {\n <ion-select\n toggleIcon=\"chevron-down-outline\"\n expandedIcon=\"chevron-up-outline\"\n [name]=\"path\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [label]=\"translatable ? (label | translate) : label\"\n [value]=\"value\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [interface]=\"interface\">\n @for(option of options; track option.value) {\n <ion-select-option [value]=\"option.value\">\n {{ translatable ? (option.text | translate) : options.text }}\n </ion-select-option>\n }\n </ion-select>\n }\n @else {\n <ion-input\n [name]=\"path\"\n [type]=\"type\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [inputmode]=\"inputmode\"\n [labelPlacement]=\"labelPlacement\"\n [required]=\"required !== undefined ? required : false\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [max]=\"max !== undefined ? max : null\"\n [min]=\"min !== undefined ? min : null\"\n [pattern]=\"pattern !== undefined ? pattern : null\"\n [step]=\"step !== undefined ? step : null\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [label]=\"translatable ? (label | translate) : label\">\n </ion-input>\n }\n </div>\n </ng-container>\n}\n\n", styles: [".dcf-input-item.create,.dcf-input-item.update{margin-bottom:1.8rem;margin-top:0!important}.dcf-input-item.create.checkbox+.checkbox,.dcf-input-item.update.checkbox+.checkbox{margin-top:-.25rem!important}.dcf-input-item.create ion-item,.dcf-input-item.update ion-item{--border-color: transparent}.dcf-input-item.create ion-item.dcf-text-wrap ion-label>*,.dcf-input-item.update ion-item.dcf-text-wrap ion-label>*{white-space:wrap!important;word-break:break-all!important}.dcf-input-item.read ion-label,.dcf-input-item.delete ion-label{font-weight:600;color:var(--ion-color-gray-7)}.dcf-input-item.read ion-text,.dcf-input-item.delete ion-text{display:block;margin-top:.5rem!important;color:var(--ion-color-gray-5)}.dcf-input-item ion-item{--padding-end: 0rem;--padding-start: 0px !important;--padding-top: 0px !important;--background: transparent;--background-hover-opacity: .1;--background-hover: var(--ion-color-primary);--background-activated-opacity: .15;--background-focused: var(--ion-color-primary);--background-focused-opacity: .15;--border-color: var(--ion-color-gray-2)}.dcf-input-item ion-item span,.dcf-input-item ion-item ion-text{font-weight:400!important;font-size:.925rem;min-height:.5rem!important}.dcf-input-item ion-item span:not(.dcf-display-block),.dcf-input-item ion-item ion-text:not(.dcf-display-block){display:inline-block}.dcf-input-item ion-item span.dcf-display-block,.dcf-input-item ion-item ion-text.dcf-display-block{display:block!important}ion-textarea textarea{scrollbar-width:thin!important;margin-bottom:.5rem!important}ion-select.dcf-select-label-placement-floating::part(label){line-height:1.2rem!important}.dcf-proccessing,.dcf-proccessing *{pointer-events:none;touch-action:none;cursor:text}ion-checkbox{--size: 1.5rem;--checkbox-background-checked: var(--ion-color-primary);--checkmark-width: 2px}ion-item{--inner-padding-start: .75rem}ion-checkbox::part(container){border-radius:50%;border:2px solid var(--ion-color-primary);padding:3px}ion-item .dcf-radio-group-label,ion-radio-group .dcf-radio-group-label{font-weight:600}ion-item .dcf-radio-group-label~ion-item,ion-radio-group .dcf-radio-group-label~ion-item{margin-top:.5rem;--inner-padding-start: .75rem}ion-item+.dcf-helper,ion-radio-group+.dcf-helper{padding-left:.75rem;position:relative}.dcf-error{position:absolute;color:var(--ion-color-danger)!important;font-size:.8rem!important;font-weight:600!important;line-height:1.1rem;box-sizing:border-box;z-index:9999;margin-top:0;animation-duration:.1s;animation-timing-function:ease-out;animation-fill-mode:both;animation-name:fadeTopSmallAnimation;display:flex;align-items:flex-start;gap:.25rem}.dcf-error .ti,.dcf-error ion-icon{position:relative;top:2px!important;min-width:20px;font-size:1rem!important;text-align:left}.dcf-helper{font-size:.875rem!important;font-weight:500;margin-top:.25rem;margin-bottom:-.75rem}.dcf-helper.dcf-has-action{cursor:pointer;color:var(--ion-color-gray-7)!important;text-decoration:underline}.dcf-error+.dcf-helper{padding-top:1rem}@keyframes fadeTopSmallAnimation{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeBottomSmallAnimation{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeTopMediumAnimation{0%{opacity:0;transform:translateY(-50px)}to{opacity:1;transform:translateY(0)}}\n"] }]
204
- }], propDecorators: { operation: [{
205
- type: Input,
206
- args: [{ required: true }]
207
- }], name: [{
208
- type: Input,
209
- args: [{ required: true }]
210
- }], path: [{
211
- type: Input,
212
- args: [{ required: true }]
213
- }], childOf: [{
214
- type: Input
215
- }], type: [{
216
- type: Input,
217
- args: [{ required: true }]
218
- }], value: [{
219
- type: Input
220
- }], disabled: [{
221
- type: Input
222
- }], label: [{
223
- type: Input,
224
- args: [{ required: true }]
225
- }], placeholder: [{
226
- type: Input
227
- }], format: [{
228
- type: Input
229
- }], hidden: [{
230
- type: Input
231
- }], max: [{
232
- type: Input
233
- }], maxlength: [{
234
- type: Input
235
- }], min: [{
236
- type: Input
237
- }], minlength: [{
238
- type: Input
239
- }], pattern: [{
240
- type: Input
241
- }], readonly: [{
242
- type: Input
243
- }], required: [{
244
- type: Input
245
- }], step: [{
246
- type: Input
247
- }], equals: [{
248
- type: Input
249
- }], different: [{
250
- type: Input
251
- }], lessThan: [{
252
- type: Input
253
- }], lessThanOrEqual: [{
254
- type: Input
255
- }], greaterThan: [{
256
- type: Input
257
- }], greaterThanOrEqual: [{
258
- type: Input
259
- }], cols: [{
260
- type: Input
261
- }], rows: [{
262
- type: Input
263
- }], alignment: [{
264
- type: Input
265
- }], checked: [{
266
- type: Input
267
- }], justify: [{
268
- type: Input
269
- }], cancelText: [{
270
- type: Input
271
- }], interface: [{
272
- type: Input
273
- }], options: [{
274
- type: Input
275
- }], mode: [{
276
- type: Input
277
- }], spellcheck: [{
278
- type: Input
279
- }], inputmode: [{
280
- type: Input
281
- }], autocomplete: [{
282
- type: Input
283
- }], fill: [{
284
- type: Input
285
- }], labelPlacement: [{
286
- type: Input
287
- }], updateOn: [{
288
- type: Input
289
- }], component: [{
290
- type: ViewChild,
291
- args: ['component', { read: ElementRef }]
292
- }], formGroup: [{
293
- type: Input
294
- }], formControl: [{
295
- type: Input
296
- }], translatable: [{
297
- type: Input
298
- }], uid: [{
299
- type: Input
300
- }] } });
301
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC1maWVsZC9jcnVkLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZpZWxkL2NydWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1Qsc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixLQUFLLEVBR0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsYUFBYSxFQUNiLFNBQVMsRUFDVCxlQUFlLEVBQ2YsT0FBTyxFQUNQLFdBQVcsR0FDWixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUV0RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHO0FBdUJJLElBQU0sa0JB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O3NCQURILEtBQUs7Z0JBYU4sY0FBYztzQkFEYixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFXRyxTQUFTO3NCQURqQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBWW5DLFNBQVM7c0JBRGpCLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFhTixZQUFZO3NCQURYLEtBQUs7Z0JBV04sR0FBRztzQkFERixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXV0b2NvbXBsZXRlVHlwZXMsIFNlbGVjdEludGVyZmFjZSB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IENydWRPcGVyYXRpb25zLCBPcGVyYXRpb25LZXlzIH0gZnJvbSAnQGRlY2FmLXRzL2RiLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgTmd4Q3J1ZEZvcm1GaWVsZCB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hDcnVkRm9ybUZpZWxkJztcbmltcG9ydCB7IER5bmFtaWMgfSBmcm9tICcuLi8uLi9lbmdpbmUvZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBGaWVsZFVwZGF0ZU1vZGUsIFBvc3NpYmxlSW5wdXRUeXBlcywgUmFkaW9PcHRpb24sIFNlbGVjdE9wdGlvbiwgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICdzcmMvbGliL2Zvci1hbmd1bGFyLm1vZHVsZSc7XG5pbXBvcnQge1xuICBJb25DaGVja2JveCxcbiAgSW9uSWNvbixcbiAgSW9uSW5wdXQsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxuICBJb25SYWRpbyxcbiAgSW9uUmFkaW9Hcm91cCxcbiAgSW9uU2VsZWN0LFxuICBJb25TZWxlY3RPcHRpb24sXG4gIElvblRleHQsXG4gIElvblRleHRhcmVhLFxufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IEhUTUw1SW5wdXRUeXBlcyB9IGZyb20gJ0BkZWNhZi10cy91aS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2hldnJvbkRvd25PdXRsaW5lLCBjaGV2cm9uVXBPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGR5bmFtaWMgZm9ybSBmaWVsZCBjb21wb25lbnQgZm9yIENSVUQgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBDcnVkRmllbGRDb21wb25lbnQgaXMgYSB2ZXJzYXRpbGUgZm9ybSBmaWVsZCBjb21wb25lbnQgdGhhdCBhZGFwdHMgdG8gZGlmZmVyZW50XG4gKiBpbnB1dCB0eXBlcyBhbmQgQ1JVRCBvcGVyYXRpb25zLiBJdCBleHRlbmRzIE5neENydWRGb3JtRmllbGQgdG8gaW5oZXJpdCBmb3JtIGhhbmRsaW5nIGNhcGFiaWxpdGllc1xuICogYW5kIGltcGxlbWVudHMgbGlmZWN5Y2xlIGhvb2tzIHRvIHByb3Blcmx5IGluaXRpYWxpemUsIHJlbmRlciwgYW5kIGNsZWFuIHVwLiBUaGlzIGNvbXBvbmVudFxuICogc3VwcG9ydHMgdmFyaW91cyBpbnB1dCB0eXBlcyAodGV4dCwgbnVtYmVyLCBkYXRlLCBzZWxlY3QsIGV0Yy4pLCB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgc3R5bGluZ1xuICogb3B0aW9ucywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBidWlsZGluZyBkeW5hbWljIGZvcm1zIGZvciBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZVxuICogb3BlcmF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcGVyYXRpb24gLSBUaGUgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmllbGQgbmFtZSwgdXNlZCBhcyBmb3JtIGNvbnRyb2wgaWRlbnRpZmllclxuICogQHBhcmFtIHtQb3NzaWJsZUlucHV0VHlwZXN9IHR5cGUgLSBUaGUgaW5wdXQgdHlwZSAodGV4dCwgbnVtYmVyLCBkYXRlLCBzZWxlY3QsIGV0Yy4pXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8RGF0ZX0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQgLSBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gVGhlIGRpc3BsYXkgbGFiZWwgZm9yIHRoZSBmaWVsZFxuICogQHBhcmFtIHtzdHJpbmd9IHBsYWNlaG9sZGVyIC0gUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGZpZWxkIGlzIGVtcHR5XG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gRm9ybWF0IHBhdHRlcm4gZm9yIHRoZSBmaWVsZCB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFufSBoaWRkZW4gLSBXaGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhsZW5ndGggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBtaW4gLSBNaW5pbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5sZW5ndGggLSBNaW5pbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAtIFZhbGlkYXRpb24gcGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSByZWFkb25seSAtIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlYWQtb25seVxuICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZCAtIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCAtIFN0ZXAgdmFsdWUgZm9yIG51bWJlciBpbnB1dHNcbiAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgcGFyZW50IGZvcm0gZ3JvdXBcbiAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFufSB0cmFuc2xhdGFibGUgLSBXaGV0aGVyIGZpZWxkIGxhYmVscyBzaG91bGQgYmUgdHJhbnNsYXRlZFxuICpcbiAqIEBjb21wb25lbnQgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1jcnVkLWZpZWxkXG4gKiAgIG9wZXJhdGlvbj1cImNyZWF0ZVwiXG4gKiAgIG5hbWU9XCJmaXJzdE5hbWVcIlxuICogICB0eXBlPVwidGV4dFwiXG4gKiAgIGxhYmVsPVwiPE5BTUU+XCJcbiAqICAgcGxhY2Vob2xkZXI9XCI8TkFNRT5cIlxuICogICBbdmFsdWVdPVwibW9kZWwuZmlyc3ROYW1lXCJcbiAqICAgW2Rpc2FibGVkXT1cIm1vZGVsLnJlYWRPbmx5XCI+XG4gKlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGb3JBbmd1bGFyTW9kdWxlLFxuICAgIElvbklucHV0LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uQ2hlY2tib3gsXG4gICAgSW9uUmFkaW9Hcm91cCxcbiAgICBJb25SYWRpbyxcbiAgICBJb25TZWxlY3QsXG4gICAgSW9uU2VsZWN0T3B0aW9uLFxuICAgIElvbkxhYmVsLFxuICAgIElvblRleHQsXG4gICAgSW9uVGV4dGFyZWEsXG4gICAgSW9uSWNvblxuICBdLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1jcnVkLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NydWQtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3J1ZC1maWVsZC5jb21wb25lbnQuc2NzcycsXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3J1ZEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgTmd4Q3J1ZEZvcm1GaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBDUlVEIG9wZXJhdGlvbiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgdGhlIGZpZWxkIGlzIGJlaW5nIHVzZWQgZm9yLlxuICAgKiBUaGlzIGFmZmVjdHMgaG93IHRoZSBmaWVsZCBiZWhhdmVzIGFuZCBpcyByZW5kZXJlZC4gRm9yIGV4YW1wbGUsIGZpZWxkcyBtaWdodCBiZSByZWFkLW9ubHkgaW5cbiAgICogJ3JlYWQnIG1vZGUgYnV0IGVkaXRhYmxlIGluICdjcmVhdGUnIG9yICd1cGRhdGUnIG1vZGVzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG92ZXJyaWRlIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSAgVGhlIGZsYXQgZmllbGQgbmFtZSB1c2VkIGFzIHRoZSBmb3JtIGNvbnRyb2wgaWRlbnRpZmllciBpbiBpbW1lZGlhdGUgcGFyZW50IEZvcm1Hcm91cC5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIEZvcm1Db250cm9sIGlkZW50aWZpZXIgaW4gaW1tZWRpYXRlIHBhcmVudCBGb3JtR3JvdXAuXG4gICAqIFRoaXMgdmFsdWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBpbW1lZGlhdGUgcGFyZW50IEZvcm1Hcm91cCBjb250ZXh0IGFuZCBzaG91bGQgbm90IGNvbnRhaW4gZG90cyBvciBuZXN0aW5nLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBvdmVycmlkZSBuYW1lITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFRoZSBmdWxsIGZpZWxkIHBhdGggdXNlZCBmb3IgZm9ybSBjb250cm9sIHJlc29sdXRpb24uXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGhpZXJhcmNoaWNhbCBwYXRoIG9mIHRoZSBmaWVsZCwgdXNlZCB0byByZXNvbHZlIGl0cyBsb2NhdGlvbiB3aXRoaW4gdGhlIHBhcmVudCBGb3JtR3JvdXAgKG9yIG5lc3RlZCBGb3JtR3JvdXBzKS5cbiAgICogSXQgaXMgdXNlZCBhcyB0aGUgaWRlbnRpZmllciBpbiB0aGUgcmVuZGVyZWQgSFRNTCwgYW5kIG1heSBpbmNsdWRlIG5lc3RpbmcgKGUuZy4sICdhZGRyZXNzLmJpbGxpbmcuc3RyZWV0JykgYW5kXG4gICAqIHNob3VsZCBtYXRjaCB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhIG1vZGVsXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG92ZXJyaWRlIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGZpZWxkIHBhdGgsIGlmIHRoaXMgZmllbGQgaXMgbmVzdGVkLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGZ1bGwgZG90LWRlbGltaXRlZCBwYXRoIG9mIHRoZSBwYXJlbnQgZmllbGQuIFRoaXMgaXMgb25seSBzZXQgd2hlbiB0aGUgZmllbGQgaXMgbmVzdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBjaGlsZE9mOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbnB1dCB0eXBlIG9mIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdHlwZSBvZiBpbnB1dCB0byByZW5kZXIsIHN1Y2ggYXMgdGV4dCwgbnVtYmVyLCBkYXRlLCBzZWxlY3QsIGV0Yy5cbiAgICogVGhpcyBkZXRlcm1pbmVzIHdoaWNoIElvbmljIGZvcm0gY29tcG9uZW50IHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIGZpZWxkIGFuZCBob3dcbiAgICogdGhlIGRhdGEgd2lsbCBiZSBmb3JtYXR0ZWQgYW5kIHZhbGlkYXRlZC5cbiAgICpcbiAgICogQHR5cGUge1Bvc3NpYmxlSW5wdXRUeXBlc31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgb3ZlcnJpZGUgdHlwZSE6IFBvc3NpYmxlSW5wdXRUeXBlcztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgU2V0cyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZm9ybSBmaWVsZC4gVGhpcyBjYW4gYmUgYSBzdHJpbmcsIG51bWJlciwgb3IgRGF0ZVxuICAgKiBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuIEZvciBzZWxlY3QgZmllbGRzLCB0aGlzIHNob3VsZCBtYXRjaCBvbmUgb2YgdGhlIG9wdGlvbiB2YWx1ZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXIgfCBEYXRlfVxuICAgKiBAZGVmYXVsdCAnJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgZmllbGQgaXMgZGlzYWJsZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIGZpZWxkIHdpbGwgYmUgcmVuZGVyZWQgaW4gYSBkaXNhYmxlZCBzdGF0ZSwgcHJldmVudGluZyB1c2VyIGludGVyYWN0aW9uLlxuICAgKiBEaXNhYmxlZCBmaWVsZHMgYXJlIHN0aWxsIGluY2x1ZGVkIGluIHRoZSBmb3JtIG1vZGVsIGJ1dCBjYW5ub3QgYmUgZWRpdGVkIGJ5IHRoZSB1c2VyLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgZGlzYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbGFiZWwgZm9yIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgVGhlIHRleHQgbGFiZWwgZGlzcGxheWVkIGFsb25nc2lkZSB0aGUgZmllbGQgdG8gaWRlbnRpZnkgaXQgdG8gdGhlIHVzZXIuXG4gICAqIFRoaXMgbGFiZWwgY2FuIGJlIHRyYW5zbGF0ZWQgaWYgdGhlIHRyYW5zbGF0YWJsZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgbGFiZWwhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQbGFjZWhvbGRlciB0ZXh0IHdoZW4gZmllbGQgaXMgZW1wdHkuXG4gICAqIEBzdW1tYXJ5IFRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBpbnB1dCB3aGVuIGl0IGhhcyBubyB2YWx1ZS4gVGhpcyBwcm92aWRlcyBhIGhpbnQgdG8gdGhlIHVzZXJcbiAgICogYWJvdXQgd2hhdCBraW5kIG9mIGRhdGEgaXMgZXhwZWN0ZWQuIFRoZSBwbGFjZWhvbGRlciBkaXNhcHBlYXJzIHdoZW4gdGhlIHVzZXIgc3RhcnRzIHR5cGluZy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXIhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtYXQgcGF0dGVybiBmb3IgdGhlIGZpZWxkIHZhbHVlLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYSBmb3JtYXQgcGF0dGVybiBmb3IgdGhlIGZpZWxkIHZhbHVlLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGF0ZSBmb3JtYXR0aW5nLFxuICAgKiBudW1iZXIgZm9ybWF0dGluZywgb3Igb3RoZXIgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nIHJlcXVpcmVtZW50cy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgZm9ybWF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiB0aGUgVUkgYnV0IHdpbGwgc3RpbGwgYmUgcGFydCBvZiB0aGUgZm9ybSBtb2RlbC5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gZm9ybSBzdWJtaXNzaW9uIGJ1dCBzaG91bGQgbm90IGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGhpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNYXhpbXVtIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgRm9yIG51bWJlciBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWVyaWMgdmFsdWUuXG4gICAqIEZvciBkYXRlIGlucHV0cywgdGhpcyBzZXRzIHRoZSBsYXRlc3QgYWxsb3dlZCBkYXRlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyIHwgRGF0ZX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbWF4PzogbnVtYmVyIHwgRGF0ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1heGltdW0gYWxsb3dlZCBsZW5ndGggZm9yIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEZvciB0ZXh0IGlucHV0cywgdGhpcyBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbiBhbmQgbWF5IGFsc28gYmUgdXNlZCB0byBsaW1pdCBpbnB1dCBpbiB0aGUgVUkuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIG1heGxlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1pbmltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBGb3IgbnVtYmVyIGlucHV0cywgdGhpcyBzZXRzIHRoZSBtaW5pbXVtIGFsbG93ZWQgbnVtZXJpYyB2YWx1ZS5cbiAgICogRm9yIGRhdGUgaW5wdXRzLCB0aGlzIHNldHMgdGhlIGVhcmxpZXN0IGFsbG93ZWQgZGF0ZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlciB8IERhdGV9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIG1pbj86IG51bWJlciB8IERhdGU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIGZvciB0ZXh0IGlucHV0LlxuICAgKiBAc3VtbWFyeSBGb3IgdGV4dCBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZC5cbiAgICogVGhpcyBpcyB1c2VkIGZvciB2YWxpZGF0aW9uIHRvIGVuc3VyZSB0aGUgaW5wdXQgbWVldHMgYSBtaW5pbXVtIGxlbmd0aCByZXF1aXJlbWVudC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbWlubGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGlvbiBwYXR0ZXJuIGZvciB0ZXh0IGlucHV0LlxuICAgKiBAc3VtbWFyeSBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHVzZWQgdG8gdmFsaWRhdGUgdGV4dCBpbnB1dC5cbiAgICogVGhlIGlucHV0IHZhbHVlIG11c3QgbWF0Y2ggdGhpcyBwYXR0ZXJuIHRvIGJlIGNvbnNpZGVyZWQgdmFsaWQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZWFkLW9ubHkuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIGZpZWxkIHdpbGwgYmUgcmVuZGVyZWQgaW4gYSByZWFkLW9ubHkgc3RhdGUuIFVubGlrZSBkaXNhYmxlZCBmaWVsZHMsXG4gICAqIHJlYWQtb25seSBmaWVsZHMgYXJlIHN0aWxsIGZvY3VzYWJsZSBidXQgY2Fubm90IGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2VyLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgcmVhZG9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdWlyZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIGZpZWxkIG11c3QgaGF2ZSBhIHZhbHVlIGZvciB0aGUgZm9ybSB0byBiZSB2YWxpZC5cbiAgICogUmVxdWlyZWQgZmllbGRzIGFyZSB0eXBpY2FsbHkgbWFya2VkIHdpdGggYW4gaW5kaWNhdG9yIGluIHRoZSBVSS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHJlcXVpcmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0ZXAgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEZvciBudW1iZXIgaW5wdXRzLCB0aGlzIHNldHMgdGhlIGluY3JlbWVudC9kZWNyZW1lbnQgc3RlcCB3aGVuIHVzaW5nXG4gICAqIHRoZSB1cC9kb3duIGFycm93cyBvciB3aGVuIHVzaW5nIGEgcmFuZ2Ugc2xpZGVyLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBzdGVwPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgZXF1YWxzIGNvbXBhcmlzb24uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGVxdWFscz86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpZWxkIG5hbWUgZm9yIGRpZmZlcmVudCBjb21wYXJpc29uLlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBkaWZmZXJlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBsZXNzIHRoYW4gY29tcGFyaXNvbi5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbGVzc1RoYW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvbi5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbGVzc1RoYW5PckVxdWFsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb24uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGdyZWF0ZXJUaGFuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGdyZWF0ZXJUaGFuT3JFcXVhbD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE51bWJlciBvZiBjb2x1bW5zIGZvciB0ZXh0YXJlYSBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEZvciB0ZXh0YXJlYSBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgdmlzaWJsZSB3aWR0aCBvZiB0aGUgdGV4dCBhcmVhIGluIGF2ZXJhZ2UgY2hhcmFjdGVyIHdpZHRocy5cbiAgICogVGhpcyBpcyB1c2VkIGFsb25nc2lkZSByb3dzIHRvIGRlZmluZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdGV4dGFyZWEuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGNvbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOdW1iZXIgb2Ygcm93cyBmb3IgdGV4dGFyZWEgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBGb3IgdGV4dGFyZWEgaW5wdXRzLCB0aGlzIHNldHMgdGhlIHZpc2libGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IGFyZWEgaW4gbGluZXMgb2YgdGV4dC5cbiAgICogVGhpcyBpcyB1c2VkIGFsb25nc2lkZSBjb2xzIHRvIGRlZmluZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdGV4dGFyZWEuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHJvd3M/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbGlnbm1lbnQgb2YgdGhlIGZpZWxkIGNvbnRlbnQuXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIHRoZSBob3Jpem9udGFsIGFsaWdubWVudCBvZiB0aGUgZmllbGQgY29udGVudC5cbiAgICogVGhpcyBhZmZlY3RzIGhvdyB0aGUgY29udGVudCBpcyBwb3NpdGlvbmVkIHdpdGhpbiB0aGUgZmllbGQgY29udGFpbmVyLlxuICAgKlxuICAgKiBAdHlwZSB7J3N0YXJ0JyB8ICdjZW50ZXInfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBhbGlnbm1lbnQ/OiAnc3RhcnQnIHwgJ2NlbnRlcic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsIGNoZWNrZWQgc3RhdGUgZm9yIGNoZWNrYm94IG9yIHRvZ2dsZSBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEZvciBjaGVja2JveCBvciB0b2dnbGUgaW5wdXRzLCB0aGlzIHNldHMgdGhlIGluaXRpYWwgY2hlY2tlZCBzdGF0ZS5cbiAgICogV2hlbiB0cnVlLCB0aGUgY2hlY2tib3ggb3IgdG9nZ2xlIHdpbGwgYmUgaW5pdGlhbGx5IGNoZWNrZWQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjaGVja2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEp1c3RpZmljYXRpb24gb2YgaXRlbXMgd2l0aGluIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgaG93IGl0ZW1zIGFyZSBqdXN0aWZpZWQgd2l0aGluIHRoZSBmaWVsZCBjb250YWluZXIuXG4gICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZmllbGRzIHdpdGggbXVsdGlwbGUgZWxlbWVudHMsIHN1Y2ggYXMgcmFkaW8gZ3JvdXBzLlxuICAgKlxuICAgKiBAdHlwZSB7J3N0YXJ0JyB8ICdlbmQnIHwgJ3NwYWNlLWJldHdlZW4nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBqdXN0aWZ5PzogJ3N0YXJ0JyB8ICdlbmQnIHwgJ3NwYWNlLWJldHdlZW4nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b24gaW4gc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgRm9yIHNlbGVjdCBpbnB1dHMgd2l0aCBhIGNhbmNlbCBidXR0b24sIHRoaXMgc2V0cyB0aGUgdGV4dCBkaXNwbGF5ZWQgb24gdGhlIGNhbmNlbCBidXR0b24uXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gc2VsZWN0IGRpYWxvZ3MgdG8gcHJvdmlkZSBhIHdheSBmb3IgdXNlcnMgdG8gZGlzbWlzcyB0aGUgc2VsZWN0aW9uIHdpdGhvdXQgbWFraW5nIGEgY2hhbmdlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjYW5jZWxUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGludGVyZmFjZSBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cywgc3VjaCBhcyAnYWxlcnQnLCAnYWN0aW9uLXNoZWV0Jywgb3IgJ3BvcG92ZXInLlxuICAgKiBUaGlzIGRldGVybWluZXMgaG93IHRoZSBzZWxlY3Qgb3B0aW9ucyBhcmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAdHlwZSB7U2VsZWN0SW50ZXJmYWNlfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpbnRlcmZhY2U6IFNlbGVjdEludGVyZmFjZSA9ICdwb3BvdmVyJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHNlbGVjdCBvciByYWRpbyBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBsaXN0IG9mIG9wdGlvbnMgZm9yIHNlbGVjdCBvciByYWRpbyBpbnB1dHMuIEVhY2ggb3B0aW9uIGNhbiBoYXZlIGEgdmFsdWUgYW5kIGEgbGFiZWwuXG4gICAqIFRoaXMgaXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgZHJvcGRvd24gb3IgcmFkaW8gZ3JvdXAgd2l0aCBjaG9pY2VzLlxuICAgKlxuICAgKiBAdHlwZSB7U2VsZWN0T3B0aW9uW10gfCBSYWRpb09wdGlvbltdfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcHRpb25zITogU2VsZWN0T3B0aW9uW10gfCBSYWRpb09wdGlvbltdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTW9kZSBvZiB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdmlzdWFsIG1vZGUgb2YgdGhlIGZpZWxkLCBzdWNoIGFzICdpb3MnIG9yICdtZCcuXG4gICAqIFRoaXMgYWZmZWN0cyB0aGUgc3R5bGluZyBhbmQgYXBwZWFyYW5jZSBvZiB0aGUgZmllbGQgdG8gbWF0Y2ggdGhlIHBsYXRmb3JtIHN0eWxlLlxuICAgKlxuICAgKiBAdHlwZSB7J2lvcycgfCAnbWQnfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtb2RlPzogJ2lvcycgfCAnbWQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3BlbGxjaGVjayBhdHRyaWJ1dGUgZm9yIHRleHQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBFbmFibGVzIG9yIGRpc2FibGVzIHNwZWxsY2hlY2tpbmcgZm9yIHRleHQgaW5wdXRzLlxuICAgKiBXaGVuIHRydWUsIHRoZSBicm93c2VyIHdpbGwgY2hlY2sgdGhlIHNwZWxsaW5nIG9mIHRoZSBpbnB1dCB0ZXh0LlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3BlbGxjaGVjazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5wdXQgbW9kZSBmb3IgdGV4dCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEhpbnRzIGF0IHRoZSB0eXBlIG9mIGRhdGEgdGhhdCBtaWdodCBiZSBlbnRlcmVkIGJ5IHRoZSB1c2VyIHdoaWxlIGVkaXRpbmcgdGhlIGVsZW1lbnQuXG4gICAqIFRoaXMgY2FuIGFmZmVjdCB0aGUgdmlydHVhbCBrZXlib2FyZCBsYXlvdXQgb24gbW9iaWxlIGRldmljZXMuXG4gICAqXG4gICAqIEB0eXBlIHsnbm9uZScgfCAndGV4dCcgfCAndGVsJyB8ICd1cmwnIHwgJ2VtYWlsJyB8ICdudW1lcmljJyB8ICdkZWNpbWFsJyB8ICdzZWFyY2gnfVxuICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW5wdXRtb2RlOlxuICAgIHwgJ25vbmUnXG4gICAgfCAndGV4dCdcbiAgICB8ICd0ZWwnXG4gICAgfCAndXJsJ1xuICAgIHwgJ2VtYWlsJ1xuICAgIHwgJ251bWVyaWMnXG4gICAgfCAnZGVjaW1hbCdcbiAgICB8ICdzZWFyY2gnID0gJ25vbmUnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXV0b2NvbXBsZXRlIGJlaGF2aW9yIGZvciB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGV0aGVyIGFuZCBob3cgdGhlIGJyb3dzZXIgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY29tcGxldGUgdGhlIGlucHV0LlxuICAgKiBUaGlzIGNhbiBpbXByb3ZlIHVzZXIgZXhwZXJpZW5jZSBieSBzdWdnZXN0aW5nIHByZXZpb3VzbHkgZW50ZXJlZCB2YWx1ZXMuXG4gICAqXG4gICAqIEB0eXBlIHtBdXRvY29tcGxldGVUeXBlc31cbiAgICogQGRlZmF1bHQgJ29mZidcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYXV0b2NvbXBsZXRlOiBBdXRvY29tcGxldGVUeXBlcyA9ICdvZmYnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmlsbCBzdHlsZSBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBmaWxsIHN0eWxlIG9mIHRoZSBmaWVsZCwgc3VjaCBhcyAnb3V0bGluZScgb3IgJ3NvbGlkJy5cbiAgICogVGhpcyBhZmZlY3RzIHRoZSBib3JkZXIgYW5kIGJhY2tncm91bmQgb2YgdGhlIGZpZWxkLlxuICAgKlxuICAgKiBAdHlwZSB7J291dGxpbmUnIHwgJ3NvbGlkJ31cbiAgICogQGRlZmF1bHQgJ291dGxpbmUnXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZpbGw6ICdvdXRsaW5lJyB8ICdzb2xpZCcgPSAnb3V0bGluZSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQbGFjZW1lbnQgb2YgdGhlIGxhYmVsIHJlbGF0aXZlIHRvIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRoZSBsYWJlbCBzaG91bGQgYmUgcGxhY2VkIHJlbGF0aXZlIHRvIHRoZSBmaWVsZC5cbiAgICogT3B0aW9ucyBpbmNsdWRlICdzdGFydCcsICdlbmQnLCAnZmxvYXRpbmcnLCAnc3RhY2tlZCcsIGFuZCAnZml4ZWQnLlxuICAgKlxuICAgKiBAdHlwZSB7J3N0YXJ0JyB8ICdlbmQnIHwgJ2Zsb2F0aW5nJyB8ICdzdGFja2VkJyB8ICdmaXhlZCd9XG4gICAqIEBkZWZhdWx0ICdmbG9hdGluZydcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGFiZWxQbGFjZW1lbnQ6ICdzdGFydCcgfCAnZW5kJyB8ICdmbG9hdGluZycgfCAnc3RhY2tlZCcgfCAnZml4ZWQnID1cbiAgICAnZmxvYXRpbmcnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIG1vZGUgZm9yIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB3aGVuIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgYmUgdXBkYXRlZCBpbiB0aGUgZm9ybSBtb2RlbC5cbiAgICogT3B0aW9ucyBpbmNsdWRlICdjaGFuZ2UnLCAnYmx1cicsIGFuZCAnc3VibWl0Jy5cbiAgICpcbiAgICogQHR5cGUge0ZpZWxkVXBkYXRlTW9kZX1cbiAgICogQGRlZmF1bHQgJ2NoYW5nZSdcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdXBkYXRlT246IEZpZWxkVXBkYXRlTW9kZSA9ICdjaGFuZ2UnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWVsZCBjb21wb25lbnQgZWxlbWVudCwgYWxsb3dpbmcgZGlyZWN0IGFjY2VzcyB0byBpdHMgcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbiAgICpcbiAgICogQHR5cGUge0VsZW1lbnRSZWZ9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBvdmVycmlkZSBjb21wb25lbnQhOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyZW50IGZvcm0gZ3JvdXAuXG4gICAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIHBhcmVudCBmb3JtIGdyb3VwIHRvIHdoaWNoIHRoaXMgZmllbGQgYmVsb25ncy5cbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGludGVncmF0aW5nIHRoZSBmaWVsZCB3aXRoIEFuZ3VsYXIncyByZWFjdGl2ZSBmb3Jtcy5cbiAgICpcbiAgICogQHR5cGUge0Zvcm1Hcm91cH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgZm9ybUdyb3VwOiBGb3JtR3JvdXAgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgZm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0YWJpbGl0eSBvZiBmaWVsZCBsYWJlbHMuXG4gICAqIEBzdW1tYXJ5IEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBsYWJlbHMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbGFuZ3VhZ2Ugc2V0dGluZ3MuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgc3VwcG9ydGluZyBtdWx0aXBsZSBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZC5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkIGJlaW5nIGRpc3BsYXllZCBvciBtYW5pcHVsYXRlZC5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmltYXJ5IGtleSBmb3Igb3BlcmF0aW9ucyBvbiBzcGVjaWZpYyByZWNvcmRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfVxuICAgKi9cbiAgQElucHV0KClcbiAgdWlkITogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIGNvbnN0cnVjdG9yKCkge1xuXG4gIC8vIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBzdXBlci5vbkluaXQodGhpcy51cGRhdGVPbik7XG4gICAgaWYgKFtPcGVyYXRpb25LZXlzLlJFQUQsIE9wZXJhdGlvbktleXMuREVMRVRFXS5pbmNsdWRlcyh0aGlzLm9wZXJhdGlvbikpIHtcblxuICAgICAgdGhpcy5mb3JtR3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgIGFkZEljb25zKHtjaGV2cm9uRG93bk91dGxpbmUsIGNoZXZyb25VcE91dGxpbmV9KVxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gSFRNTDVJbnB1dFR5cGVzLlJBRElPICYmICF0aGlzLnZhbHVlKVxuICAgICAgICB0aGlzLmZvcm1Hcm91cD8uZ2V0KHRoaXMubmFtZSk/LnNldFZhbHVlKHRoaXMub3B0aW9uc1swXS52YWx1ZSk7IC8vIFRPRE86IG1pZ3JhdGUgdG8gUmVuZGVyaW5nRW5naW5lXG4gICAgfVxuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKFtPcGVyYXRpb25LZXlzLlJFQUQsIE9wZXJhdGlvbktleXMuREVMRVRFXS5pbmNsdWRlcyh0aGlzLm9wZXJhdGlvbikpXG4gICAgICBzdXBlci5hZnRlclZpZXdJbml0KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSlcbiAgICAgIHRoaXMub25EZXN0cm95KCk7XG4gIH1cbn1cbiIsIkBpZihvcGVyYXRpb24gPT09ICdyZWFkJyB8fCBvcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gIDxuZy1jb250YWluZXIgI2NvbXBvbmVudD5cbiAgICA8ZGl2IFtjbGFzc109XCInZGNmLWlucHV0LWl0ZW0gJyArIG9wZXJhdGlvblwiPlxuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIHt7IGxhYmVsIHwgdHJhbnNsYXRlIH19PGJyIC8+XG4gICAgICAgICAgQGlmKHZhbHVlKSB7XG4gICAgICAgICAgICA8aW9uLXRleHQgIFtpbm5lckhUTUxdPVwidHlwZSA9PT0gJ3Bhc3N3b3JkJyA/ICcqKioqKioqKicgOiB2YWx1ZVwiPjwvaW9uLXRleHQ+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG59IEBlbHNlIHtcbiAgPG5nLWNvbnRhaW5lciAjY29tcG9uZW50IFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XG4gICAgPGRpdiAjY29udGFpbmVyIFtjbGFzc109XCInZGNmLWlucHV0LWl0ZW0gJyArIChvcGVyYXRpb24gfHwgJ2NyZWF0ZScpXCI+XG4gICAgICAgIEBpZih0eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgPGlvbi10ZXh0YXJlYVxuICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlblwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWQgIT09IHVuZGVmaW5lZCA/IHJlcXVpcmVkIDogbnVsbFwiXG4gICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1pbmxlbmd0aCAhPT0gdW5kZWZpbmVkID8gbWlubGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heGxlbmd0aCAhPT0gdW5kZWZpbmVkID8gbWF4bGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgIT09IHVuZGVmaW5lZCA/IHJlYWRvbmx5IDogbnVsbFwiXG4gICAgICAgICAgICBbaW5wdXRtb2RlXT1cImlucHV0bW9kZVwiXG4gICAgICAgICAgICBbc3BlbGxjaGVja109XCJzcGVsbGNoZWNrXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50XT1cImxhYmVsUGxhY2VtZW50XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgICAgIFtlcnJvclRleHRdPVwiZ2V0RXJyb3JzKGNvbnRhaW5lcilcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0YWJsZSA/IChwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInRyYW5zbGF0YWJsZSA/IChsYWJlbCB8IHRyYW5zbGF0ZSkgOiBsYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvaW9uLXRleHRhcmVhPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIGlmKHR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWNoZWNrYm94XG4gICAgICAgICAgICAgICNjaGVja2JveEVsZW1lbnRcbiAgICAgICAgICAgICAgW25hbWVdPVwicGF0aFwiXG4gICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgICBbZXJyb3JUZXh0XT1cImdldEVycm9ycyhjb250YWluZXIpXCJcbiAgICAgICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW5cIlxuICAgICAgICAgICAgICBbbGFiZWxQbGFjZW1lbnRdPVwibGFiZWxQbGFjZW1lbnRcIlxuICAgICAgICAgICAgICBbanVzdGlmeV09XCJqdXN0aWZ5XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgIChpb25DaGFuZ2UpPVwiY2hlY2tlZCA9ICFjaGVja2VkXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbCB8IHRyYW5zbGF0ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvaW9uLWNoZWNrYm94PlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIDxpb24tcmFkaW8tZ3JvdXAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCIgW25hbWVdPVwicGF0aFwiIFt2YWx1ZV09XCJ2YWx1ZVwiICNjb21wb25lbnQ+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJkY2YtcmFkaW8tZ3JvdXAtbGFiZWxcIiBbZm9yXT1cInBhdGhcIj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgQGZvcihvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2sgb3B0aW9uKSB7XG4gICAgICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgICAgICA8aW9uLXJhZGlvXG4gICAgICAgICAgICAgICAgICBbZXJyb3JUZXh0XT1cImdldEVycm9ycyhjb250YWluZXIpXCJcbiAgICAgICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50XT1cImxhYmVsUGxhY2VtZW50XCJcbiAgICAgICAgICAgICAgICAgIFthbGlnbm1lbnRdPVwiYWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICAgIFtqdXN0aWZ5XT1cImp1c3RpZnlcIlxuICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgICAgICAgICAgID57eyB0cmFuc2xhdGFibGUgPyAgKG9wdGlvbj8udGV4dCB8IHRyYW5zbGF0ZSkgOiBvcHRpb24/LnRleHQgfX08L2lvbi1yYWRpbz5cbiAgICAgICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2lvbi1yYWRpby1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSBpZih0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgPGlvbi1zZWxlY3RcbiAgICAgICAgICAgICAgdG9nZ2xlSWNvbj1cImNoZXZyb24tZG93bi1vdXRsaW5lXCJcbiAgICAgICAgICAgICAgZXhwYW5kZWRJY29uPVwiY2hldnJvbi11cC1vdXRsaW5lXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwicGF0aFwiXG4gICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlblwiXG4gICAgICAgICAgICAgIFtsYWJlbFBsYWNlbWVudF09XCJsYWJlbFBsYWNlbWVudFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJ0cmFuc2xhdGFibGUgPyAobGFiZWwgfCB0cmFuc2xhdGUpIDogbGFiZWxcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0YWJsZSA/IChwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgIFtlcnJvclRleHRdPVwiZ2V0RXJyb3JzKGNvbnRhaW5lcilcIlxuICAgICAgICAgICAgICBbaW50ZXJmYWNlXT1cImludGVyZmFjZVwiPlxuICAgICAgICAgICAgICBAZm9yKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRhYmxlID8gKG9wdGlvbi50ZXh0IHwgdHJhbnNsYXRlKSA6IG9wdGlvbnMudGV4dCB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAgICAgW25hbWVdPVwicGF0aFwiXG4gICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW5cIlxuICAgICAgICAgICAgW2lucHV0bW9kZV09XCJpbnB1dG1vZGVcIlxuICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50XT1cImxhYmVsUGxhY2VtZW50XCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZCAhPT0gdW5kZWZpbmVkID8gcmVxdWlyZWQgOiBmYWxzZVwiXG4gICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1pbmxlbmd0aCAhPT0gdW5kZWZpbmVkID8gbWlubGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heGxlbmd0aCAhPT0gdW5kZWZpbmVkID8gbWF4bGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgIT09IHVuZGVmaW5lZCA/IHJlYWRvbmx5IDogbnVsbFwiXG4gICAgICAgICAgICBbbWF4XT1cIm1heCAhPT0gdW5kZWZpbmVkID8gbWF4IDogbnVsbFwiXG4gICAgICAgICAgICBbbWluXT1cIm1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogbnVsbFwiXG4gICAgICAgICAgICBbcGF0dGVybl09XCJwYXR0ZXJuICE9PSB1bmRlZmluZWQgPyBwYXR0ZXJuIDogbnVsbFwiXG4gICAgICAgICAgICBbc3RlcF09XCJzdGVwICE9PSB1bmRlZmluZWQgPyBzdGVwIDogbnVsbFwiXG4gICAgICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGFibGUgPyAocGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUpIDogcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgIFtlcnJvclRleHRdPVwiZ2V0RXJyb3JzKGNvbnRhaW5lcilcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInRyYW5zbGF0YWJsZSA/IChsYWJlbCB8IHRyYW5zbGF0ZSkgOiBsYWJlbFwiPlxuICAgICAgICAgIDwvaW9uLWlucHV0PlxuICAgICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxufVxuXG4iXX0=
@@ -1,14 +0,0 @@
1
- export const CssClasses = {
2
- BUTTONS_CONTAINER: 'buttons-container',
3
- };
4
- export const DefaultFormReactiveOptions = {
5
- buttons: {
6
- submit: {
7
- text: 'Submit',
8
- },
9
- clear: {
10
- text: 'Clear',
11
- },
12
- },
13
- };
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NydWQtZm9ybS9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLGlCQUFpQixFQUFFLG1CQUFtQjtDQUN2QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQW9CO0lBQ3pELE9BQU8sRUFBRTtRQUNQLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSxRQUFRO1NBQ2Y7UUFDRCxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsT0FBTztTQUNkO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3J1ZEZvcm1PcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBDc3NDbGFzc2VzID0ge1xuICBCVVRUT05TX0NPTlRBSU5FUjogJ2J1dHRvbnMtY29udGFpbmVyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9uczogQ3J1ZEZvcm1PcHRpb25zID0ge1xuICBidXR0b25zOiB7XG4gICAgc3VibWl0OiB7XG4gICAgICB0ZXh0OiAnU3VibWl0JyxcbiAgICB9LFxuICAgIGNsZWFyOiB7XG4gICAgICB0ZXh0OiAnQ2xlYXInLFxuICAgIH0sXG4gIH0sXG59O1xuIl19