@bnsights/bbsf-controls 1.0.194-beta.10 → 1.0.194-beta.19-2

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 (155) hide show
  1. package/README.md +7 -0
  2. package/fesm2022/bnsights-bbsf-controls.mjs +224 -212
  3. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
  4. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +0 -1
  5. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +0 -1
  6. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +1 -1
  7. package/lib/modules/bbsf-editors.module.d.ts +6 -7
  8. package/package.json +33 -36
  9. package/src/lib/assets/Style.scss +4 -4
  10. package/src/lib/assets/ace-builds/ace.js +1 -1
  11. package/src/lib/assets/ace-builds/mode-markdown.js +1 -1
  12. package/esm2022/bnsights-bbsf-controls.mjs +0 -5
  13. package/esm2022/lib/Shared/Components/app-base-component.mjs +0 -226
  14. package/esm2022/lib/Shared/Components/ng-tag-input.mjs +0 -336
  15. package/esm2022/lib/Shared/Directives/appPreventDoubleClick.directive.mjs +0 -39
  16. package/esm2022/lib/Shared/Directives/template-name.directive.mjs +0 -19
  17. package/esm2022/lib/Shared/Enums/CalendarView.mjs +0 -8
  18. package/esm2022/lib/Shared/Enums/ControlLayout.mjs +0 -6
  19. package/esm2022/lib/Shared/Enums/Countries.mjs +0 -247
  20. package/esm2022/lib/Shared/Enums/Enums.mjs +0 -36
  21. package/esm2022/lib/Shared/Enums/FileType.mjs +0 -29
  22. package/esm2022/lib/Shared/Enums/FilterType.mjs +0 -11
  23. package/esm2022/lib/Shared/Enums/FontSize.mjs +0 -7
  24. package/esm2022/lib/Shared/Enums/ForceDirection.mjs +0 -6
  25. package/esm2022/lib/Shared/Enums/IconPosition.mjs +0 -6
  26. package/esm2022/lib/Shared/Enums/ImageType.mjs +0 -10
  27. package/esm2022/lib/Shared/Enums/InputType.mjs +0 -10
  28. package/esm2022/lib/Shared/Enums/Insert.mjs +0 -9
  29. package/esm2022/lib/Shared/Enums/LanguageMode.mjs +0 -11
  30. package/esm2022/lib/Shared/Enums/LanguageValidation.mjs +0 -6
  31. package/esm2022/lib/Shared/Enums/Markdown.mjs +0 -20
  32. package/esm2022/lib/Shared/Enums/Misc.mjs +0 -7
  33. package/esm2022/lib/Shared/Enums/PagingActionMode.mjs +0 -6
  34. package/esm2022/lib/Shared/Enums/Para.mjs +0 -9
  35. package/esm2022/lib/Shared/Enums/PickerType.mjs +0 -7
  36. package/esm2022/lib/Shared/Enums/SelectMode.mjs +0 -6
  37. package/esm2022/lib/Shared/Enums/StartView.mjs +0 -7
  38. package/esm2022/lib/Shared/Enums/Style.mjs +0 -8
  39. package/esm2022/lib/Shared/Enums/StyleConfirmationMode.mjs +0 -7
  40. package/esm2022/lib/Shared/Enums/TagInputView.mjs +0 -7
  41. package/esm2022/lib/Shared/Enums/ToolbarButtons.mjs +0 -33
  42. package/esm2022/lib/Shared/Enums/map-enums.mjs +0 -15
  43. package/esm2022/lib/Shared/Enums/menu-list-enum.mjs +0 -6
  44. package/esm2022/lib/Shared/Models/Attribute.mjs +0 -3
  45. package/esm2022/lib/Shared/Models/AutocompleteDTO.mjs +0 -8
  46. package/esm2022/lib/Shared/Models/AutocompleteOptions.mjs +0 -39
  47. package/esm2022/lib/Shared/Models/CalendarDTO.mjs +0 -3
  48. package/esm2022/lib/Shared/Models/CalendarEventDTO.mjs +0 -3
  49. package/esm2022/lib/Shared/Models/CalendarOptions.mjs +0 -19
  50. package/esm2022/lib/Shared/Models/CancelDTO.mjs +0 -7
  51. package/esm2022/lib/Shared/Models/CaptchaStyle.mjs +0 -3
  52. package/esm2022/lib/Shared/Models/CheckBoxOptions.mjs +0 -11
  53. package/esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs +0 -39
  54. package/esm2022/lib/Shared/Models/ControlOptionsBase.mjs +0 -17
  55. package/esm2022/lib/Shared/Models/CustomValidation.mjs +0 -14
  56. package/esm2022/lib/Shared/Models/DatePickerOptions.mjs +0 -40
  57. package/esm2022/lib/Shared/Models/DropdownListItem.mjs +0 -3
  58. package/esm2022/lib/Shared/Models/DropdownOptions.mjs +0 -38
  59. package/esm2022/lib/Shared/Models/EditPersonalImage.mjs +0 -7
  60. package/esm2022/lib/Shared/Models/EnglishArabicDTO.mjs +0 -10
  61. package/esm2022/lib/Shared/Models/FileDTO.mjs +0 -24
  62. package/esm2022/lib/Shared/Models/FileOptions.mjs +0 -15
  63. package/esm2022/lib/Shared/Models/FileUploadModel.mjs +0 -3
  64. package/esm2022/lib/Shared/Models/FileUploadOptions.mjs +0 -13
  65. package/esm2022/lib/Shared/Models/FilterItem.mjs +0 -8
  66. package/esm2022/lib/Shared/Models/FormOptions.mjs +0 -32
  67. package/esm2022/lib/Shared/Models/HtmlEditorOptions.mjs +0 -12
  68. package/esm2022/lib/Shared/Models/ImageUploadOptions.mjs +0 -14
  69. package/esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs +0 -12
  70. package/esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs +0 -6
  71. package/esm2022/lib/Shared/Models/MarkdownEditorOptions.mjs +0 -24
  72. package/esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +0 -9
  73. package/esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +0 -9
  74. package/esm2022/lib/Shared/Models/MultiLingualTextBoxOptions.mjs +0 -17
  75. package/esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs +0 -21
  76. package/esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs +0 -9
  77. package/esm2022/lib/Shared/Models/PagingDTO.mjs +0 -13
  78. package/esm2022/lib/Shared/Models/PagingOptions.mjs +0 -49
  79. package/esm2022/lib/Shared/Models/PagingPayload.mjs +0 -3
  80. package/esm2022/lib/Shared/Models/PhoneOptions.mjs +0 -16
  81. package/esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs +0 -11
  82. package/esm2022/lib/Shared/Models/ProfilePictureDTO.mjs +0 -3
  83. package/esm2022/lib/Shared/Models/RadioButtonItem.mjs +0 -3
  84. package/esm2022/lib/Shared/Models/RadioButtonOptions.mjs +0 -7
  85. package/esm2022/lib/Shared/Models/RangeNumber.mjs +0 -3
  86. package/esm2022/lib/Shared/Models/Recaptcha.mjs +0 -6
  87. package/esm2022/lib/Shared/Models/RecaptchaOptions.mjs +0 -22
  88. package/esm2022/lib/Shared/Models/RepeaterField.mjs +0 -3
  89. package/esm2022/lib/Shared/Models/RepeaterOptions.mjs +0 -14
  90. package/esm2022/lib/Shared/Models/SaveDTO.mjs +0 -7
  91. package/esm2022/lib/Shared/Models/TagsInputDTO.mjs +0 -3
  92. package/esm2022/lib/Shared/Models/TagsInputOptions.mjs +0 -56
  93. package/esm2022/lib/Shared/Models/TextAreaOptions.mjs +0 -19
  94. package/esm2022/lib/Shared/Models/TextBoxOptions.mjs +0 -27
  95. package/esm2022/lib/Shared/Models/ToggleSlideOptions.mjs +0 -9
  96. package/esm2022/lib/Shared/Models/UploadPersonalImage.mjs +0 -7
  97. package/esm2022/lib/Shared/Models/bread-crumb.mjs +0 -8
  98. package/esm2022/lib/Shared/Models/control-filter-Item.mjs +0 -6
  99. package/esm2022/lib/Shared/Models/filter-options.mjs +0 -9
  100. package/esm2022/lib/Shared/Models/index.mjs +0 -58
  101. package/esm2022/lib/Shared/Models/page-header-options.mjs +0 -78
  102. package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +0 -22
  103. package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +0 -22
  104. package/esm2022/lib/Shared/config/environment.mjs +0 -12
  105. package/esm2022/lib/Shared/default_intl.mjs +0 -29
  106. package/esm2022/lib/Shared/services/ControlUtility.mjs +0 -162
  107. package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +0 -30
  108. package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
  109. package/esm2022/lib/Shared/services/file-upload.service.mjs +0 -29
  110. package/esm2022/lib/Shared/services/index.mjs +0 -7
  111. package/esm2022/lib/Shared/services/render-component-service.service.mjs +0 -32
  112. package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +0 -125
  113. package/esm2022/lib/Shared/utils/date-formatter.mjs +0 -48
  114. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -299
  115. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +0 -179
  116. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +0 -121
  117. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +0 -143
  118. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -240
  119. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +0 -296
  120. package/esm2022/lib/controls/FileUpload/FileUpload.component.mjs +0 -741
  121. package/esm2022/lib/controls/Form/Form.component.mjs +0 -117
  122. package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -185
  123. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -360
  124. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -502
  125. package/esm2022/lib/controls/MarkdownEditor/markdown-editor.component.mjs +0 -243
  126. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -456
  127. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -441
  128. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -500
  129. package/esm2022/lib/controls/Paging/JwPagination.component.mjs +0 -175
  130. package/esm2022/lib/controls/Paging/Paging.component.mjs +0 -626
  131. package/esm2022/lib/controls/Phone/Phone.component.mjs +0 -134
  132. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -390
  133. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +0 -113
  134. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +0 -134
  135. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +0 -135
  136. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +0 -1291
  137. package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +0 -22
  138. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +0 -118
  139. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +0 -308
  140. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +0 -581
  141. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +0 -357
  142. package/esm2022/lib/controls/Toggleslide/Toggleslide.component.mjs +0 -96
  143. package/esm2022/lib/controls/bbsf-controls.module.mjs +0 -92
  144. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +0 -42
  145. package/esm2022/lib/modules/bbsf-core.module.mjs +0 -210
  146. package/esm2022/lib/modules/bbsf-datetime.module.mjs +0 -90
  147. package/esm2022/lib/modules/bbsf-dropdown.module.mjs +0 -57
  148. package/esm2022/lib/modules/bbsf-editors.module.mjs +0 -97
  149. package/esm2022/lib/modules/bbsf-forms-basic.module.mjs +0 -79
  150. package/esm2022/lib/modules/bbsf-multilingual.module.mjs +0 -60
  151. package/esm2022/lib/modules/bbsf-phone.module.mjs +0 -57
  152. package/esm2022/lib/modules/bbsf-specialized.module.mjs +0 -160
  153. package/esm2022/lib/modules/bbsf-uploads.module.mjs +0 -106
  154. package/esm2022/lib/modules/bbsf-utility.module.mjs +0 -103
  155. package/esm2022/public-api.mjs +0 -169
@@ -1,175 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- export class JwPaginationComponent {
6
- constructor() {
7
- this.changePage = new EventEmitter();
8
- this.initialPage = 1;
9
- this.pageSize = 10;
10
- this.maxPages = 10;
11
- this.ShowFirstAndLast = false;
12
- this.pager = {};
13
- }
14
- ngOnInit() {
15
- // set page if items array isn't empty
16
- if (this.items && this.items.length) {
17
- this.setPage(this.initialPage);
18
- }
19
- }
20
- ngOnChanges(changes) {
21
- // Handle items array changes
22
- if (changes.items && !changes.items.firstChange) {
23
- // reset page if items array has changed
24
- if (changes.items.currentValue !== changes.items.previousValue) {
25
- this.setPage(this.initialPage);
26
- }
27
- }
28
- // Handle initialPage changes (when navigating between pages)
29
- if (changes.initialPage && !changes.initialPage.firstChange) {
30
- if (changes.initialPage.currentValue !== changes.initialPage.previousValue) {
31
- this.setPage(this.initialPage);
32
- }
33
- }
34
- // Handle pageSize or maxPages changes
35
- if ((changes.pageSize && !changes.pageSize.firstChange) ||
36
- (changes.maxPages && !changes.maxPages.firstChange)) {
37
- // Recalculate pagination with new settings
38
- if (this.items && this.items.length) {
39
- this.setPage(this.pager.currentPage || this.initialPage);
40
- }
41
- }
42
- }
43
- setPage(page) {
44
- // get new pager object for specified page
45
- this.pager = this.paginate(this.items.length, page, this.pageSize, this.maxPages);
46
- // get new page of items from items array
47
- var pageOfItems = this.items.slice(this.pager.startIndex, this.pager.endIndex + 1);
48
- // call change page function in parent component
49
- this.changePage.emit(this.pager.currentPage);
50
- }
51
- paginate(totalItems, currentPage, pageSize, maxPages) {
52
- if (currentPage === void 0) {
53
- currentPage = 1;
54
- }
55
- if (pageSize === void 0) {
56
- pageSize = 10;
57
- }
58
- if (maxPages === void 0) {
59
- maxPages = 10;
60
- }
61
- // calculate total pages
62
- var totalPages = Math.ceil(totalItems / pageSize);
63
- // ensure current page isn't out of range
64
- if (currentPage < 1) {
65
- currentPage = 1;
66
- }
67
- else if (currentPage > totalPages) {
68
- currentPage = totalPages;
69
- }
70
- var startPage, endPage;
71
- if (totalPages <= maxPages) {
72
- // total pages less than max so show all pages
73
- startPage = 1;
74
- endPage = totalPages;
75
- }
76
- else {
77
- // total pages more than max so calculate start and end pages
78
- var maxPagesBeforeCurrentPage = Math.floor(maxPages / 2);
79
- var maxPagesAfterCurrentPage = Math.ceil(maxPages / 2) - 1;
80
- if (currentPage <= maxPagesBeforeCurrentPage) {
81
- // current page near the start
82
- startPage = 1;
83
- endPage = maxPages;
84
- }
85
- else if (currentPage + maxPagesAfterCurrentPage >= totalPages) {
86
- // current page near the end
87
- startPage = totalPages - maxPages + 1;
88
- endPage = totalPages;
89
- }
90
- else {
91
- // current page somewhere in the middle
92
- startPage = currentPage - maxPagesBeforeCurrentPage;
93
- endPage = currentPage + maxPagesAfterCurrentPage;
94
- }
95
- }
96
- // calculate start and end item indexes
97
- var startIndex = (currentPage - 1) * pageSize;
98
- var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
99
- // create an array of pages to ng-repeat in the pager control
100
- var pages = Array.from(Array((endPage + 1) - startPage).keys()).map(function (i) { return startPage + i; });
101
- // return object with all pager properties required by the view
102
- return {
103
- totalItems: totalItems,
104
- currentPage: currentPage,
105
- pageSize: pageSize,
106
- totalPages: totalPages,
107
- startPage: startPage,
108
- endPage: endPage,
109
- startIndex: startIndex,
110
- endIndex: endIndex,
111
- pages: pages
112
- };
113
- }
114
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JwPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
115
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: JwPaginationComponent, isStandalone: true, selector: "jw-pagination", inputs: { items: "items", initialPage: "initialPage", pageSize: "pageSize", maxPages: "maxPages", ShowFirstAndLast: "ShowFirstAndLast" }, outputs: { changePage: "changePage" }, usesOnChanges: true, ngImport: i0, template: `
116
- <ul *ngIf="pager.pages && pager.pages.length" class="pagination">
117
- <li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === 1}" class="page-item first-item">
118
- <a (click)="setPage(1)" class="page-link">❮❮</a>
119
- </li>
120
- <li [ngClass]="{disabled:pager.currentPage === 1}" class="page-item previous-item">
121
- <a (click)="setPage(pager.currentPage - 1)" class="page-link">❮</a>
122
- </li>
123
- <li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}" class="page-item number-item">
124
- <a (click)="setPage(page)" class="page-link">{{page}}</a>
125
- </li>
126
- <li [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item next-item">
127
- <a (click)="setPage(pager.currentPage + 1)" class="page-link">❯</a>
128
- </li>
129
- <li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item last-item">
130
- <a (click)="setPage(pager.totalPages)" class="page-link">❯❯</a>
131
- </li>
132
- </ul>
133
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
134
- }
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JwPaginationComponent, decorators: [{
136
- type: Component,
137
- args: [{
138
- selector: 'jw-pagination',
139
- standalone: true,
140
- imports: [CommonModule],
141
- schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA],
142
- template: `
143
- <ul *ngIf="pager.pages && pager.pages.length" class="pagination">
144
- <li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === 1}" class="page-item first-item">
145
- <a (click)="setPage(1)" class="page-link">❮❮</a>
146
- </li>
147
- <li [ngClass]="{disabled:pager.currentPage === 1}" class="page-item previous-item">
148
- <a (click)="setPage(pager.currentPage - 1)" class="page-link">❮</a>
149
- </li>
150
- <li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}" class="page-item number-item">
151
- <a (click)="setPage(page)" class="page-link">{{page}}</a>
152
- </li>
153
- <li [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item next-item">
154
- <a (click)="setPage(pager.currentPage + 1)" class="page-link">❯</a>
155
- </li>
156
- <li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item last-item">
157
- <a (click)="setPage(pager.totalPages)" class="page-link">❯❯</a>
158
- </li>
159
- </ul>
160
- `
161
- }]
162
- }], propDecorators: { items: [{
163
- type: Input
164
- }], changePage: [{
165
- type: Output
166
- }], initialPage: [{
167
- type: Input
168
- }], pageSize: [{
169
- type: Input
170
- }], maxPages: [{
171
- type: Input
172
- }], ShowFirstAndLast: [{
173
- type: Input
174
- }] } });
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSndQYWdpbmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvSndQYWdpbmF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxzQkFBc0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQTRCL0MsTUFBTSxPQUFPLHFCQUFxQjtJQTFCbEM7UUE0QmMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbEMsVUFBSyxHQUFRLEVBQUUsQ0FBQztLQXdHbkI7SUF0R0csUUFBUTtRQUNKLHNDQUFzQztRQUN0QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLDZCQUE2QjtRQUM3QixJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUM3Qyx3Q0FBd0M7WUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtnQkFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJ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bUdBQXJCLHFCQUFxQiwrUUFyQnBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQmIsMkRBcEJhLFlBQVk7OzRGQXVCYixxQkFBcUI7a0JBMUJqQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxnQkFBZ0IsQ0FBQztvQkFDbkQsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FrQmI7aUJBQ0E7OEJBR1ksS0FBSztzQkFBYixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0UsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBOT19FUlJPUlNfU0NIRU1BIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnanctcGFnaW5hdGlvbicsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTk9fRVJST1JTX1NDSEVNQV0sXHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gIDx1bCAqbmdJZj1cInBhZ2VyLnBhZ2VzICYmIHBhZ2VyLnBhZ2VzLmxlbmd0aFwiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxyXG4gIDxsaSAqbmdJZj1cIlNob3dGaXJzdEFuZExhc3RcIiBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6cGFnZXIuY3VycmVudFBhZ2UgPT09IDF9XCIgY2xhc3M9XCJwYWdlLWl0ZW0gZmlyc3QtaXRlbVwiPlxyXG4gICAgICA8YSAoY2xpY2spPVwic2V0UGFnZSgxKVwiIGNsYXNzPVwicGFnZS1saW5rXCI+4p2u4p2uPC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDpwYWdlci5jdXJyZW50UGFnZSA9PT0gMX1cIiBjbGFzcz1cInBhZ2UtaXRlbSBwcmV2aW91cy1pdGVtXCI+XHJcbiAgICAgIDxhIChjbGljayk9XCJzZXRQYWdlKHBhZ2VyLmN1cnJlbnRQYWdlIC0gMSlcIiBjbGFzcz1cInBhZ2UtbGlua1wiPuKdrjwvYT5cclxuICA8L2xpPlxyXG4gIDxsaSAqbmdGb3I9XCJsZXQgcGFnZSBvZiBwYWdlci5wYWdlc1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6cGFnZXIuY3VycmVudFBhZ2UgPT09IHBhZ2V9XCIgY2xhc3M9XCJwYWdlLWl0ZW0gbnVtYmVyLWl0ZW1cIj5cclxuICAgICAgPGEgKGNsaWNrKT1cInNldFBhZ2UocGFnZSlcIiBjbGFzcz1cInBhZ2UtbGlua1wiPnt7cGFnZX19PC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDpwYWdlci5jdXJyZW50UGFnZSA9PT0gcGFnZXIudG90YWxQYWdlc31cIiBjbGFzcz1cInBhZ2UtaXRlbSBuZXh0LWl0ZW1cIj5cclxuICAgICAgPGEgKGNsaWNrKT1cInNldFBhZ2UocGFnZXIuY3VycmVudFBhZ2UgKyAxKVwiIGNsYXNzPVwicGFnZS1saW5rXCI+4p2vPC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpICAqbmdJZj1cIlNob3dGaXJzdEFuZExhc3RcIiBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6cGFnZXIuY3VycmVudFBhZ2UgPT09IHBhZ2VyLnRvdGFsUGFnZXN9XCIgY2xhc3M9XCJwYWdlLWl0ZW0gbGFzdC1pdGVtXCI+XHJcbiAgICAgIDxhIChjbGljayk9XCJzZXRQYWdlKHBhZ2VyLnRvdGFsUGFnZXMpXCIgY2xhc3M9XCJwYWdlLWxpbmtcIj7ina/ina88L2E+XHJcbiAgPC9saT5cclxuPC91bD5cclxuYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEp3UGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIEBJbnB1dCgpIGl0ZW1zOiBBcnJheTxhbnk+O1xyXG4gICAgQE91dHB1dCgpIGNoYW5nZVBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBASW5wdXQoKSBpbml0aWFsUGFnZSA9IDE7XHJcbiAgICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xyXG4gICAgQElucHV0KCkgbWF4UGFnZXMgPSAxMDtcclxuICAgIEBJbnB1dCgpIFNob3dGaXJzdEFuZExhc3QgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgcGFnZXI6IGFueSA9IHt9O1xyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIC8vIHNldCBwYWdlIGlmIGl0ZW1zIGFycmF5IGlzbid0IGVtcHR5XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRQYWdlKHRoaXMuaW5pdGlhbFBhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGl0ZW1zIGFycmF5IGNoYW5nZXNcclxuICAgICAgICBpZiAoY2hhbmdlcy5pdGVtcyAmJiAhY2hhbmdlcy5pdGVtcy5maXJzdENoYW5nZSkge1xyXG4gICAgICAgICAgICAvLyByZXNldCBwYWdlIGlmIGl0ZW1zIGFycmF5IGhhcyBjaGFuZ2VkXHJcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLml0ZW1zLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5pdGVtcy5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBhZ2UodGhpcy5pbml0aWFsUGFnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBpbml0aWFsUGFnZSBjaGFuZ2VzICh3aGVuIG5hdmlnYXRpbmcgYmV0d2VlbiBwYWdlcylcclxuICAgICAgICBpZiAoY2hhbmdlcy5pbml0aWFsUGFnZSAmJiAhY2hhbmdlcy5pbml0aWFsUGFnZS5maXJzdENoYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5pbml0aWFsUGFnZS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuaW5pdGlhbFBhZ2UucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYWdlKHRoaXMuaW5pdGlhbFBhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBIYW5kbGUgcGFnZVNpemUgb3IgbWF4UGFnZXMgY2hhbmdlc1xyXG4gICAgICAgIGlmICgoY2hhbmdlcy5wYWdlU2l6ZSAmJiAhY2hhbmdlcy5wYWdlU2l6ZS5maXJzdENoYW5nZSkgfHxcclxuICAgICAgICAgICAgKGNoYW5nZXMubWF4UGFnZXMgJiYgIWNoYW5nZXMubWF4UGFnZXMuZmlyc3RDaGFuZ2UpKSB7XHJcbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIHBhZ2luYXRpb24gd2l0aCBuZXcgc2V0dGluZ3NcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhZ2VyLmN1cnJlbnRQYWdlIHx8IHRoaXMuaW5pdGlhbFBhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gZ2V0IG5ldyBwYWdlciBvYmplY3QgZm9yIHNwZWNpZmllZCBwYWdlXHJcbiAgICAgICAgdGhpcy5wYWdlciA9IHRoaXMucGFnaW5hdGUodGhpcy5pdGVtcy5sZW5ndGgsIHBhZ2UsIHRoaXMucGFnZVNpemUsIHRoaXMubWF4UGFnZXMpO1xyXG5cclxuICAgICAgICAvLyBnZXQgbmV3IHBhZ2Ugb2YgaXRlbXMgZnJvbSBpdGVtcyBhcnJheVxyXG4gICAgICAgIHZhciBwYWdlT2ZJdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UodGhpcy5wYWdlci5zdGFydEluZGV4LCB0aGlzLnBhZ2VyLmVuZEluZGV4ICsgMSk7XHJcblxyXG4gICAgICAgIC8vIGNhbGwgY2hhbmdlIHBhZ2UgZnVuY3Rpb24gaW4gcGFyZW50IGNvbXBvbmVudFxyXG4gICAgICAgIHRoaXMuY2hhbmdlUGFnZS5lbWl0KHRoaXMucGFnZXIuY3VycmVudFBhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhZ2luYXRlKHRvdGFsSXRlbXMsIGN1cnJlbnRQYWdlLCBwYWdlU2l6ZSwgbWF4UGFnZXMpIHtcclxuICAgICAgICBpZiAoY3VycmVudFBhZ2UgPT09IHZvaWQgMCkgeyBjdXJyZW50UGFnZSA9IDE7IH1cclxuICAgICAgICBpZiAocGFnZVNpemUgPT09IHZvaWQgMCkgeyBwYWdlU2l6ZSA9IDEwOyB9XHJcbiAgICAgICAgaWYgKG1heFBhZ2VzID09PSB2b2lkIDApIHsgbWF4UGFnZXMgPSAxMDsgfVxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0b3RhbCBwYWdlc1xyXG4gICAgICAgIHZhciB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBwYWdlU2l6ZSk7XHJcbiAgICAgICAgLy8gZW5zdXJlIGN1cnJlbnQgcGFnZSBpc24ndCBvdXQgb2YgcmFuZ2VcclxuICAgICAgICBpZiAoY3VycmVudFBhZ2UgPCAxKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY3VycmVudFBhZ2UgPiB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gdG90YWxQYWdlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0UGFnZSwgZW5kUGFnZTtcclxuICAgICAgICBpZiAodG90YWxQYWdlcyA8PSBtYXhQYWdlcykge1xyXG4gICAgICAgICAgICAvLyB0b3RhbCBwYWdlcyBsZXNzIHRoYW4gbWF4IHNvIHNob3cgYWxsIHBhZ2VzXHJcbiAgICAgICAgICAgIHN0YXJ0UGFnZSA9IDE7XHJcbiAgICAgICAgICAgIGVuZFBhZ2UgPSB0b3RhbFBhZ2VzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdG90YWwgcGFnZXMgbW9yZSB0aGFuIG1heCBzbyBjYWxjdWxhdGUgc3RhcnQgYW5kIGVuZCBwYWdlc1xyXG4gICAgICAgICAgICB2YXIgbWF4UGFnZXNCZWZvcmVDdXJyZW50UGFnZSA9IE1hdGguZmxvb3IobWF4UGFnZXMgLyAyKTtcclxuICAgICAgICAgICAgdmFyIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZSA9IE1hdGguY2VpbChtYXhQYWdlcyAvIDIpIC0gMTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlIDw9IG1heFBhZ2VzQmVmb3JlQ3VycmVudFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcGFnZSBuZWFyIHRoZSBzdGFydFxyXG4gICAgICAgICAgICAgICAgc3RhcnRQYWdlID0gMTtcclxuICAgICAgICAgICAgICAgIGVuZFBhZ2UgPSBtYXhQYWdlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50UGFnZSArIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZSA+PSB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBhZ2UgbmVhciB0aGUgZW5kXHJcbiAgICAgICAgICAgICAgICBzdGFydFBhZ2UgPSB0b3RhbFBhZ2VzIC0gbWF4UGFnZXMgKyAxO1xyXG4gICAgICAgICAgICAgICAgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBhZ2Ugc29tZXdoZXJlIGluIHRoZSBtaWRkbGVcclxuICAgICAgICAgICAgICAgIHN0YXJ0UGFnZSA9IGN1cnJlbnRQYWdlIC0gbWF4UGFnZXNCZWZvcmVDdXJyZW50UGFnZTtcclxuICAgICAgICAgICAgICAgIGVuZFBhZ2UgPSBjdXJyZW50UGFnZSArIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjYWxjdWxhdGUgc3RhcnQgYW5kIGVuZCBpdGVtIGluZGV4ZXNcclxuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IChjdXJyZW50UGFnZSAtIDEpICogcGFnZVNpemU7XHJcbiAgICAgICAgdmFyIGVuZEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCArIHBhZ2VTaXplIC0gMSwgdG90YWxJdGVtcyAtIDEpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhbiBhcnJheSBvZiBwYWdlcyB0byBuZy1yZXBlYXQgaW4gdGhlIHBhZ2VyIGNvbnRyb2xcclxuICAgICAgICB2YXIgcGFnZXMgPSBBcnJheS5mcm9tKEFycmF5KChlbmRQYWdlICsgMSkgLSBzdGFydFBhZ2UpLmtleXMoKSkubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBzdGFydFBhZ2UgKyBpOyB9KTtcclxuICAgICAgICAvLyByZXR1cm4gb2JqZWN0IHdpdGggYWxsIHBhZ2VyIHByb3BlcnRpZXMgcmVxdWlyZWQgYnkgdGhlIHZpZXdcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxyXG4gICAgICAgICAgICBjdXJyZW50UGFnZTogY3VycmVudFBhZ2UsXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZSxcclxuICAgICAgICAgICAgdG90YWxQYWdlczogdG90YWxQYWdlcyxcclxuICAgICAgICAgICAgc3RhcnRQYWdlOiBzdGFydFBhZ2UsXHJcbiAgICAgICAgICAgIGVuZFBhZ2U6IGVuZFBhZ2UsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXg6IHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIGVuZEluZGV4OiBlbmRJbmRleCxcclxuICAgICAgICAgICAgcGFnZXM6IHBhZ2VzXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbn0iXX0=