@bnsights/bbsf-controls 1.0.86 → 1.0.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bnsights-bbsf-controls-1.0.87.tgz +0 -0
- package/bnsights-bbsf-controls.d.ts +1 -1
- package/esm2020/bnsights-bbsf-controls.mjs +5 -0
- package/esm2020/lib/Shared/Directives/template-name.directive.mjs +18 -0
- package/{esm2015/lib/Shared/Enums/CalendarView.js → esm2020/lib/Shared/Enums/CalendarView.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/ControlLayout.js → esm2020/lib/Shared/Enums/ControlLayout.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/Countries.js → esm2020/lib/Shared/Enums/Countries.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/Enums.js → esm2020/lib/Shared/Enums/Enums.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/FileType.js → esm2020/lib/Shared/Enums/FileType.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/FilterType.js → esm2020/lib/Shared/Enums/FilterType.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/FontSize.js → esm2020/lib/Shared/Enums/FontSize.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/ForceDirection.js → esm2020/lib/Shared/Enums/ForceDirection.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/IconPosition.js → esm2020/lib/Shared/Enums/IconPosition.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/ImageType.js → esm2020/lib/Shared/Enums/ImageType.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/InputType.js → esm2020/lib/Shared/Enums/InputType.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/Insert.js → esm2020/lib/Shared/Enums/Insert.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/LanguageMode.js → esm2020/lib/Shared/Enums/LanguageMode.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/LanguageValidation.js → esm2020/lib/Shared/Enums/LanguageValidation.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/Misc.js → esm2020/lib/Shared/Enums/Misc.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/PagingActionMode.js → esm2020/lib/Shared/Enums/PagingActionMode.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/Para.js → esm2020/lib/Shared/Enums/Para.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/PickerType.js → esm2020/lib/Shared/Enums/PickerType.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/SelectMode.js → esm2020/lib/Shared/Enums/SelectMode.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/StartView.js → esm2020/lib/Shared/Enums/StartView.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/Style.js → esm2020/lib/Shared/Enums/Style.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/StyleConfirmationMode.js → esm2020/lib/Shared/Enums/StyleConfirmationMode.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/TagInputView.js → esm2020/lib/Shared/Enums/TagInputView.mjs} +0 -0
- package/{esm2015/lib/Shared/Enums/menu-list-enum.js → esm2020/lib/Shared/Enums/menu-list-enum.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/Attribute.js → esm2020/lib/Shared/Models/Attribute.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/AutocompleteDTO.js → esm2020/lib/Shared/Models/AutocompleteDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/AutocompleteOptions.js → esm2020/lib/Shared/Models/AutocompleteOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/CalendarEventDTO.js → esm2020/lib/Shared/Models/CalendarEventDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/CalendarOptions.js → esm2020/lib/Shared/Models/CalendarOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/CancelDTO.js → esm2020/lib/Shared/Models/CancelDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/CaptchaStyle.js → esm2020/lib/Shared/Models/CaptchaStyle.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/CheckBoxOptions.js → esm2020/lib/Shared/Models/CheckBoxOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/ConfirmationModalOptions.js → esm2020/lib/Shared/Models/ConfirmationModalOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/ControlOptionsBase.js → esm2020/lib/Shared/Models/ControlOptionsBase.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/CustomValidation.js → esm2020/lib/Shared/Models/CustomValidation.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/DropdownListItem.js → esm2020/lib/Shared/Models/DropdownListItem.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/DropdownOptions.js → esm2020/lib/Shared/Models/DropdownOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/EditPersonalImage.js → esm2020/lib/Shared/Models/EditPersonalImage.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/EnglishArabicDTO.js → esm2020/lib/Shared/Models/EnglishArabicDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/FileDTO.js → esm2020/lib/Shared/Models/FileDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/FileUploadModel.js → esm2020/lib/Shared/Models/FileUploadModel.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/FileUploadOptions.js → esm2020/lib/Shared/Models/FileUploadOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/FilterItem.js → esm2020/lib/Shared/Models/FilterItem.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/FormOptions.js → esm2020/lib/Shared/Models/FormOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/HtmlEditorOptions.js → esm2020/lib/Shared/Models/HtmlEditorOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/ImageUploadOptions.js → esm2020/lib/Shared/Models/ImageUploadOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MapAutoCompleteOptions.js → esm2020/lib/Shared/Models/MapAutoCompleteOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MapAutocompleteDTO.js → esm2020/lib/Shared/Models/MapAutocompleteDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js → esm2020/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js → esm2020/lib/Shared/Models/MultiLingualTextAreaOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MultilingualControlOptionsBase.js → esm2020/lib/Shared/Models/MultilingualControlOptionsBase.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js → esm2020/lib/Shared/Models/MultilingualTextBoxOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/MultipleFileUploadModel.js → esm2020/lib/Shared/Models/MultipleFileUploadModel.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/PagingDTO.js → esm2020/lib/Shared/Models/PagingDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/PagingOptions.js → esm2020/lib/Shared/Models/PagingOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/PagingPayload.js → esm2020/lib/Shared/Models/PagingPayload.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/PhoneOptions.js → esm2020/lib/Shared/Models/PhoneOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/ProfileImageUploadOptions.js → esm2020/lib/Shared/Models/ProfileImageUploadOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/ProfilePictureDTO.js → esm2020/lib/Shared/Models/ProfilePictureDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/RadioButtonItem.js → esm2020/lib/Shared/Models/RadioButtonItem.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/RadioButtonOptions.js → esm2020/lib/Shared/Models/RadioButtonOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/RangeNumber.js → esm2020/lib/Shared/Models/RangeNumber.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/Recaptcha.js → esm2020/lib/Shared/Models/Recaptcha.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/RecaptchaOptions.js → esm2020/lib/Shared/Models/RecaptchaOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/RepeaterField.js → esm2020/lib/Shared/Models/RepeaterField.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/RepeaterOptions.js → esm2020/lib/Shared/Models/RepeaterOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/SaveDTO.js → esm2020/lib/Shared/Models/SaveDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/TagsInputDTO.js → esm2020/lib/Shared/Models/TagsInputDTO.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/TagsInputOptions.js → esm2020/lib/Shared/Models/TagsInputOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/TextAreaOptions.js → esm2020/lib/Shared/Models/TextAreaOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/TextBoxOptions.js → esm2020/lib/Shared/Models/TextBoxOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/ToggleslideOptions.js → esm2020/lib/Shared/Models/ToggleslideOptions.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/UploadPersonalImage.js → esm2020/lib/Shared/Models/UploadPersonalImage.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/bread-crumb.js → esm2020/lib/Shared/Models/bread-crumb.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/control-filter-Item.js → esm2020/lib/Shared/Models/control-filter-Item.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/datePickerOptions.js → esm2020/lib/Shared/Models/datePickerOptions.mjs} +1 -1
- package/{esm2015/lib/Shared/Models/filter-options.js → esm2020/lib/Shared/Models/filter-options.mjs} +0 -0
- package/{esm2015/lib/Shared/Models/page-header-options.js → esm2020/lib/Shared/Models/page-header-options.mjs} +0 -0
- package/esm2020/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +21 -0
- package/esm2020/lib/Shared/Pipes/bbsf-date.pipe.mjs +21 -0
- package/esm2020/lib/Shared/components/app-base-component.mjs +198 -0
- package/esm2020/lib/Shared/components/ng-tag-input.mjs +336 -0
- package/{esm2015/lib/Shared/config/environment.js → esm2020/lib/Shared/config/environment.mjs} +0 -0
- package/esm2020/lib/Shared/default_intl.mjs +29 -0
- package/esm2020/lib/Shared/services/ControlUtility.mjs +162 -0
- package/esm2020/lib/Shared/services/GlobalSettings.service.mjs +30 -0
- package/esm2020/lib/Shared/services/OnPagingFiltersChange.service.mjs +24 -0
- package/esm2020/lib/Shared/services/render-component-service.service.mjs +30 -0
- package/esm2020/lib/Shared/services/validationErrorMassage.service.mjs +137 -0
- package/esm2020/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +245 -0
- package/esm2020/lib/controls/Calendar/Calendar.component.mjs +172 -0
- package/esm2020/lib/controls/CheckBox/CheckBox.component.mjs +114 -0
- package/esm2020/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +136 -0
- package/esm2020/lib/controls/DateTimePicker/DateTimePicker.component.mjs +217 -0
- package/esm2020/lib/controls/DropdownList/DropdownList.component.mjs +179 -0
- package/esm2020/lib/controls/FileUplaod/FileUplaod.component.mjs +453 -0
- package/esm2020/lib/controls/Form/Form.component.mjs +101 -0
- package/esm2020/lib/controls/HtmlEditor/HtmlEditor.component.mjs +223 -0
- package/esm2020/lib/controls/ImageUpload/ImageUpload.component.mjs +350 -0
- package/esm2020/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +325 -0
- package/esm2020/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +427 -0
- package/esm2020/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +427 -0
- package/esm2020/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +426 -0
- package/esm2020/lib/controls/Paging/JwPagination.component.mjs +156 -0
- package/esm2020/lib/controls/Paging/Paging.component.mjs +312 -0
- package/esm2020/lib/controls/Phone/Phone.component.mjs +124 -0
- package/esm2020/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +354 -0
- package/esm2020/lib/controls/RadioButton/RadioButton.component.mjs +106 -0
- package/esm2020/lib/controls/Recaptcha/Recaptcha.component.mjs +132 -0
- package/esm2020/lib/controls/Repeater/repeater/repeater.component.mjs +125 -0
- package/esm2020/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +750 -0
- package/esm2020/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +21 -0
- package/esm2020/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +108 -0
- package/esm2020/lib/controls/TagsInput/TagsInput.component.mjs +268 -0
- package/esm2020/lib/controls/TextArea/TextArea.component.mjs +192 -0
- package/esm2020/lib/controls/TextBox/TextBox.component.mjs +266 -0
- package/esm2020/lib/controls/Toggleslide/toggleslide.component.mjs +84 -0
- package/esm2020/lib/controls/bbsf-controls.module.mjs +401 -0
- package/esm2020/lib/controls/page-header-component/page-header-component.component.mjs +37 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{bnsights-bbsf-controls.js → bnsights-bbsf-controls.mjs} +1787 -1644
- package/fesm2015/bnsights-bbsf-controls.mjs.map +1 -0
- package/fesm2020/bnsights-bbsf-controls.mjs +8938 -0
- package/fesm2020/bnsights-bbsf-controls.mjs.map +1 -0
- package/lib/Shared/Directives/template-name.directive.d.ts +3 -0
- package/lib/Shared/Models/datePickerOptions.d.ts +1 -1
- package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +3 -0
- package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +3 -0
- package/lib/Shared/components/app-base-component.d.ts +3 -0
- package/lib/Shared/components/ng-tag-input.d.ts +3 -0
- package/lib/Shared/default_intl.d.ts +3 -0
- package/lib/Shared/services/ControlUtility.d.ts +3 -0
- package/lib/Shared/services/GlobalSettings.service.d.ts +3 -0
- package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +3 -0
- package/lib/Shared/services/render-component-service.service.d.ts +3 -0
- package/lib/Shared/services/validationErrorMassage.service.d.ts +3 -0
- package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +4 -0
- package/lib/controls/Calendar/Calendar.component.d.ts +3 -0
- package/lib/controls/CheckBox/CheckBox.component.d.ts +4 -0
- package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +3 -0
- package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +8 -2
- package/lib/controls/DropdownList/DropdownList.component.d.ts +4 -0
- package/lib/controls/FileUplaod/FileUplaod.component.d.ts +3 -0
- package/lib/controls/Form/Form.component.d.ts +3 -0
- package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +4 -0
- package/lib/controls/ImageUpload/ImageUpload.component.d.ts +3 -0
- package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +3 -0
- package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +3 -0
- package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +3 -0
- package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +3 -0
- package/lib/controls/Paging/JwPagination.component.d.ts +3 -0
- package/lib/controls/Paging/Paging.component.d.ts +3 -0
- package/lib/controls/Phone/Phone.component.d.ts +7 -1
- package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +3 -0
- package/lib/controls/RadioButton/RadioButton.component.d.ts +3 -0
- package/lib/controls/Recaptcha/Recaptcha.component.d.ts +4 -0
- package/lib/controls/Repeater/repeater/repeater.component.d.ts +3 -0
- package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +3 -0
- package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +3 -0
- package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +3 -0
- package/lib/controls/TagsInput/TagsInput.component.d.ts +4 -0
- package/lib/controls/TextArea/TextArea.component.d.ts +4 -0
- package/lib/controls/TextBox/TextBox.component.d.ts +4 -0
- package/lib/controls/Toggleslide/toggleslide.component.d.ts +4 -0
- package/lib/controls/bbsf-controls.module.d.ts +74 -0
- package/lib/controls/page-header-component/page-header-component.component.d.ts +3 -0
- package/package.json +20 -8
- package/bnsights-bbsf-controls-1.0.86.tgz +0 -0
- package/bnsights-bbsf-controls.metadata.json +0 -1
- package/bundles/bnsights-bbsf-controls.umd.js +0 -9430
- package/bundles/bnsights-bbsf-controls.umd.js.map +0 -1
- package/esm2015/bnsights-bbsf-controls.js +0 -6
- package/esm2015/lib/Shared/Directives/template-name.directive.js +0 -18
- package/esm2015/lib/Shared/Pipes/bbsf-date-time.pipe.js +0 -20
- package/esm2015/lib/Shared/Pipes/bbsf-date.pipe.js +0 -20
- package/esm2015/lib/Shared/components/app-base-component.js +0 -198
- package/esm2015/lib/Shared/components/ng-tag-input.js +0 -323
- package/esm2015/lib/Shared/default_intl.js +0 -29
- package/esm2015/lib/Shared/services/ControlUtility.js +0 -164
- package/esm2015/lib/Shared/services/GlobalSettings.service.js +0 -28
- package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +0 -22
- package/esm2015/lib/Shared/services/render-component-service.service.js +0 -30
- package/esm2015/lib/Shared/services/validationErrorMassage.service.js +0 -137
- package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +0 -248
- package/esm2015/lib/controls/Calendar/Calendar.component.js +0 -176
- package/esm2015/lib/controls/CheckBox/CheckBox.component.js +0 -114
- package/esm2015/lib/controls/ConfirmationModal/ConfirmationModal.component.js +0 -139
- package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +0 -215
- package/esm2015/lib/controls/DropdownList/DropdownList.component.js +0 -178
- package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +0 -451
- package/esm2015/lib/controls/Form/Form.component.js +0 -106
- package/esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js +0 -222
- package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +0 -347
- package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +0 -325
- package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +0 -429
- package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +0 -430
- package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +0 -429
- package/esm2015/lib/controls/Paging/JwPagination.component.js +0 -129
- package/esm2015/lib/controls/Paging/Paging.component.js +0 -312
- package/esm2015/lib/controls/Phone/Phone.component.js +0 -119
- package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +0 -349
- package/esm2015/lib/controls/RadioButton/RadioButton.component.js +0 -108
- package/esm2015/lib/controls/Recaptcha/Recaptcha.component.js +0 -131
- package/esm2015/lib/controls/Repeater/repeater/repeater.component.js +0 -117
- package/esm2015/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.js +0 -748
- package/esm2015/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.js +0 -19
- package/esm2015/lib/controls/Repeater/repeater-table/repeater-table.component.js +0 -108
- package/esm2015/lib/controls/TagsInput/TagsInput.component.js +0 -268
- package/esm2015/lib/controls/TextArea/TextArea.component.js +0 -191
- package/esm2015/lib/controls/TextBox/TextBox.component.js +0 -262
- package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +0 -83
- package/esm2015/lib/controls/bbsf-controls.module.js +0 -243
- package/esm2015/lib/controls/page-header-component/page-header-component.component.js +0 -32
- package/fesm2015/bnsights-bbsf-controls.js.map +0 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Component, Input, Optional, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../Shared/services/ControlUtility";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
import * as i3 from "@bnsights/bbsf-utilities";
|
|
7
|
+
import * as i4 from "../../Shared/services/GlobalSettings.service";
|
|
8
|
+
import * as i5 from "@angular/common";
|
|
9
|
+
import * as i6 from "@angular/cdk/bidi";
|
|
10
|
+
import * as i7 from "ngx-intl-tel-input";
|
|
11
|
+
export class TextAreaComponent {
|
|
12
|
+
constructor(controlUtility, controlContainer, TextAreaControlHost, UtilityService, controlValidationService, globalSettings) {
|
|
13
|
+
this.controlUtility = controlUtility;
|
|
14
|
+
this.controlContainer = controlContainer;
|
|
15
|
+
this.TextAreaControlHost = TextAreaControlHost;
|
|
16
|
+
this.UtilityService = UtilityService;
|
|
17
|
+
this.controlValidationService = controlValidationService;
|
|
18
|
+
this.globalSettings = globalSettings;
|
|
19
|
+
this.OnChange = new EventEmitter();
|
|
20
|
+
this.WordCount = 0;
|
|
21
|
+
this.WordCountArray = 0;
|
|
22
|
+
this.IsShowWordCount = false;
|
|
23
|
+
this.markAllAsTouched = false;
|
|
24
|
+
this.validationRules = [];
|
|
25
|
+
this.validationRulesasync = [];
|
|
26
|
+
//For Show warning message of max length limit
|
|
27
|
+
this.currentCharsCount = 0;
|
|
28
|
+
this.showCharsLimitMsg = false;
|
|
29
|
+
this.hasCharsLimitValidationError = false;
|
|
30
|
+
this.minCharsLimit = -1; //To disable chars limit feature by default
|
|
31
|
+
this.maxLimitWarningMsg = "";
|
|
32
|
+
this.resetError = () => {
|
|
33
|
+
this.controlValidationService.RemoveGlobalError();
|
|
34
|
+
};
|
|
35
|
+
//External Method
|
|
36
|
+
this.RemoveRequiredValidation = () => {
|
|
37
|
+
this.controlUtility.RemoveRequiredValidation(this.TextAreaFormControl, this.validationRules, this.options);
|
|
38
|
+
};
|
|
39
|
+
//External Method
|
|
40
|
+
this.AddRequiredValidation = () => {
|
|
41
|
+
this.controlUtility.AddRequiredValidation(this.TextAreaFormControl, this.validationRules, this.options);
|
|
42
|
+
};
|
|
43
|
+
//External Method
|
|
44
|
+
this.RemoveCustomValidation = (CustomValidation) => {
|
|
45
|
+
this.controlUtility.RemoveCustomValidation(this.TextAreaFormControl, this.validationRules, CustomValidation);
|
|
46
|
+
};
|
|
47
|
+
//External Method
|
|
48
|
+
this.AddCustomValidation = (CustomValidation) => {
|
|
49
|
+
this.controlUtility.AddCustomValidation(this.TextAreaFormControl, this.validationRules, CustomValidation);
|
|
50
|
+
};
|
|
51
|
+
//External Method
|
|
52
|
+
this.IsValid = () => {
|
|
53
|
+
this.controlUtility.IsValid(this.TextAreaFormControl);
|
|
54
|
+
};
|
|
55
|
+
TextAreaComponent.controlContainerstatic = this.controlContainer;
|
|
56
|
+
}
|
|
57
|
+
ngOnInit() {
|
|
58
|
+
this.textDir = this.options.ForceDirection == 2 ? 'rtl' : 'ltr';
|
|
59
|
+
this.controlValidationService.isCreatedBefor = false;
|
|
60
|
+
this.group.addControl(this.options.Name, new FormControl(''));
|
|
61
|
+
this.TextAreaFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
|
|
62
|
+
if (!this.options.MaxLength)
|
|
63
|
+
this.options.MaxLength = this.globalSettings.MaxLengthTextArea;
|
|
64
|
+
if (!this.options.ViewType)
|
|
65
|
+
this.options.ViewType = this.globalSettings.ViewType;
|
|
66
|
+
if (this.options.LabelKey != null && this.options.LabelKey != "")
|
|
67
|
+
this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
|
|
68
|
+
this.TextAreaFormControl.setValue(this.options.Value);
|
|
69
|
+
if (this.options.CustomValidation.length > 0) {
|
|
70
|
+
let Validations = this.options.CustomValidation;
|
|
71
|
+
for (let index = 0; index < Validations.length; index++) {
|
|
72
|
+
const Validation = Validations[index];
|
|
73
|
+
this.validationRules.push(Validation.functionBody);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (this.options.MinLength > 0) {
|
|
77
|
+
this.validationRules.push(Validators.minLength(this.options.MinLength));
|
|
78
|
+
}
|
|
79
|
+
if (this.options.MaxLength > 0) {
|
|
80
|
+
this.validationRules.push(Validators.maxLength(this.options.MaxLength));
|
|
81
|
+
if (!this.options.MaxLengthWarningLimit)
|
|
82
|
+
this.options.MaxLengthWarningLimit = this.globalSettings.MaxLengthWarningLimit;
|
|
83
|
+
this.minCharsLimit = this.options.MaxLength - this.options.MaxLengthWarningLimit;
|
|
84
|
+
}
|
|
85
|
+
if (this.options.IsRequired) {
|
|
86
|
+
this.validationRules.push(Validators.required);
|
|
87
|
+
}
|
|
88
|
+
this.TextAreaFormControl.setValidators(this.validationRules);
|
|
89
|
+
this.TextAreaFormControl.setAsyncValidators(this.validationRulesasync);
|
|
90
|
+
if (this.options.IsDisabled) {
|
|
91
|
+
this.TextAreaFormControl.disable();
|
|
92
|
+
}
|
|
93
|
+
this.TextAreaControlHost.ngSubmit.subscribe((value) => {
|
|
94
|
+
this.group.markAllAsTouched();
|
|
95
|
+
this.markAllAsTouched = true;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
ngAfterViewInit() {
|
|
99
|
+
this.controlUtility.setAttributeForControl(this.options);
|
|
100
|
+
}
|
|
101
|
+
showGlobalError() {
|
|
102
|
+
this.controlUtility.showGlobalError();
|
|
103
|
+
}
|
|
104
|
+
getErrorValidation(ErrorList) {
|
|
105
|
+
if (this.markAllAsTouched && this.group.invalid) {
|
|
106
|
+
this.showGlobalError();
|
|
107
|
+
this.markAllAsTouched = false;
|
|
108
|
+
}
|
|
109
|
+
return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
|
|
110
|
+
}
|
|
111
|
+
getInputType(type) {
|
|
112
|
+
return this.controlUtility.getInputType(type);
|
|
113
|
+
}
|
|
114
|
+
trimControlValue() {
|
|
115
|
+
let originalValue = this.controlUtility.trimControlValue(this.TextAreaFormControl.value);
|
|
116
|
+
this.TextAreaFormControl.patchValue(originalValue);
|
|
117
|
+
if (this.options.PatchFunction && this.options.PatchPath && this.TextAreaFormControl.valid) {
|
|
118
|
+
this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
copyInputMessage(inputElement) {
|
|
122
|
+
this.controlUtility.CopyInputMessage(inputElement);
|
|
123
|
+
}
|
|
124
|
+
onTextChange() {
|
|
125
|
+
if (this.TextAreaFormControl.value == "") {
|
|
126
|
+
this.WordCountArray = 0;
|
|
127
|
+
this.WordCount = 0;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.WordCountArray = this.TextAreaFormControl.value.split(" ").length;
|
|
131
|
+
if (this.WordCountArray > 0) {
|
|
132
|
+
if (this.WordCountArray > this.options.MaxWordCount) {
|
|
133
|
+
this.WordCount = this.options.MaxWordCount;
|
|
134
|
+
this.TextAreaFormControl.setErrors({ "errorMassage": ` Word count must be less then or equal ${this.options.MaxWordCount}` });
|
|
135
|
+
this.TextAreaFormControl.markAsTouched();
|
|
136
|
+
this.TextAreaFormControl.invalid;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.WordCount = this.WordCountArray;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//Check for maxlength limit count
|
|
144
|
+
//MaxLength should be gretaer than or equals chars limit so that minCharsLimit would be >= 0
|
|
145
|
+
if (this.options.MaxLength && this.minCharsLimit >= 0) {
|
|
146
|
+
this.currentCharsCount = this.TextAreaFormControl.value.length;
|
|
147
|
+
if (this.currentCharsCount > this.minCharsLimit) {
|
|
148
|
+
this.showCharsLimitMsg = true;
|
|
149
|
+
this.hasCharsLimitValidationError = true;
|
|
150
|
+
if (this.currentCharsCount == this.options.MaxLength)
|
|
151
|
+
this.charsLimitMsgClass = "danger";
|
|
152
|
+
else
|
|
153
|
+
this.charsLimitMsgClass = "warning";
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.showCharsLimitMsg = false;
|
|
157
|
+
this.hasCharsLimitValidationError = false;
|
|
158
|
+
}
|
|
159
|
+
var max = this.options.MaxLength;
|
|
160
|
+
var current = this.currentCharsCount;
|
|
161
|
+
var resource = this.UtilityService.getResourceValue("MaxLengthLimitWarning");
|
|
162
|
+
this.maxLimitWarningMsg = eval('`' + resource + '`');
|
|
163
|
+
}
|
|
164
|
+
this.OnChange.emit(this.TextAreaFormControl.value);
|
|
165
|
+
}
|
|
166
|
+
onFocus(isFocus) {
|
|
167
|
+
this.IsShowWordCount = isFocus;
|
|
168
|
+
//onFocus
|
|
169
|
+
if (isFocus) {
|
|
170
|
+
if (this.hasCharsLimitValidationError) //check if there was previous validation error
|
|
171
|
+
this.showCharsLimitMsg = true;
|
|
172
|
+
}
|
|
173
|
+
else //onFocusOut
|
|
174
|
+
this.showCharsLimitMsg = false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
TextAreaComponent.controlContainerstatic = null;
|
|
178
|
+
TextAreaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TextAreaComponent, deps: [{ token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component });
|
|
179
|
+
TextAreaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TextAreaComponent, selector: "BBSF-TextArea", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-textarea\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"bbsf-input-container\" [ngClass]=\"options.EnableCopyToClipboard? 'p-40px' : '' \">\r\n <!--input-->\r\n <textarea class=\"form-control {{options.ExtraClasses}}\"\r\n (focus)=\"onFocus(true)\" (focusout)=\"onFocus(false)\"\r\n [dir]=\"textDir\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"{{options.Name}}\"\r\n [class.is-invalid]=\"TextAreaFormControl.invalid && TextAreaFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" rows=\"{{options.Rows}}\" (keyup)=\"onTextChange()\" cols=\"{{options.Cols}}\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\" [(ngModel)]=\"options.Value\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #TextAreainput></textarea>\r\n <!--CopyToClipboard-->\r\n <div class=\"copy-clipboard\" *ngIf=\"options.EnableCopyToClipboard\" (click)=\"copyInputMessage(TextAreainput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\">\r\n <!--wordCount-->\r\n <div class=\"bbsf-word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} Words</div>\r\n <!-- CharsLimitMsg-->\r\n <div class=\"bbsf-character-count\" *ngIf=\"showCharsLimitMsg\" [ngClass]=\"{'badge-light-warning': charsLimitMsgClass === 'warning', 'badge-light-danger' : charsLimitMsgClass === 'danger' }\">\r\n {{maxLimitWarningMsg}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" [dir]=\"textDir\"\r\n *ngIf=\"(TextAreaFormControl.invalid && TextAreaFormControl.touched)\">\r\n {{getErrorValidation(TextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n</div>\r\n", directives: [{ type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { type: i7.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }], pipes: { "keyvalue": i5.KeyValuePipe } });
|
|
180
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TextAreaComponent, decorators: [{
|
|
181
|
+
type: Component,
|
|
182
|
+
args: [{ selector: 'BBSF-TextArea', template: "<div class=\"form-group bbsf-control bbsf-textarea\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger\">*</span>\r\n </label>\r\n <div class=\"bbsf-input-container\" [ngClass]=\"options.EnableCopyToClipboard? 'p-40px' : '' \">\r\n <!--input-->\r\n <textarea class=\"form-control {{options.ExtraClasses}}\"\r\n (focus)=\"onFocus(true)\" (focusout)=\"onFocus(false)\"\r\n [dir]=\"textDir\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"{{options.Name}}\"\r\n [class.is-invalid]=\"TextAreaFormControl.invalid && TextAreaFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" autocomplete=\"{{options.AutoComplete}}\"\r\n (change)=\"trimControlValue()\" rows=\"{{options.Rows}}\" (keyup)=\"onTextChange()\" cols=\"{{options.Cols}}\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\" [(ngModel)]=\"options.Value\"\r\n (keydown)=\"WordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #TextAreainput></textarea>\r\n <!--CopyToClipboard-->\r\n <div class=\"copy-clipboard\" *ngIf=\"options.EnableCopyToClipboard\" (click)=\"copyInputMessage(TextAreainput)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\">\r\n <!--wordCount-->\r\n <div class=\"bbsf-word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowWordCount\">{{WordCount}}/{{options.MaxWordCount}} Words</div>\r\n <!-- CharsLimitMsg-->\r\n <div class=\"bbsf-character-count\" *ngIf=\"showCharsLimitMsg\" [ngClass]=\"{'badge-light-warning': charsLimitMsgClass === 'warning', 'badge-light-danger' : charsLimitMsgClass === 'danger' }\">\r\n {{maxLimitWarningMsg}}\r\n </div>\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" [dir]=\"textDir\"\r\n *ngIf=\"(TextAreaFormControl.invalid && TextAreaFormControl.touched)\">\r\n {{getErrorValidation(TextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n</div>\r\n" }]
|
|
183
|
+
}], ctorParameters: function () { return [{ type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
|
|
184
|
+
type: Optional
|
|
185
|
+
}] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }]; }, propDecorators: { group: [{
|
|
186
|
+
type: Input
|
|
187
|
+
}], options: [{
|
|
188
|
+
type: Input
|
|
189
|
+
}], OnChange: [{
|
|
190
|
+
type: Output
|
|
191
|
+
}] } });
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dEFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL1RleHRBcmVhL1RleHRBcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9UZXh0QXJlYS9UZXh0QXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBb0UsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBVzNILE1BQU0sT0FBTyxpQkFBaUI7SUFJNUIsWUFBb0IsY0FBOEIsRUFBc0IsZ0JBQWtDLEVBQ2pHLG1CQUF1QyxFQUFVLGNBQThCLEVBQzlFLHdCQUFrRCxFQUFVLGNBQThCO1FBRmhGLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2pHLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUUsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUsxRixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd4QyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQix5QkFBb0IsR0FBRyxFQUFFLENBQUM7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NEJBQTRCLEdBQUcsS0FBSyxDQUFDO2FBQzNDO1lBQ0QsSUFBSSxHQUFHLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDekMsSUFBSSxPQUFPLEdBQVcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBRTdDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFcEQsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFnQjtRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUUvQixTQUFTO1FBQ1QsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSw4Q0FBOEM7Z0JBQ25GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7U0FDakM7YUFDSSxZQUFZO1lBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDOztBQS9LTSx3Q0FBc0IsR0FBRyxJQUFJLENBQUM7K0dBSDFCLGlCQUFpQjttR0FBakIsaUJBQWlCLHdJQ1o5QixndkZBMkNBOzRGRC9CYSxpQkFBaUI7a0JBSjdCLFNBQVM7K0JBQ0UsZUFBZTs7MEJBTzRCLFFBQVE7OEtBS3BELEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAsIEFic3RyYWN0Q29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgRm9ybUdyb3VwRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAgJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgVGV4dEFyZWFPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9UZXh0QXJlYU9wdGlvbnMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9HbG9iYWxTZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLVRleHRBcmVhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vVGV4dEFyZWEuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXh0QXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cclxuICBzdGF0aWMgY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IG51bGw7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBUZXh0QXJlYUNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsIHByaXZhdGUgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSwgcHJpdmF0ZSBnbG9iYWxTZXR0aW5nczogR2xvYmFsU2V0dGluZ3MpIHtcclxuICAgIFRleHRBcmVhQ29tcG9uZW50LmNvbnRyb2xDb250YWluZXJzdGF0aWMgPSB0aGlzLmNvbnRyb2xDb250YWluZXI7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgb3B0aW9uczogVGV4dEFyZWFPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgVGV4dEFyZWFGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIFdvcmRDb3VudDogbnVtYmVyID0gMDtcclxuICBXb3JkQ291bnRBcnJheTogbnVtYmVyID0gMDtcclxuICBJc1Nob3dXb3JkQ291bnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtYXJrQWxsQXNUb3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdmFsaWRhdGlvblJ1bGVzID0gW107XHJcbiAgdmFsaWRhdGlvblJ1bGVzYXN5bmMgPSBbXTtcclxuICAvL0ZvciBTaG93IHdhcm5pbmcgbWVzc2FnZSBvZiBtYXggbGVuZ3RoIGxpbWl0XHJcbiAgY3VycmVudENoYXJzQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgc2hvd0NoYXJzTGltaXRNc2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBoYXNDaGFyc0xpbWl0VmFsaWRhdGlvbkVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2hhcnNMaW1pdE1zZ0NsYXNzOiBzdHJpbmc7XHJcbiAgbWluQ2hhcnNMaW1pdDogbnVtYmVyID0gLTE7IC8vVG8gZGlzYWJsZSBjaGFycyBsaW1pdCBmZWF0dXJlIGJ5IGRlZmF1bHRcclxuICBtYXhMaW1pdFdhcm5pbmdNc2c6IHN0cmluZyA9IFwiXCI7XHJcbiAgcHVibGljIHRleHREaXI7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy50ZXh0RGlyPXRoaXMub3B0aW9ucy5Gb3JjZURpcmVjdGlvbj09Mj8ncnRsJzonbHRyJztcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5pc0NyZWF0ZWRCZWZvciA9IGZhbHNlXHJcblxyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuVGV4dEFyZWFGb3JtQ29udHJvbCA9IHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5NYXhMZW5ndGhUZXh0QXJlYTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5WaWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLlZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5WaWV3VHlwZTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkxhYmVsS2V5ICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkxhYmVsS2V5ICE9IFwiXCIpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5MYWJlbFZhbHVlID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKHRoaXMub3B0aW9ucy5MYWJlbEtleSk7XHJcblxyXG4gICAgdGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy5WYWx1ZSk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbnMgPSB0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvblxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTWluTGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMub3B0aW9ucy5NaW5MZW5ndGgpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMub3B0aW9ucy5NYXhMZW5ndGgpKTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLk1heExlbmd0aFdhcm5pbmdMaW1pdClcclxuICAgICAgICB0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoV2FybmluZ0xpbWl0ID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5NYXhMZW5ndGhXYXJuaW5nTGltaXQ7XHJcblxyXG4gICAgICB0aGlzLm1pbkNoYXJzTGltaXQgPSB0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoIC0gdGhpcy5vcHRpb25zLk1heExlbmd0aFdhcm5pbmdMaW1pdDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuVGV4dEFyZWFDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpXHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IHRydWVcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2V0QXR0cmlidXRlRm9yQ29udHJvbCh0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG5cclxuICByZXNldEVycm9yID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuUmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKClcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2VcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoRXJyb3JMaXN0LCB0aGlzLmdyb3VwLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuICBnZXRJbnB1dFR5cGUodHlwZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRJbnB1dFR5cGUodHlwZSlcclxuICB9XHJcblxyXG4gIHRyaW1Db250cm9sVmFsdWUoKSB7XHJcbiAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuY29udHJvbFV0aWxpdHkudHJpbUNvbnRyb2xWYWx1ZSh0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUpO1xyXG4gICAgdGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLnBhdGNoVmFsdWUob3JpZ2luYWxWYWx1ZSlcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuUGF0Y2hGdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoICYmIHRoaXMuVGV4dEFyZWFGb3JtQ29udHJvbC52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnBhdGNoQ29udHJvbFZhbHVlKG9yaWdpbmFsVmFsdWUsdGhpcy5vcHRpb25zLlBhdGNoRnVuY3Rpb24gLHRoaXMub3B0aW9ucy5QYXRjaFBhdGgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5SW5wdXRNZXNzYWdlKGlucHV0RWxlbWVudCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Db3B5SW5wdXRNZXNzYWdlKGlucHV0RWxlbWVudClcclxuICB9XHJcblxyXG4gIG9uVGV4dENoYW5nZSgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlID09IFwiXCIpIHtcclxuICAgICAgdGhpcy5Xb3JkQ291bnRBcnJheSA9IDA7XHJcbiAgICAgIHRoaXMuV29yZENvdW50ID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5Xb3JkQ291bnRBcnJheSA9IHRoaXMuVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS5zcGxpdChcIiBcIikubGVuZ3RoO1xyXG4gICAgICBpZiAodGhpcy5Xb3JkQ291bnRBcnJheSA+IDApIHtcclxuICAgICAgICBpZiAodGhpcy5Xb3JkQ291bnRBcnJheSA+IHRoaXMub3B0aW9ucy5NYXhXb3JkQ291bnQpIHtcclxuICAgICAgICAgIHRoaXMuV29yZENvdW50ID0gdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudDtcclxuICAgICAgICAgIHRoaXMuVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRFcnJvcnMoeyBcImVycm9yTWFzc2FnZVwiOiBgICBXb3JkIGNvdW50IG11c3QgYmUgbGVzcyB0aGVuIG9yIGVxdWFsICAke3RoaXMub3B0aW9ucy5NYXhXb3JkQ291bnR9YCB9KTtcclxuICAgICAgICAgIHRoaXMuVGV4dEFyZWFGb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICB0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wuaW52YWxpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLldvcmRDb3VudCA9IHRoaXMuV29yZENvdW50QXJyYXk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vQ2hlY2sgZm9yIG1heGxlbmd0aCBsaW1pdCBjb3VudFxyXG4gICAgLy9NYXhMZW5ndGggc2hvdWxkIGJlIGdyZXRhZXIgdGhhbiBvciBlcXVhbHMgY2hhcnMgbGltaXQgc28gdGhhdCBtaW5DaGFyc0xpbWl0IHdvdWxkIGJlID49IDBcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoICYmIHRoaXMubWluQ2hhcnNMaW1pdCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudENoYXJzQ291bnQgPSB0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZiAodGhpcy5jdXJyZW50Q2hhcnNDb3VudCA+IHRoaXMubWluQ2hhcnNMaW1pdCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0NoYXJzTGltaXRNc2cgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaGFzQ2hhcnNMaW1pdFZhbGlkYXRpb25FcnJvciA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaGFyc0NvdW50ID09IHRoaXMub3B0aW9ucy5NYXhMZW5ndGgpXHJcbiAgICAgICAgICB0aGlzLmNoYXJzTGltaXRNc2dDbGFzcyA9IFwiZGFuZ2VyXCI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5jaGFyc0xpbWl0TXNnQ2xhc3MgPSBcIndhcm5pbmdcIjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnNob3dDaGFyc0xpbWl0TXNnID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5oYXNDaGFyc0xpbWl0VmFsaWRhdGlvbkVycm9yID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIG1heDogbnVtYmVyID0gdGhpcy5vcHRpb25zLk1heExlbmd0aDtcclxuICAgICAgdmFyIGN1cnJlbnQ6IG51bWJlciA9IHRoaXMuY3VycmVudENoYXJzQ291bnQ7XHJcblxyXG4gICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJNYXhMZW5ndGhMaW1pdFdhcm5pbmdcIik7XHJcbiAgICAgIHRoaXMubWF4TGltaXRXYXJuaW5nTXNnID0gZXZhbCgnYCcgKyByZXNvdXJjZSArICdgJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlKVxyXG5cclxuICB9XHJcblxyXG4gIG9uRm9jdXMoaXNGb2N1czogYm9vbGVhbikge1xyXG4gICAgdGhpcy5Jc1Nob3dXb3JkQ291bnQgPSBpc0ZvY3VzO1xyXG5cclxuICAgIC8vb25Gb2N1c1xyXG4gICAgaWYgKGlzRm9jdXMpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzQ2hhcnNMaW1pdFZhbGlkYXRpb25FcnJvcikgLy9jaGVjayBpZiB0aGVyZSB3YXMgcHJldmlvdXMgdmFsaWRhdGlvbiBlcnJvclxyXG4gICAgICAgIHRoaXMuc2hvd0NoYXJzTGltaXRNc2cgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSAvL29uRm9jdXNPdXRcclxuICAgICAgdGhpcy5zaG93Q2hhcnNMaW1pdE1zZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5UZXh0QXJlYUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbih0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gIH1cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIEFkZEN1c3RvbVZhbGlkYXRpb24gPSAoQ3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRDdXN0b21WYWxpZGF0aW9uKHRoaXMuVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgSXNWYWxpZCA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuSXNWYWxpZCh0aGlzLlRleHRBcmVhRm9ybUNvbnRyb2wpXHJcbiAgfVxyXG59XHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYmJzZi1jb250cm9sIGJic2YtdGV4dGFyZWFcIiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XHJcbiAgPGRpdiBbbmdDbGFzc109XCIob3B0aW9ucy5WaWV3VHlwZT09MSk/J2Jic2YtdmVydGljYWwnOidiYnNmLWhvcml6b250YWwnXCI+XHJcbiAgICA8IS0tbGFiZWwtLT5cclxuICAgIDxsYWJlbCAqbmdJZj1cIiFvcHRpb25zLkhpZGVMYWJlbFwiIGNsYXNzPVwiYmJzZi1sYWJlbCB7e29wdGlvbnMuTGFiZWxFeHRyYUNsYXNzZXN9fVwiPlxyXG4gICAgICB7e29wdGlvbnMuTGFiZWxWYWx1ZX19XHJcbiAgICAgIDwhLS1Bc3Rlcmlzay0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIihvcHRpb25zLlNob3dBc3RlcmlzayYmb3B0aW9ucy5Jc1JlcXVpcmVkKXx8KG9wdGlvbnMuSXNSZXF1aXJlZClcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1pbnB1dC1jb250YWluZXJcIiBbbmdDbGFzc109XCJvcHRpb25zLkVuYWJsZUNvcHlUb0NsaXBib2FyZD8gJ3AtNDBweCcgOiAnJyBcIj5cclxuICAgICAgPCEtLWlucHV0LS0+XHJcbiAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCB7e29wdGlvbnMuRXh0cmFDbGFzc2VzfX1cIlxyXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXModHJ1ZSlcIiAoZm9jdXNvdXQpPVwib25Gb2N1cyhmYWxzZSlcIlxyXG4gICAgICAgICAgICAgICAgW2Rpcl09XCJ0ZXh0RGlyXCIgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtaW52YWxpZD1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMuTmFtZX19XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIlRleHRBcmVhRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBUZXh0QXJlYUZvcm1Db250cm9sLnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e29wdGlvbnMuUGxhY2Vob2xkZXJ9fVwiIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiIGF1dG9jb21wbGV0ZT1cInt7b3B0aW9ucy5BdXRvQ29tcGxldGV9fVwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRyaW1Db250cm9sVmFsdWUoKVwiIHJvd3M9XCJ7e29wdGlvbnMuUm93c319XCIgKGtleXVwKT1cIm9uVGV4dENoYW5nZSgpXCIgY29scz1cInt7b3B0aW9ucy5Db2xzfX1cIlxyXG4gICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwie3tvcHRpb25zLk1heExlbmd0aH19XCIgbWlubGVuZ3RoPVwie3tvcHRpb25zLk1pbkxlbmd0aH19XCIgWyhuZ01vZGVsKV09XCJvcHRpb25zLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIldvcmRDb3VudEFycmF5Pm9wdGlvbnMuTWF4V29yZENvdW50JiYkZXZlbnQua2V5Q29kZSAhPTg/JGV2ZW50LnByZXZlbnREZWZhdWx0KCk6bnVsbFwiXHJcbiAgICAgICAgICAgICAgICAjVGV4dEFyZWFpbnB1dD48L3RleHRhcmVhPlxyXG4gICAgICA8IS0tQ29weVRvQ2xpcGJvYXJkLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb3B5LWNsaXBib2FyZFwiICpuZ0lmPVwib3B0aW9ucy5FbmFibGVDb3B5VG9DbGlwYm9hcmRcIiAoY2xpY2spPVwiY29weUlucHV0TWVzc2FnZShUZXh0QXJlYWlucHV0KVwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNvcHlcIj48L2k+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInN1YnRleHQtY29udGFpbmVyXCI+XHJcbiAgICA8IS0td29yZENvdW50LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi13b3JkLWNvdW50XCIgKm5nSWY9XCJvcHRpb25zLk1heFdvcmRDb3VudD4wJiZJc1Nob3dXb3JkQ291bnRcIj57e1dvcmRDb3VudH19L3t7b3B0aW9ucy5NYXhXb3JkQ291bnR9fSBXb3JkczwvZGl2PlxyXG4gICAgPCEtLSBDaGFyc0xpbWl0TXNnLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1jaGFyYWN0ZXItY291bnRcIiAqbmdJZj1cInNob3dDaGFyc0xpbWl0TXNnXCIgW25nQ2xhc3NdPVwieydiYWRnZS1saWdodC13YXJuaW5nJzogY2hhcnNMaW1pdE1zZ0NsYXNzID09PSAnd2FybmluZycsICdiYWRnZS1saWdodC1kYW5nZXInIDogY2hhcnNMaW1pdE1zZ0NsYXNzID09PSAnZGFuZ2VyJyB9XCI+XHJcbiAgICAgIHt7bWF4TGltaXRXYXJuaW5nTXNnfX1cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBMYWJlbERlc2NyaXB0aW9uLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1jb250cm9sLWRlc2NcIiAqbmdJZj1cIm9wdGlvbnMuTGFiZWxEZXNjcmlwdGlvbiE9bnVsbFwiPnt7b3B0aW9ucy5MYWJlbERlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgIDwhLS0gcmVxdWlyZWRUZXh0LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCIgW2Rpcl09XCJ0ZXh0RGlyXCJcclxuICAgICAgICAgKm5nSWY9XCIoVGV4dEFyZWFGb3JtQ29udHJvbC5pbnZhbGlkICYmIFRleHRBcmVhRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oVGV4dEFyZWFGb3JtQ29udHJvbC5lcnJvcnN8a2V5dmFsdWUpfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCIoZ3JvdXAudmFsaWQmJmdyb3VwLmRpcnR5JiZncm91cC50b3VjaGVkICl8fChncm91cC51bnRvdWNoZWQmJmdyb3VwLmludmFsaWQmJmdyb3VwLmRpcnR5KSBcIj57e3Jlc2V0RXJyb3IoKX19PC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|