cloud-ide-element 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,453 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output, forwardRef } from '@angular/core';
3
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../utils/pipes/capitalize/capitalize.pipe";
7
+ import * as i2 from "../../utils/services/elements/elements.service";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@angular/forms";
10
+ export class CideInputComponent {
11
+ constructor(capitalizePipe, elementService) {
12
+ this.capitalizePipe = capitalizePipe;
13
+ this.elementService = elementService;
14
+ /*=======Set custom controls inputs to set components=========*/
15
+ /**
16
+ * @description to se the visual of control like solid control offerd by material design or outline with a border
17
+ * @options solid | outline | standard
18
+ */
19
+ this.fill = 'outline';
20
+ /** @description Lable of control (Title), Like Name, Email */
21
+ this.label = "";
22
+ /** @description to hide and show label */
23
+ this.labelHide = false;
24
+ /** @description is control Editable or Disabled */
25
+ this.disabled = false;
26
+ /** @description Is Clear Input Cross button is visible or not */
27
+ this.clearInput = false;
28
+ /** @description Position of Label 'floating' | 'fixed' */
29
+ this.labelPlacement = "fixed";
30
+ /** @description Lable direction from start of contrl or end of control */
31
+ this.labelDir = "start";
32
+ /** @description Place holder for control to display if there is no value */
33
+ this.placeholder = "";
34
+ /** @description it is to set leading icon, at the start of control */
35
+ this.leadingIcon = "";
36
+ /** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon */
37
+ this.trailingIcon = "";
38
+ /** @description to display below the control for suggestion, if there is any error then error will bw the first to shoe in place of help text */
39
+ this.helperText = "";
40
+ /** @description default true to collapse when there is no help text or error text, if false then element area in DOM will be reserved never detroy */
41
+ this.helperTextCollapse = true;
42
+ /** @description show and hide helper text its forecfull */
43
+ this.hideHelperAndErrorText = false;
44
+ /** @description if found any error in control the error thext will be used to display error message, if there is help text still error text is having higher priority then helptext */
45
+ this.errorText = "";
46
+ /** @description maxlength for control */
47
+ this.maxlength = 0;
48
+ /** @description minlength for control */
49
+ this.minlength = 0;
50
+ /** @description is control is required or not input type is true | false */
51
+ this.required = false;
52
+ /** @description Auto capatalization for the value and applicable to word or to complete sentance */
53
+ this.autocapitalize = "off";
54
+ /** @description auto complete type to help reader what is the type of value */
55
+ this.autocomplete = "off";
56
+ /** @description type of control */
57
+ this.type = '';
58
+ /** @description width of control, default width is 100% */
59
+ this.width = '100%';
60
+ /** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */
61
+ this.id = '';
62
+ /** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */
63
+ this.ngModel = '';
64
+ this.option = ["anksuh", "bhure"];
65
+ /**
66
+ * @description
67
+ * Holds the size of the component like Small, Extra small, Large
68
+ * by Default it takes small size
69
+ * or the size set by the project setup service
70
+ * or it will beset for individual component
71
+ *
72
+ * Size Appled
73
+ * Component level then setup service then finally default md
74
+ * Options: "2xs" | ""xs" | "sm" | "md" | "lg" | "xl" | "xxl"
75
+ */
76
+ this.size = "sm";
77
+ /** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */
78
+ this.ngModelChange = new EventEmitter();
79
+ /*
80
+ internal Properties for input
81
+ */
82
+ /** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */
83
+ this.isNgModel = this.ngModel ? true : false;
84
+ /** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular */
85
+ this.isValid = true;
86
+ /** @description when control is touched then the will maid true by the us to check it is touched or not, when we will set this true we will call the onTouched callback method of angualr to inform angular that somthis is changed and control is touched */
87
+ this.isTouched = false;
88
+ /** @description we will take type of control in type but is may be not exactly which input's type so we need to get type and set actule type to our input, also when type is set password but in calse view in textt then inuut type need to change to text */
89
+ this.typeInternal = "text";
90
+ /** @description if traling is set the it is assigned by it, but some case tarling icon not as it is set need tro be changed at runtime, like password visibility hide and show */
91
+ this.trailingIconInternal = "";
92
+ /*
93
+ Properties connected with trailingIconInternal
94
+ */
95
+ this.isTrailingIconAllwedClick = false;
96
+ // Properties connected with id
97
+ this.idRandom = this.randomString();
98
+ // ==================================METHODS FOR CUSTOM FORM COMPONENT=============================
99
+ // FOR ANGULAR CALLED BY UI
100
+ /**
101
+ * @description Function to call when the HTML Chnage to tell Angular somthing is changed.
102
+ * @field value : inputType
103
+ */
104
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
105
+ this.onChange = (value) => { };
106
+ /** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */
107
+ this.onTouched = () => { };
108
+ /** @description Function to call when the input is need to Validate to tell Angular somthing is changed (in case of some input dipendent validation). */
109
+ this.onValidate = () => { };
110
+ // Validate control
111
+ this.onValidate();
112
+ }
113
+ /**
114
+ * @description
115
+ * Method that performs synchronous validation against the provided control.
116
+ * Exicuted by Angular
117
+ *
118
+ * @param control The control to validate against.
119
+ *
120
+ * @returns A map of validation errors if validation fails,
121
+ * otherwise null.
122
+ */
123
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
124
+ validate(control) {
125
+ const validation_error = this.isControlValid(this.ngModel);
126
+ if (validation_error?.status) {
127
+ return validation_error;
128
+ }
129
+ else {
130
+ return null;
131
+ }
132
+ }
133
+ /**
134
+ * @description
135
+ * Registers a callback function to call when the validator inputs change.
136
+ * Exicuted by Angular
137
+ *
138
+ * @param fn The callback function
139
+ */
140
+ registerOnValidatorChange(fn) {
141
+ this.onValidate = fn;
142
+ }
143
+ /** @description when form control change from model side this method is implemented */
144
+ writeValue(value) {
145
+ if (!this.isNgModel) {
146
+ this.ngModel = this.autoCapitalizeByOption(value, this.type);
147
+ this.ngModelChange?.emit(value);
148
+ }
149
+ }
150
+ /** @description Allows Angular to register a function to call when the model changes. */
151
+ // Save the function as a property to call later here.
152
+ registerOnChange(fn) {
153
+ this.onChange = fn;
154
+ }
155
+ /** @description Allows Angular to register a function to call when the input has been touched. */
156
+ // Save the function as a property to call later here.
157
+ registerOnTouched(fn) {
158
+ this.onTouched = fn;
159
+ }
160
+ //==========================================================================
161
+ /*
162
+ Methods for input
163
+ */
164
+ /** @description Detect wether input propertires canged or not */
165
+ ngOnChanges(changes) {
166
+ if (changes?.['value']) {
167
+ this.isNgModel = true;
168
+ this.ngModel = this.processValue(this.ngModel, this.type);
169
+ }
170
+ if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {
171
+ this.isControlValid(this.ngModel);
172
+ }
173
+ // Ditect type change
174
+ if (changes?.['type']) {
175
+ this.detectTypeChange();
176
+ }
177
+ }
178
+ ngOnInit() {
179
+ if (this.id) {
180
+ this.getControlData();
181
+ }
182
+ }
183
+ /** @description custom method run when HTML changes, we call method registerd by angular to detect change */
184
+ upDateValue(value) {
185
+ const target = value.target;
186
+ this.isControlValid(target?.value);
187
+ const updatedValue = this.processValue(target?.value, this.type);
188
+ this.ngModel = updatedValue;
189
+ // console.log(target)
190
+ this.onChange(updatedValue);
191
+ }
192
+ /**
193
+ * @description method applicable in case of control type checkbox
194
+ *
195
+ * @param value boolean | string
196
+ */
197
+ updateValueCheckBox(value) {
198
+ // Convert string to boolean
199
+ this.ngModel = !this.ngModel;
200
+ value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);
201
+ this.ngModelChange?.emit(value);
202
+ this.onChange(value);
203
+ }
204
+ /** @description clear the value */
205
+ ClearInputValue() {
206
+ if (this.type == "text") {
207
+ this.upDateValue({ target: { value: "" } });
208
+ }
209
+ }
210
+ /** @description when HTML is focuesd */
211
+ focusControl() {
212
+ this.isTouched = true;
213
+ this.onTouched();
214
+ this.onValidate();
215
+ }
216
+ /** @description If control value need to be processed, like UPPERCASE */
217
+ processValue(value, type) {
218
+ value = this.autoCapitalizeByOption(value, type);
219
+ return value;
220
+ }
221
+ /** @description for capitalization */
222
+ autoCapitalizeByOption(value, type) {
223
+ if (type == 'text') {
224
+ if (this.autocapitalize == "on") {
225
+ return this.capitalizePipe?.transform(value, 'allUpperCase');
226
+ }
227
+ if (this.autocapitalize == "words") {
228
+ return this.capitalizePipe?.transform(value, 'titleCase');
229
+ }
230
+ if (this.autocapitalize == "sentences") {
231
+ return this.capitalizePipe?.transform(value, "sentenceCase");
232
+ }
233
+ }
234
+ return value;
235
+ }
236
+ /** @description It is used to return the value is valid or not */
237
+ isValidValueAndType(value, type) {
238
+ if (type == 'text') {
239
+ if (typeof (value) == 'string') {
240
+ if (value?.length > 0) {
241
+ return true;
242
+ }
243
+ else {
244
+ return false;
245
+ }
246
+ }
247
+ else {
248
+ return false;
249
+ }
250
+ }
251
+ else {
252
+ return false;
253
+ }
254
+ }
255
+ /** @description to check control is valid or not */
256
+ isControlValid(value) {
257
+ const validation_status = {
258
+ validation: {},
259
+ status: false
260
+ };
261
+ if (this.required) {
262
+ if (!value) {
263
+ validation_status.status = true;
264
+ validation_status.validation.required = `required!`;
265
+ }
266
+ }
267
+ if (this.type == 'text') {
268
+ if (typeof (value) == 'string') {
269
+ if (this.maxlength > 0) {
270
+ if (value?.length > this.maxlength) {
271
+ validation_status.status = true;
272
+ validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;
273
+ }
274
+ }
275
+ if (this.minlength > 0) {
276
+ if (value?.length < this.minlength) {
277
+ validation_status.status = true;
278
+ validation_status.validation.minlength = `minimum length is ${this.minlength}!`;
279
+ }
280
+ }
281
+ }
282
+ else {
283
+ validation_status.status = true;
284
+ validation_status.validation.required = `required!`;
285
+ }
286
+ }
287
+ this.isValid = !validation_status.status;
288
+ this.errorText = Object.values(validation_status.validation).at(0) || '';
289
+ return validation_status;
290
+ }
291
+ /** @description Allows Angular to disable the input. */
292
+ setDisabledState(isDisabled) {
293
+ this.disabled = isDisabled;
294
+ }
295
+ /** @description Method for trailing Icon Click */
296
+ trailingIconClick() {
297
+ if (this.type === 'password') {
298
+ if (this.typeInternal === 'password') {
299
+ this.typeInternal = 'text';
300
+ this.trailingIconInternal = 'visibility';
301
+ }
302
+ else {
303
+ this.typeInternal = 'password';
304
+ this.trailingIconInternal = 'visibility_off';
305
+ }
306
+ }
307
+ }
308
+ /**
309
+ * Method to generate Random String
310
+ * @param setupPrarameter { lenght: number, prefix: string }
311
+ * default lenght is 10, prefox is ""
312
+ * @returns string
313
+ */
314
+ randomString(setupPrarameter = { lenght: 10, prefix: "" }) {
315
+ //variable consisting alphabets in small and capital letter
316
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
317
+ //loop to select a new character in each iteration
318
+ let random_string = setupPrarameter?.prefix || "";
319
+ for (let i = 0; i < setupPrarameter?.lenght; i++) {
320
+ const rnum = Math.floor(Math.random() * characters.length);
321
+ random_string += characters.substring(rnum, rnum + 1);
322
+ }
323
+ //return the generated string
324
+ return random_string;
325
+ }
326
+ async getControlData() {
327
+ const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });
328
+ if (cide_element_data) {
329
+ this.label = cide_element_data?.sype_label;
330
+ this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating');
331
+ this.type = (cide_element_data?.sype_type || 'text');
332
+ this.required = (cide_element_data?.sype_required || false);
333
+ this.size = (cide_element_data?.sype_size || 'md');
334
+ this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false);
335
+ this.maxlength = (cide_element_data?.sype_max_length);
336
+ this.minlength = (cide_element_data?.sype_min_length);
337
+ this.leadingIcon = (cide_element_data?.sype_leading_icon);
338
+ this.labelHide = (cide_element_data?.sype_label_hide);
339
+ this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text);
340
+ this.detectTypeChange();
341
+ // Validate control
342
+ this.onValidate();
343
+ }
344
+ }
345
+ /**
346
+ * @description use to detact the change in type if changes done this method is ued to run
347
+ */
348
+ detectTypeChange() {
349
+ if (this.type === 'password') {
350
+ this.typeInternal = "password";
351
+ this.trailingIconInternal = "visibility_off";
352
+ this.isTrailingIconAllwedClick = true;
353
+ }
354
+ else {
355
+ this.typeInternal = "text";
356
+ this.trailingIconInternal = this.trailingIcon;
357
+ }
358
+ }
359
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideInputComponent, deps: [{ token: i1.CapitalizePipe }, { token: i2.CideElementsService }], target: i0.ɵɵFactoryTarget.Component }); }
360
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideInputComponent, isStandalone: true, selector: "cide-ele-input", inputs: { fill: "fill", label: "label", labelHide: "labelHide", disabled: "disabled", clearInput: "clearInput", labelPlacement: "labelPlacement", labelDir: "labelDir", placeholder: "placeholder", leadingIcon: "leadingIcon", trailingIcon: "trailingIcon", helperText: "helperText", helperTextCollapse: "helperTextCollapse", hideHelperAndErrorText: "hideHelperAndErrorText", errorText: "errorText", maxlength: "maxlength", minlength: "minlength", required: "required", autocapitalize: "autocapitalize", autocomplete: "autocomplete", type: "type", width: "width", id: "id", ngModel: "ngModel", option: "option", size: "size" }, outputs: { ngModelChange: "ngModelChange" }, providers: [
361
+ {
362
+ provide: NG_VALUE_ACCESSOR,
363
+ useExisting: forwardRef(() => CideInputComponent),
364
+ multi: true
365
+ },
366
+ /** @description to apply validations */
367
+ {
368
+ provide: NG_VALIDATORS,
369
+ multi: true,
370
+ useExisting: forwardRef(() => CideInputComponent),
371
+ },
372
+ CapitalizePipe
373
+ ], usesOnChanges: true, ngImport: i0, template: "<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'password'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".cide-element-style-standard .cide-input-input{border-color:transparent}.cide-element-input-wrapper{position:relative}.cide-input-label{color:var(--cide-input-label-color);-webkit-user-select:none;user-select:none;display:block}.cide-input-help-error-text{color:var(--cide-input-color-help-error-text);width:100%;display:block;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:.125rem;padding-right:.125rem}.cide-input-leading-icon{color:var(--cide-input-leading-icon-color)}.cide-input-clear{color:var(--cide-input-clear-color);z-index:10;cursor:pointer;position:absolute;outline-width:0px;right:0;top:0}.cide-input-clear:hover{color:var(--cide-input-clear-color-hover)}.cide-input-trailing-icon{color:var(--cide-input-trailing-icon-color)}.cide-input-input{color:var(--cide-input-text-color);border-color:var(--cide-input-border)}.cide-input-input:hover{color:var(--cide-input-text-color-hover);border-color:var(--cide-input-border-hover)}.cide-input-input:focus{color:var(--cide-input-text-color-active);border-color:var(--cide-input-border-active)}.cide-element-input-label-floating .cide-input-label{position:absolute;z-index:1;margin-left:8px;margin-right:8px;background-color:#fff;padding:0 2px}.cide-element-input-label-floating .cide-element-input-label-start{left:0}.cide-element-input-label-floating .cide-element-input-label-start{right:0}.cide-element-input-label-fixed{margin-bottom:0}.cide-element-input-label-fixed .cide-element-input-label-start{text-align:start}.cide-element-input-label-fixed .cide-element-input-label-end{text-align:end}.ng-touched.ng-invalid>.cide-input .cide-input-clear{color:var(--cide-input-clear-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-clear:hover{color:var(--cide-input-clear-color-hover-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-leading-icon{color:var(--cide-input-leading-icon-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-help-error-text{color:var(--cide-input-color-help-error-text-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-trailing-icon{color:var(--cide-input-trailing-icon-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-label{color:var(--cide-input-label-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-input{color:var(--cide-input-text-color-invalid);border-color:var(--cide-input-border-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-input:hover{color:var(--cide-input-text-color-hover-invalid);border-color:var(--cide-input-border-hover-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-input:focus{color:var(--cide-input-text-color-active-invalid);border-color:var(--cide-input-border-active-invalid)}.cide-element-size-xxs .cide-input-input{height:var(--cide-element-size-xxs);font-size:var(--cide-input-size-xxs);border-width:var(--cide-input-border-size-xxs)}.cide-element-size-xxs .cide-input-label{font-size:var(--cide-input-label-size-xxs);line-height:var(--cide-input-label-size-xxs)}.cide-element-size-xxs .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-xxs);height:calc(var(--cide-input-error-helper-size-xxs) + 2px);line-height:var(--cide-input-error-helper-size-xxs)}.cide-element-size-xxs .cide-input-clear{top:var(--cide-input-border-size-xxs);width:var(--cide-element-size-xxs);height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-xxs) + var(--cide-input-size-xxs) / 2);line-height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-xxs);width:var(--cide-element-size-xxs);height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-xxs) + var(--cide-input-size-xxs) / 2);line-height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-xxs) / 2)}.cide-element-size-xxs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-xxs) / 2 - var(--cide-input-label-size-xxs))}.cide-element-size-xxs.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs))}.cide-element-size-xxs.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs))}.cide-element-size-xxs.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-xxs)}.cide-element-size-xs .cide-input-input{height:var(--cide-element-size-xs);font-size:var(--cide-input-size-xs);border-width:var(--cide-input-border-size-xs)}.cide-element-size-xs .cide-input-label{font-size:var(--cide-input-label-size-xs);line-height:var(--cide-input-label-size-xs)}.cide-element-size-xs .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-xs);height:calc(var(--cide-input-error-helper-size-xs) + 2px);line-height:var(--cide-input-error-helper-size-xs)}.cide-element-size-xs .cide-input-clear{top:var(--cide-input-border-size-xs);width:var(--cide-element-size-xs);height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-xs) + var(--cide-input-size-xs) / 2);line-height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-xs);width:var(--cide-element-size-xs);height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-xs) + var(--cide-input-size-xs) / 2);line-height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-xs) / 2)}.cide-element-size-xs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-xs) / 2 - var(--cide-input-label-size-xs))}.cide-element-size-xs.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs))}.cide-element-size-xs.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs))}.cide-element-size-xs.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-xs)}.cide-element-size-sm .cide-input-input{height:var(--cide-element-size-sm);font-size:var(--cide-input-size-sm);border-width:var(--cide-input-border-size-sm)}.cide-element-size-sm .cide-input-label{font-size:var(--cide-input-label-size-sm);line-height:var(--cide-input-label-size-sm)}.cide-element-size-sm .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-sm);height:calc(var(--cide-input-error-helper-size-sm) + 2px);line-height:var(--cide-input-error-helper-size-sm)}.cide-element-size-sm .cide-input-clear{top:var(--cide-input-border-size-sm);width:var(--cide-element-size-sm);height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-sm) + var(--cide-input-size-sm) / 2);line-height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-sm);width:var(--cide-element-size-sm);height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-sm) + var(--cide-input-size-sm) / 2);line-height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-sm) / 2)}.cide-element-size-sm.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-sm) / 2 - var(--cide-input-label-size-sm))}.cide-element-size-sm.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm))}.cide-element-size-sm.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm))}.cide-element-size-sm.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-sm)}.cide-element-size-md .cide-input-input{height:var(--cide-element-size-md);font-size:var(--cide-input-size-md);border-width:var(--cide-input-border-size-md)}.cide-element-size-md .cide-input-label{font-size:var(--cide-input-label-size-md);line-height:var(--cide-input-label-size-md)}.cide-element-size-md .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-md);height:calc(var(--cide-input-error-helper-size-md) + 2px);line-height:var(--cide-input-error-helper-size-md)}.cide-element-size-md .cide-input-clear{top:var(--cide-input-border-size-md);width:var(--cide-element-size-md);height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-md) + var(--cide-input-size-md) / 2);line-height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-md);width:var(--cide-element-size-md);height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-md) + var(--cide-input-size-md) / 2);line-height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-md) / 2)}.cide-element-size-md.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-md) / 2 - var(--cide-input-label-size-md))}.cide-element-size-md.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md))}.cide-element-size-md.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md))}.cide-element-size-md.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-md)}.cide-element-size-lg .cide-input-input{height:var(--cide-element-size-lg);font-size:var(--cide-input-size-lg);border-width:var(--cide-input-border-size-lg)}.cide-element-size-lg .cide-input-label{font-size:var(--cide-input-label-size-lg);line-height:var(--cide-input-label-size-lg)}.cide-element-size-lg .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-lg);height:calc(var(--cide-input-error-helper-size-lg) + 2px);line-height:var(--cide-input-error-helper-size-lg)}.cide-element-size-lg .cide-input-clear{top:var(--cide-input-border-size-lg);width:var(--cide-element-size-lg);height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-lg) + var(--cide-input-size-lg) / 2);line-height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-lg);width:var(--cide-element-size-lg);height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-lg) + var(--cide-input-size-lg) / 2);line-height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-lg) / 2)}.cide-element-size-lg.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-lg) / 2 - var(--cide-input-label-size-lg))}.cide-element-size-lg.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg))}.cide-element-size-lg.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg))}.cide-element-size-lg.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-lg)}.cide-element-size-xl .cide-input-input{height:var(--cide-element-size-xl);font-size:var(--cide-input-size-xl);border-width:var(--cide-input-border-size-xl)}.cide-element-size-xl .cide-input-label{font-size:var(--cide-input-label-size-xl);line-height:var(--cide-input-label-size-xl)}.cide-element-size-xl .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-xl);height:calc(var(--cide-input-error-helper-size-xl) + 2px);line-height:var(--cide-input-error-helper-size-xl)}.cide-element-size-xl .cide-input-clear{top:var(--cide-input-border-size-xl);width:var(--cide-element-size-xl);height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-xl) + var(--cide-input-size-xl) / 2);line-height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-xl);width:var(--cide-element-size-xl);height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-xl) + var(--cide-input-size-xl) / 2);line-height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-xl) / 2)}.cide-element-size-xl.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-xl) / 2 - var(--cide-input-label-size-xl))}.cide-element-size-xl.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl))}.cide-element-size-xl.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl))}.cide-element-size-xl.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-xl)}.cide-input-leading-icon-wrapper{position:absolute;bottom:0;left:0;z-index:-10;text-align:center}\n"], dependencies: [{ kind: "ngmodule", type:
374
+ // directives
375
+ CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type:
376
+ // for ngModel
377
+ FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
378
+ }
379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideInputComponent, decorators: [{
380
+ type: Component,
381
+ args: [{ selector: 'cide-ele-input', standalone: true, imports: [
382
+ // directives
383
+ CommonModule,
384
+ // for ngModel
385
+ FormsModule
386
+ ], providers: [
387
+ {
388
+ provide: NG_VALUE_ACCESSOR,
389
+ useExisting: forwardRef(() => CideInputComponent),
390
+ multi: true
391
+ },
392
+ /** @description to apply validations */
393
+ {
394
+ provide: NG_VALIDATORS,
395
+ multi: true,
396
+ useExisting: forwardRef(() => CideInputComponent),
397
+ },
398
+ CapitalizePipe
399
+ ], template: "<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'password'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".cide-element-style-standard .cide-input-input{border-color:transparent}.cide-element-input-wrapper{position:relative}.cide-input-label{color:var(--cide-input-label-color);-webkit-user-select:none;user-select:none;display:block}.cide-input-help-error-text{color:var(--cide-input-color-help-error-text);width:100%;display:block;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:.125rem;padding-right:.125rem}.cide-input-leading-icon{color:var(--cide-input-leading-icon-color)}.cide-input-clear{color:var(--cide-input-clear-color);z-index:10;cursor:pointer;position:absolute;outline-width:0px;right:0;top:0}.cide-input-clear:hover{color:var(--cide-input-clear-color-hover)}.cide-input-trailing-icon{color:var(--cide-input-trailing-icon-color)}.cide-input-input{color:var(--cide-input-text-color);border-color:var(--cide-input-border)}.cide-input-input:hover{color:var(--cide-input-text-color-hover);border-color:var(--cide-input-border-hover)}.cide-input-input:focus{color:var(--cide-input-text-color-active);border-color:var(--cide-input-border-active)}.cide-element-input-label-floating .cide-input-label{position:absolute;z-index:1;margin-left:8px;margin-right:8px;background-color:#fff;padding:0 2px}.cide-element-input-label-floating .cide-element-input-label-start{left:0}.cide-element-input-label-floating .cide-element-input-label-start{right:0}.cide-element-input-label-fixed{margin-bottom:0}.cide-element-input-label-fixed .cide-element-input-label-start{text-align:start}.cide-element-input-label-fixed .cide-element-input-label-end{text-align:end}.ng-touched.ng-invalid>.cide-input .cide-input-clear{color:var(--cide-input-clear-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-clear:hover{color:var(--cide-input-clear-color-hover-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-leading-icon{color:var(--cide-input-leading-icon-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-help-error-text{color:var(--cide-input-color-help-error-text-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-trailing-icon{color:var(--cide-input-trailing-icon-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-label{color:var(--cide-input-label-color-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-input{color:var(--cide-input-text-color-invalid);border-color:var(--cide-input-border-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-input:hover{color:var(--cide-input-text-color-hover-invalid);border-color:var(--cide-input-border-hover-invalid)}.ng-touched.ng-invalid>.cide-input .cide-input-input:focus{color:var(--cide-input-text-color-active-invalid);border-color:var(--cide-input-border-active-invalid)}.cide-element-size-xxs .cide-input-input{height:var(--cide-element-size-xxs);font-size:var(--cide-input-size-xxs);border-width:var(--cide-input-border-size-xxs)}.cide-element-size-xxs .cide-input-label{font-size:var(--cide-input-label-size-xxs);line-height:var(--cide-input-label-size-xxs)}.cide-element-size-xxs .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-xxs);height:calc(var(--cide-input-error-helper-size-xxs) + 2px);line-height:var(--cide-input-error-helper-size-xxs)}.cide-element-size-xxs .cide-input-clear{top:var(--cide-input-border-size-xxs);width:var(--cide-element-size-xxs);height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-xxs) + var(--cide-input-size-xxs) / 2);line-height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-xxs);width:var(--cide-element-size-xxs);height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-xxs) + var(--cide-input-size-xxs) / 2);line-height:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs) * 2)}.cide-element-size-xxs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-xxs) / 2)}.cide-element-size-xxs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-xxs) / 2 - var(--cide-input-label-size-xxs))}.cide-element-size-xxs.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs))}.cide-element-size-xxs.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-xxs) - var(--cide-input-border-size-xxs))}.cide-element-size-xxs.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-xxs)}.cide-element-size-xs .cide-input-input{height:var(--cide-element-size-xs);font-size:var(--cide-input-size-xs);border-width:var(--cide-input-border-size-xs)}.cide-element-size-xs .cide-input-label{font-size:var(--cide-input-label-size-xs);line-height:var(--cide-input-label-size-xs)}.cide-element-size-xs .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-xs);height:calc(var(--cide-input-error-helper-size-xs) + 2px);line-height:var(--cide-input-error-helper-size-xs)}.cide-element-size-xs .cide-input-clear{top:var(--cide-input-border-size-xs);width:var(--cide-element-size-xs);height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-xs) + var(--cide-input-size-xs) / 2);line-height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-xs);width:var(--cide-element-size-xs);height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-xs) + var(--cide-input-size-xs) / 2);line-height:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs) * 2)}.cide-element-size-xs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-xs) / 2)}.cide-element-size-xs.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-xs) / 2 - var(--cide-input-label-size-xs))}.cide-element-size-xs.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs))}.cide-element-size-xs.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-xs) - var(--cide-input-border-size-xs))}.cide-element-size-xs.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-xs)}.cide-element-size-sm .cide-input-input{height:var(--cide-element-size-sm);font-size:var(--cide-input-size-sm);border-width:var(--cide-input-border-size-sm)}.cide-element-size-sm .cide-input-label{font-size:var(--cide-input-label-size-sm);line-height:var(--cide-input-label-size-sm)}.cide-element-size-sm .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-sm);height:calc(var(--cide-input-error-helper-size-sm) + 2px);line-height:var(--cide-input-error-helper-size-sm)}.cide-element-size-sm .cide-input-clear{top:var(--cide-input-border-size-sm);width:var(--cide-element-size-sm);height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-sm) + var(--cide-input-size-sm) / 2);line-height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-sm);width:var(--cide-element-size-sm);height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-sm) + var(--cide-input-size-sm) / 2);line-height:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm) * 2)}.cide-element-size-sm.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-sm) / 2)}.cide-element-size-sm.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-sm) / 2 - var(--cide-input-label-size-sm))}.cide-element-size-sm.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm))}.cide-element-size-sm.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-sm) - var(--cide-input-border-size-sm))}.cide-element-size-sm.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-sm)}.cide-element-size-md .cide-input-input{height:var(--cide-element-size-md);font-size:var(--cide-input-size-md);border-width:var(--cide-input-border-size-md)}.cide-element-size-md .cide-input-label{font-size:var(--cide-input-label-size-md);line-height:var(--cide-input-label-size-md)}.cide-element-size-md .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-md);height:calc(var(--cide-input-error-helper-size-md) + 2px);line-height:var(--cide-input-error-helper-size-md)}.cide-element-size-md .cide-input-clear{top:var(--cide-input-border-size-md);width:var(--cide-element-size-md);height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-md) + var(--cide-input-size-md) / 2);line-height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-md);width:var(--cide-element-size-md);height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-md) + var(--cide-input-size-md) / 2);line-height:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md) * 2)}.cide-element-size-md.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-md) / 2)}.cide-element-size-md.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-md) / 2 - var(--cide-input-label-size-md))}.cide-element-size-md.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md))}.cide-element-size-md.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-md) - var(--cide-input-border-size-md))}.cide-element-size-md.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-md)}.cide-element-size-lg .cide-input-input{height:var(--cide-element-size-lg);font-size:var(--cide-input-size-lg);border-width:var(--cide-input-border-size-lg)}.cide-element-size-lg .cide-input-label{font-size:var(--cide-input-label-size-lg);line-height:var(--cide-input-label-size-lg)}.cide-element-size-lg .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-lg);height:calc(var(--cide-input-error-helper-size-lg) + 2px);line-height:var(--cide-input-error-helper-size-lg)}.cide-element-size-lg .cide-input-clear{top:var(--cide-input-border-size-lg);width:var(--cide-element-size-lg);height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-lg) + var(--cide-input-size-lg) / 2);line-height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-lg);width:var(--cide-element-size-lg);height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-lg) + var(--cide-input-size-lg) / 2);line-height:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg) * 2)}.cide-element-size-lg.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-lg) / 2)}.cide-element-size-lg.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-lg) / 2 - var(--cide-input-label-size-lg))}.cide-element-size-lg.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg))}.cide-element-size-lg.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-lg) - var(--cide-input-border-size-lg))}.cide-element-size-lg.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-lg)}.cide-element-size-xl .cide-input-input{height:var(--cide-element-size-xl);font-size:var(--cide-input-size-xl);border-width:var(--cide-input-border-size-xl)}.cide-element-size-xl .cide-input-label{font-size:var(--cide-input-label-size-xl);line-height:var(--cide-input-label-size-xl)}.cide-element-size-xl .cide-input-help-error-text{font-size:var(--cide-input-error-helper-size-xl);height:calc(var(--cide-input-error-helper-size-xl) + 2px);line-height:var(--cide-input-error-helper-size-xl)}.cide-element-size-xl .cide-input-clear{top:var(--cide-input-border-size-xl);width:var(--cide-element-size-xl);height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl .cide-input-clear .cide-input-clear-icon{font-size:calc(var(--cide-input-size-xl) + var(--cide-input-size-xl) / 2);line-height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl .cide-input-leading-icon-wrapper{top:var(--cide-input-border-size-xl);width:var(--cide-element-size-xl);height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl .cide-input-leading-icon-wrapper .cide-input-leading-icon{font-size:calc(var(--cide-input-size-xl) + var(--cide-input-size-xl) / 2);line-height:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl) * 2)}.cide-element-size-xl.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-element-input-wrapper{margin-top:calc(var(--cide-input-label-size-xl) / 2)}.cide-element-size-xl.cide-element-input-label-floating:not(.cide-element-input-label-less) .cide-input-label{top:calc(var(--cide-input-label-size-xl) / 2 - var(--cide-input-label-size-xl))}.cide-element-size-xl.cide-element-leading-icon .cide-input-input{padding-left:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl))}.cide-element-size-xl.cide-element-clear-input .cide-input-input{padding-right:calc(var(--cide-element-size-xl) - var(--cide-input-border-size-xl))}.cide-element-size-xl.cide-element-trailing-icon .cide-input-clear{right:var(--cide-element-size-xl)}.cide-input-leading-icon-wrapper{position:absolute;bottom:0;left:0;z-index:-10;text-align:center}\n"] }]
400
+ }], ctorParameters: () => [{ type: i1.CapitalizePipe }, { type: i2.CideElementsService }], propDecorators: { fill: [{
401
+ type: Input
402
+ }], label: [{
403
+ type: Input
404
+ }], labelHide: [{
405
+ type: Input
406
+ }], disabled: [{
407
+ type: Input
408
+ }], clearInput: [{
409
+ type: Input
410
+ }], labelPlacement: [{
411
+ type: Input
412
+ }], labelDir: [{
413
+ type: Input
414
+ }], placeholder: [{
415
+ type: Input
416
+ }], leadingIcon: [{
417
+ type: Input
418
+ }], trailingIcon: [{
419
+ type: Input
420
+ }], helperText: [{
421
+ type: Input
422
+ }], helperTextCollapse: [{
423
+ type: Input
424
+ }], hideHelperAndErrorText: [{
425
+ type: Input
426
+ }], errorText: [{
427
+ type: Input
428
+ }], maxlength: [{
429
+ type: Input
430
+ }], minlength: [{
431
+ type: Input
432
+ }], required: [{
433
+ type: Input
434
+ }], autocapitalize: [{
435
+ type: Input
436
+ }], autocomplete: [{
437
+ type: Input
438
+ }], type: [{
439
+ type: Input
440
+ }], width: [{
441
+ type: Input
442
+ }], id: [{
443
+ type: Input
444
+ }], ngModel: [{
445
+ type: Input
446
+ }], option: [{
447
+ type: Input
448
+ }], size: [{
449
+ type: Input
450
+ }], ngModelChange: [{
451
+ type: Output
452
+ }] } });
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWVsZW1lbnQvc3JjL2xpYi9lbGVtZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL2VsZW1lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBeUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBK0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuSixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7OztBQTBDOUUsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QixZQUFtQixjQUE4QixFQUFVLGNBQW1DO1FBQTNFLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFxQjtRQUk5RixnRUFBZ0U7UUFFaEU7OztXQUdHO1FBQ00sU0FBSSxHQUFxQixTQUFTLENBQUM7UUFDNUMsOERBQThEO1FBQ3JELFVBQUssR0FBVyxFQUFFLENBQUM7UUFDNUIsMENBQTBDO1FBQ2pDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDcEMsbURBQW1EO1FBQzFDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDbkMsaUVBQWlFO1FBQ3hELGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDckMsMERBQTBEO1FBQ2pELG1CQUFjLEdBQXVCLE9BQU8sQ0FBQztRQUN0RCwwRUFBMEU7UUFDakUsYUFBUSxHQUFpQixP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LEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLEVBQUU7c0JBQVYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQVlHLElBQUk7c0JBQVosS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDYXBpdGFsaXplUGlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL3BpcGVzL2NhcGl0YWxpemUvY2FwaXRhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgQ2lkZUVsZW1lbnRzU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3NlcnZpY2VzL2VsZW1lbnRzL2VsZW1lbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBhdXRvY2FwaXRhbGl6ZVR5cGUsIGF1dG9jb21wbGV0ZVR5cGUsIGNvbnRyb2xUeXBlLCBlbGVtZW50U3R5bGVUeXBlLCBpbnB1dFR5cGUsIGxhYmVsRGlyVHlwZSwgbGFiZWxQbGFjZW1lbnRUeXBlLCB0aGVtZVNpemUgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcclxuXHJcbi8qKiBAZGVzY3JpcHRpb24gdHlwZSB0byByZWdpc3RlciBlcnJvciByZWxhdGVkIHRvIGNvbnRyb2wgKi9cclxuZXhwb3J0IHR5cGUgRXJyb3JWYWxpZGF0aW9uU3RhdHVzID0ge1xyXG4gIG1heGxlbmd0aD86IHN0cmluZyxcclxuICBtaW5sZW5ndGg/OiBzdHJpbmcsXHJcbiAgcmVxdWlyZWQ/OiBzdHJpbmcsXHJcbn1cclxuZXhwb3J0IHR5cGUgVmFsaWRhdGlvblN0YXR1cyA9IHtcclxuICB2YWxpZGF0aW9uOiBFcnJvclZhbGlkYXRpb25TdGF0dXMsXHJcbiAgc3RhdHVzOiBib29sZWFuXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2lkZS1lbGUtaW5wdXQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIC8vIGRpcmVjdGl2ZXNcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIC8vIGZvciBuZ01vZGVsXHJcbiAgICBGb3Jtc01vZHVsZVxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaWRlSW5wdXRDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfSxcclxuICAgIC8qKiBAZGVzY3JpcHRpb24gdG8gYXBwbHkgdmFsaWRhdGlvbnMgICovXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaWRlSW5wdXRDb21wb25lbnQpLFxyXG4gICAgfSxcclxuICAgIENhcGl0YWxpemVQaXBlXHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIENpZGVJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uQ2hhbmdlcywgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGNhcGl0YWxpemVQaXBlOiBDYXBpdGFsaXplUGlwZSwgcHJpdmF0ZSBlbGVtZW50U2VydmljZTogQ2lkZUVsZW1lbnRzU2VydmljZSkge1xyXG4gICAgLy8gVmFsaWRhdGUgY29udHJvbFxyXG4gICAgdGhpcy5vblZhbGlkYXRlKCk7XHJcbiAgfVxyXG4gIC8qPT09PT09PVNldCBjdXN0b20gY29udHJvbHMgaW5wdXRzIHRvIHNldCBjb21wb25lbnRzPT09PT09PT09Ki9cclxuXHJcbiAgLyoqIFxyXG4gICAqIEBkZXNjcmlwdGlvbiB0byBzZSB0aGUgdmlzdWFsIG9mIGNvbnRyb2wgbGlrZSBzb2xpZCBjb250cm9sIG9mZmVyZCBieSBtYXRlcmlhbCBkZXNpZ24gb3Igb3V0bGluZSB3aXRoIGEgYm9yZGVyXHJcbiAgICogQG9wdGlvbnMgc29saWQgfCBvdXRsaW5lIHwgc3RhbmRhcmRcclxuICAgKi9cclxuICBASW5wdXQoKSBmaWxsOiBlbGVtZW50U3R5bGVUeXBlID0gJ291dGxpbmUnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gTGFibGUgb2YgY29udHJvbCAoVGl0bGUpLCBMaWtlIE5hbWUsIEVtYWlsICovXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB0byBoaWRlIGFuZCBzaG93IGxhYmVsICovXHJcbiAgQElucHV0KCkgbGFiZWxIaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpcyBjb250cm9sIEVkaXRhYmxlIG9yIERpc2FibGVkICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIElzIENsZWFyIElucHV0IENyb3NzIGJ1dHRvbiBpcyB2aXNpYmxlIG9yIG5vdCAqL1xyXG4gIEBJbnB1dCgpIGNsZWFySW5wdXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIFBvc2l0aW9uIG9mIExhYmVsICdmbG9hdGluZycgfCAnZml4ZWQnICovXHJcbiAgQElucHV0KCkgbGFiZWxQbGFjZW1lbnQ6IGxhYmVsUGxhY2VtZW50VHlwZSA9IFwiZml4ZWRcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIExhYmxlIGRpcmVjdGlvbiBmcm9tIHN0YXJ0IG9mIGNvbnRybCBvciBlbmQgb2YgY29udHJvbCAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsRGlyOiBsYWJlbERpclR5cGUgPSBcInN0YXJ0XCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBQbGFjZSBob2xkZXIgZm9yIGNvbnRyb2wgdG8gZGlzcGxheSBpZiB0aGVyZSBpcyBubyB2YWx1ZSAqL1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gaXQgaXMgdG8gc2V0IGxlYWRpbmcgaWNvbiwgYXQgdGhlIHN0YXJ0IG9mIGNvbnRyb2wgICovXHJcbiAgQElucHV0KCkgbGVhZGluZ0ljb246IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpdCBpcyB0byBzZXQgdHJhaWxpbmcgaWNvbiwgYXQgdGhlIGVuZCBvZiBjb250cm9sLCBmb3IgcGFzc3dvcmQgdHlwZSBjb250cm9sIGV5ZSBpcyB0aGUgdHJhaWxpbmcgaWNvbiAgKi9cclxuICBASW5wdXQoKSB0cmFpbGluZ0ljb246IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB0byBkaXNwbGF5IGJlbG93IHRoZSBjb250cm9sIGZvciBzdWdnZXN0aW9uLCBpZiB0aGVyZSBpcyBhbnkgZXJyb3IgdGhlbiBlcnJvciB3aWxsIGJ3IHRoZSBmaXJzdCB0byBzaG9lIGluIHBsYWNlIG9mIGhlbHAgdGV4dCAqL1xyXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBkZWZhdWx0IHRydWUgdG8gY29sbGFwc2Ugd2hlbiB0aGVyZSBpcyBubyBoZWxwIHRleHQgb3IgZXJyb3IgdGV4dCwgaWYgZmFsc2UgdGhlbiBlbGVtZW50IGFyZWEgaW4gRE9NIHdpbGwgYmUgcmVzZXJ2ZWQgbmV2ZXIgZGV0cm95ICAqL1xyXG4gIEBJbnB1dCgpIGhlbHBlclRleHRDb2xsYXBzZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBzaG93IGFuZCBoaWRlIGhlbHBlciB0ZXh0IGl0cyBmb3JlY2Z1bGwgKi9cclxuICBASW5wdXQoKSBoaWRlSGVscGVyQW5kRXJyb3JUZXh0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpZiBmb3VuZCBhbnkgZXJyb3IgaW4gY29udHJvbCB0aGUgZXJyb3IgdGhleHQgd2lsbCBiZSB1c2VkIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZSwgaWYgdGhlcmUgaXMgaGVscCB0ZXh0IHN0aWxsIGVycm9yIHRleHQgaXMgaGF2aW5nIGhpZ2hlciBwcmlvcml0eSB0aGVuIGhlbHB0ZXh0ICovXHJcbiAgQElucHV0KCkgZXJyb3JUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gbWF4bGVuZ3RoIGZvciBjb250cm9sICovXHJcbiAgQElucHV0KCkgbWF4bGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gbWlubGVuZ3RoIGZvciBjb250cm9sICovXHJcbiAgQElucHV0KCkgbWlubGVuZ3RoOiBudW1iZXIgPSAwO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gaXMgY29udHJvbCBpcyByZXF1aXJlZCBvciBub3QgaW5wdXQgdHlwZSBpcyB0cnVlIHwgZmFsc2UgKi9cclxuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gQXV0byBjYXBhdGFsaXphdGlvbiBmb3IgdGhlIHZhbHVlIGFuZCBhcHBsaWNhYmxlIHRvIHdvcmQgb3IgdG8gY29tcGxldGUgc2VudGFuY2UgKi9cclxuICBASW5wdXQoKSBhdXRvY2FwaXRhbGl6ZTogYXV0b2NhcGl0YWxpemVUeXBlID0gXCJvZmZcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIGF1dG8gY29tcGxldGUgdHlwZSB0byBoZWxwIHJlYWRlciB3aGF0IGlzIHRoZSB0eXBlIG9mIHZhbHVlICovXHJcbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlOiBhdXRvY29tcGxldGVUeXBlID0gXCJvZmZcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIHR5cGUgb2YgY29udHJvbCAqL1xyXG4gIEBJbnB1dCgpIHR5cGU6IGNvbnRyb2xUeXBlID0gJyc7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aWR0aCBvZiBjb250cm9sLCBkZWZhdWx0IHdpZHRoIGlzIDEwMCUgKi9cclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdW5pcSBpZCBvZiBjb250cm9sLCB1c2VkIHRvIGRpZmZlcmVuY2lhdCB0aGUgdmFsdWUgYWxzbyBwcmV2ZW50IHZhbHVlIHNob3VsZCBub3QgZWZmZWN0IGFub3RoZXIgdmFsdWVzICovXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdG8gZ2V0IGlucHV0IHZhbHVlIHVzaW5nIG9uZSB3YXkgYmluZGluZyBsaWtlOiBbbmdNb2RlbF0gb3IgYnkgdHdvIHdheSBiaW5kaW5nIFsobmdNb2RlbCldICovXHJcbiAgQElucHV0KCkgbmdNb2RlbDogaW5wdXRUeXBlID0gJyc7XHJcbiAgQElucHV0KCkgb3B0aW9uOiBzdHJpbmdbXSA9IFtcImFua3N1aFwiLCBcImJodXJlXCJdXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogSG9sZHMgdGhlIHNpemUgb2YgdGhlIGNvbXBvbmVudCBsaWtlIFNtYWxsLCBFeHRyYSBzbWFsbCwgTGFyZ2VcclxuICAgKiBieSBEZWZhdWx0IGl0IHRha2VzIHNtYWxsIHNpemVcclxuICAgKiBvciB0aGUgc2l6ZSBzZXQgYnkgdGhlIHByb2plY3Qgc2V0dXAgc2VydmljZVxyXG4gICAqIG9yIGl0IHdpbGwgYmVzZXQgZm9yIGluZGl2aWR1YWwgY29tcG9uZW50XHJcbiAgICogXHJcbiAgICogU2l6ZSBBcHBsZWQgXHJcbiAgICogQ29tcG9uZW50IGxldmVsIHRoZW4gc2V0dXAgc2VydmljZSB0aGVuIGZpbmFsbHkgZGVmYXVsdCBtZFxyXG4gICAqICBPcHRpb25zOiBcIjJ4c1wiIHwgXCJcInhzXCIgfCBcInNtXCIgfCBcIm1kXCIgfCBcImxnXCIgfCBcInhsXCIgfCBcInh4bFwiIFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNpemU6IHRoZW1lU2l6ZSA9IFwic21cIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIHRvIHNldCByZXR1cm4gdmFsdWUgdXNpbmcgb25lIHdheSBiaW5kaW5nIGxpa2U6IChuZ01vZGVsQ2hhbmdlcykgb3IgYnkgdHdvIHdheSBiaW5kaW5nIFsobmdNb2RlbCldICovXHJcbiAgQE91dHB1dCgpIG5nTW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxpbnB1dFR5cGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxpbnB1dFR5cGU+KCk7XHJcblxyXG4gIC8qXHJcbiAgICAgIGludGVybmFsIFByb3BlcnRpZXMgZm9yIGlucHV0XHJcbiAgKi9cclxuICAvKiogQGRlc2NyaXB0aW9uIGlzIHZhbGUgbmVlZCB0byByZWFkIGZyb20gbmdNb2RlbCBvciBmcm9tIHZhbHVlKG5lZWQgdG8gaW1wbGVtZW50KSwgaXQgaXMgZGV0ZWN0ZWQgYW5kIG1haWxkIGZhbHMgb24gdmFsdWUgY2huYWdlcyAqL1xyXG4gIHB1YmxpYyBpc05nTW9kZWw6IGJvb2xlYW4gPSB0aGlzLm5nTW9kZWwgPyB0cnVlIDogZmFsc2U7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIHRvIHNldCBjb250cm9sIHZhbHVlIGlzIHZhbGlkIG9yIG5vdCwgc2V0IGJ5IHVzIGluc2lkZSB2YWxpZGF0ZSBjYWxsYmNrIG1ldGhvZCBjYWxsZWQgYnkgYW5ndWxhciAgKi9cclxuICBwdWJsaWMgaXNWYWxpZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aGVuIGNvbnRyb2wgaXMgdG91Y2hlZCB0aGVuIHRoZSB3aWxsIG1haWQgdHJ1ZSBieSB0aGUgdXMgdG8gY2hlY2sgaXQgaXMgdG91Y2hlZCBvciBub3QsIHdoZW4gd2Ugd2lsbCBzZXQgdGhpcyB0cnVlIHdlIHdpbGwgY2FsbCB0aGUgb25Ub3VjaGVkIGNhbGxiYWNrIG1ldGhvZCBvZiBhbmd1YWxyIHRvIGluZm9ybSBhbmd1bGFyIHRoYXQgc29tdGhpcyBpcyBjaGFuZ2VkIGFuZCBjb250cm9sIGlzIHRvdWNoZWQgKi9cclxuICBwdWJsaWMgaXNUb3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3ZSB3aWxsIHRha2UgdHlwZSBvZiBjb250cm9sIGluIHR5cGUgYnV0IGlzIG1heSBiZSBub3QgZXhhY3RseSB3aGljaCBpbnB1dCdzIHR5cGUgc28gd2UgbmVlZCB0byBnZXQgdHlwZSBhbmQgc2V0IGFjdHVsZSB0eXBlIHRvIG91ciBpbnB1dCwgYWxzbyB3aGVuIHR5cGUgaXMgc2V0IHBhc3N3b3JkIGJ1dCBpbiBjYWxzZSB2aWV3IGluIHRleHR0IHRoZW4gaW51dXQgdHlwZSBuZWVkIHRvIGNoYW5nZSB0byB0ZXh0ICovXHJcbiAgcHVibGljIHR5cGVJbnRlcm5hbDogXCJ0ZXh0XCIgfCBcInBhc3N3b3JkXCIgPSBcInRleHRcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIGlmIHRyYWxpbmcgaXMgc2V0IHRoZSBpdCBpcyBhc3NpZ25lZCBieSBpdCwgYnV0IHNvbWUgY2FzZSB0YXJsaW5nIGljb24gbm90IGFzIGl0IGlzIHNldCBuZWVkIHRybyBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUsIGxpa2UgcGFzc3dvcmQgdmlzaWJpbGl0eSBoaWRlIGFuZCBzaG93ICovXHJcbiAgcHVibGljIHRyYWlsaW5nSWNvbkludGVybmFsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvKiBcclxuICAgICAgUHJvcGVydGllcyBjb25uZWN0ZWQgd2l0aCB0cmFpbGluZ0ljb25JbnRlcm5hbCBcclxuICAqL1xyXG4gIHB1YmxpYyBpc1RyYWlsaW5nSWNvbkFsbHdlZENsaWNrOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIFByb3BlcnRpZXMgY29ubmVjdGVkIHdpdGggaWRcclxuICBwdWJsaWMgaWRSYW5kb206IHN0cmluZyA9IHRoaXMucmFuZG9tU3RyaW5nKCk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1NRVRIT0RTIEZPUiBDVVNUT00gRk9STSBDT01QT05FTlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIC8vIEZPUiBBTkdVTEFSIENBTExFRCBCWSBVSVxyXG5cclxuICAvKiogXHJcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgSFRNTCBDaG5hZ2UgdG8gdGVsbCBBbmd1bGFyIHNvbXRoaW5nIGlzIGNoYW5nZWQuXHJcbiAgICogQGZpZWxkIHZhbHVlIDogaW5wdXRUeXBlXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAodmFsdWU6IGlucHV0VHlwZSkgPT4geyB9O1xyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgaW5wdXQgaXMgdG91Y2hlZCAoY2xjaWtlZCkgdG8gdGVsbCBBbmd1bGFyIHNvbXRoaW5nIGlzIGNoYW5nZWQuICovXHJcbiAgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgaW5wdXQgaXMgbmVlZCB0byBWYWxpZGF0ZSB0byB0ZWxsIEFuZ3VsYXIgc29tdGhpbmcgaXMgY2hhbmdlZCAoaW4gY2FzZSBvZiBzb21lIGlucHV0IGRpcGVuZGVudCB2YWxpZGF0aW9uKS4gKi9cclxuICBvblZhbGlkYXRlID0gKCkgPT4geyB9O1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBNZXRob2QgdGhhdCBwZXJmb3JtcyBzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGFnYWluc3QgdGhlIHByb3ZpZGVkIGNvbnRyb2wuXHJcbiAgICogRXhpY3V0ZWQgYnkgQW5ndWxhclxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gdmFsaWRhdGUgYWdhaW5zdC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIEEgbWFwIG9mIHZhbGlkYXRpb24gZXJyb3JzIGlmIHZhbGlkYXRpb24gZmFpbHMsXHJcbiAgICogb3RoZXJ3aXNlIG51bGwuXHJcbiAgICovXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25fZXJyb3IgPSB0aGlzLmlzQ29udHJvbFZhbGlkKHRoaXMubmdNb2RlbCk7XHJcbiAgICBpZiAodmFsaWRhdGlvbl9lcnJvcj8uc3RhdHVzKSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0aW9uX2Vycm9yO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgdmFsaWRhdG9yIGlucHV0cyBjaGFuZ2UuXHJcbiAgICogRXhpY3V0ZWQgYnkgQW5ndWxhclxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2U/KGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVmFsaWRhdGUgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gd2hlbiBmb3JtIGNvbnRyb2wgY2hhbmdlIGZyb20gbW9kZWwgc2lkZSB0aGlzIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCAgKi9cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBpbnB1dFR5cGUpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc05nTW9kZWwpIHtcclxuICAgICAgdGhpcy5uZ01vZGVsID0gdGhpcy5hdXRvQ2FwaXRhbGl6ZUJ5T3B0aW9uKHZhbHVlLCB0aGlzLnR5cGUpO1xyXG4gICAgICB0aGlzLm5nTW9kZWxDaGFuZ2U/LmVtaXQodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKiogQGRlc2NyaXB0aW9uIEFsbG93cyBBbmd1bGFyIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBtb2RlbCBjaGFuZ2VzLiAqL1xyXG4gIC8vIFNhdmUgdGhlIGZ1bmN0aW9uIGFzIGEgcHJvcGVydHkgdG8gY2FsbCBsYXRlciBoZXJlLlxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogaW5wdXRUeXBlKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIC8qKiBAZGVzY3JpcHRpb24gQWxsb3dzIEFuZ3VsYXIgdG8gcmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGhhcyBiZWVuIHRvdWNoZWQuICovXHJcbiAgLy8gU2F2ZSB0aGUgZnVuY3Rpb24gYXMgYSBwcm9wZXJ0eSB0byBjYWxsIGxhdGVyIGhlcmUuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qXHJcbiAgICBNZXRob2RzIGZvciBpbnB1dFxyXG4qL1xyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIERldGVjdCB3ZXRoZXIgaW5wdXQgcHJvcGVydGlyZXMgY2FuZ2VkIG9yIG5vdCAqL1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzPy5bJ3ZhbHVlJ10pIHtcclxuICAgICAgdGhpcy5pc05nTW9kZWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLm5nTW9kZWwgPSB0aGlzLnByb2Nlc3NWYWx1ZSh0aGlzLm5nTW9kZWwsIHRoaXMudHlwZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkVmFsdWVBbmRUeXBlKHRoaXMubmdNb2RlbCwgdGhpcy50eXBlKSB8fCB0aGlzLmlzVG91Y2hlZCkge1xyXG4gICAgICB0aGlzLmlzQ29udHJvbFZhbGlkKHRoaXMubmdNb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGl0ZWN0IHR5cGUgY2hhbmdlXHJcbiAgICBpZiAoY2hhbmdlcz8uWyd0eXBlJ10pIHtcclxuICAgICAgdGhpcy5kZXRlY3RUeXBlQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlkKSB7XHJcbiAgICAgIHRoaXMuZ2V0Q29udHJvbERhdGEoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gY3VzdG9tIG1ldGhvZCBydW4gd2hlbiBIVE1MIGNoYW5nZXMsIHdlIGNhbGwgbWV0aG9kIHJlZ2lzdGVyZCBieSBhbmd1bGFyIHRvIGRldGVjdCBjaGFuZ2UgKi9cclxuICB1cERhdGVWYWx1ZSh2YWx1ZTogeyB0YXJnZXQ6IHsgdmFsdWU6IGlucHV0VHlwZSB9IH0gfCBFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gdmFsdWUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQgfCB7IHZhbHVlOiBpbnB1dFR5cGUgfTtcclxuICAgIHRoaXMuaXNDb250cm9sVmFsaWQodGFyZ2V0Py52YWx1ZSk7XHJcbiAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSB0aGlzLnByb2Nlc3NWYWx1ZSh0YXJnZXQ/LnZhbHVlLCB0aGlzLnR5cGUpO1xyXG4gICAgdGhpcy5uZ01vZGVsID0gdXBkYXRlZFZhbHVlO1xyXG4gICAgLy8gY29uc29sZS5sb2codGFyZ2V0KVxyXG4gICAgdGhpcy5vbkNoYW5nZSh1cGRhdGVkVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIG1ldGhvZCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgY29udHJvbCB0eXBlIGNoZWNrYm94XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHZhbHVlIGJvb2xlYW4gfCBzdHJpbmdcclxuICAgKi9cclxuICB1cGRhdGVWYWx1ZUNoZWNrQm94KHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XHJcbiAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBib29sZWFuXHJcbiAgICB0aGlzLm5nTW9kZWwgPSAhdGhpcy5uZ01vZGVsO1xyXG4gICAgdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpID8gdmFsdWUgOiAodmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICB0aGlzLm5nTW9kZWxDaGFuZ2U/LmVtaXQodmFsdWUpO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIGNsZWFyIHRoZSB2YWx1ZSAqL1xyXG4gIENsZWFySW5wdXRWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT0gXCJ0ZXh0XCIpIHtcclxuICAgICAgdGhpcy51cERhdGVWYWx1ZSh7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aGVuIEhUTUwgaXMgZm9jdWVzZCAqL1xyXG4gIGZvY3VzQ29udHJvbCgpIHtcclxuICAgIHRoaXMuaXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLm9uVmFsaWRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gSWYgY29udHJvbCB2YWx1ZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCwgbGlrZSBVUFBFUkNBU0UgKi9cclxuICBwcm9jZXNzVmFsdWUodmFsdWU6IGlucHV0VHlwZSwgdHlwZTogY29udHJvbFR5cGUpIHtcclxuICAgIHZhbHVlID0gdGhpcy5hdXRvQ2FwaXRhbGl6ZUJ5T3B0aW9uKHZhbHVlLCB0eXBlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gZm9yIGNhcGl0YWxpemF0aW9uICovXHJcbiAgYXV0b0NhcGl0YWxpemVCeU9wdGlvbih2YWx1ZTogaW5wdXRUeXBlLCB0eXBlOiBjb250cm9sVHlwZSkge1xyXG4gICAgaWYgKHR5cGUgPT0gJ3RleHQnKSB7XHJcbiAgICAgIGlmICh0aGlzLmF1dG9jYXBpdGFsaXplID09IFwib25cIikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcGl0YWxpemVQaXBlPy50cmFuc2Zvcm0odmFsdWUgYXMgc3RyaW5nLCAnYWxsVXBwZXJDYXNlJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuYXV0b2NhcGl0YWxpemUgPT0gXCJ3b3Jkc1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZVBpcGU/LnRyYW5zZm9ybSh2YWx1ZSBhcyBzdHJpbmcsICd0aXRsZUNhc2UnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5hdXRvY2FwaXRhbGl6ZSA9PSBcInNlbnRlbmNlc1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZVBpcGU/LnRyYW5zZm9ybSh2YWx1ZSBhcyBzdHJpbmcsIFwic2VudGVuY2VDYXNlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEl0IGlzIHVzZWQgdG8gcmV0dXJuIHRoZSB2YWx1ZSBpcyB2YWxpZCBvciBub3QgKi9cclxuICBpc1ZhbGlkVmFsdWVBbmRUeXBlKHZhbHVlOiBpbnB1dFR5cGUsIHR5cGU6IGNvbnRyb2xUeXBlKSB7XHJcbiAgICBpZiAodHlwZSA9PSAndGV4dCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gdG8gY2hlY2sgY29udHJvbCBpcyB2YWxpZCBvciBub3QgKi9cclxuICBpc0NvbnRyb2xWYWxpZCh2YWx1ZTogaW5wdXRUeXBlKTogVmFsaWRhdGlvblN0YXR1cyB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uX3N0YXR1czogVmFsaWRhdGlvblN0YXR1cyA9IHtcclxuICAgICAgdmFsaWRhdGlvbjoge30sXHJcbiAgICAgIHN0YXR1czogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdmFsaWRhdGlvbl9zdGF0dXMudmFsaWRhdGlvbi5yZXF1aXJlZCA9IGByZXF1aXJlZCFgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZSA9PSAndGV4dCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWF4bGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGggPiB0aGlzLm1heGxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uX3N0YXR1cy5zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uX3N0YXR1cy52YWxpZGF0aW9uLm1heGxlbmd0aCA9IGBtYXhpbXVtIGxlbmd0aCBpcyAke3RoaXMubWF4bGVuZ3RofSFgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5taW5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWU/Lmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnZhbGlkYXRpb24ubWlubGVuZ3RoID0gYG1pbmltdW0gbGVuZ3RoIGlzICR7dGhpcy5taW5sZW5ndGh9IWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdmFsaWRhdGlvbl9zdGF0dXMudmFsaWRhdGlvbi5yZXF1aXJlZCA9IGByZXF1aXJlZCFgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVmFsaWQgPSAhdmFsaWRhdGlvbl9zdGF0dXMuc3RhdHVzO1xyXG4gICAgdGhpcy5lcnJvclRleHQgPSBPYmplY3QudmFsdWVzKHZhbGlkYXRpb25fc3RhdHVzLnZhbGlkYXRpb24pLmF0KDApIHx8ICcnXHJcbiAgICByZXR1cm4gdmFsaWRhdGlvbl9zdGF0dXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEFsbG93cyBBbmd1bGFyIHRvIGRpc2FibGUgdGhlIGlucHV0LiAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIE1ldGhvZCBmb3IgdHJhaWxpbmcgSWNvbiBDbGljayAqL1xyXG4gIHRyYWlsaW5nSWNvbkNsaWNrKCkge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICBpZiAodGhpcy50eXBlSW50ZXJuYWwgPT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9ICd0ZXh0JztcclxuICAgICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gJ3Zpc2liaWxpdHknO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHlwZUludGVybmFsID0gJ3Bhc3N3b3JkJztcclxuICAgICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gJ3Zpc2liaWxpdHlfb2ZmJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGdlbmVyYXRlIFJhbmRvbSBTdHJpbmdcclxuICAgKiBAcGFyYW0gc2V0dXBQcmFyYW1ldGVyIHsgbGVuZ2h0OiBudW1iZXIsIHByZWZpeDogc3RyaW5nIH1cclxuICAgKiBkZWZhdWx0IGxlbmdodCBpcyAxMCwgcHJlZm94IGlzIFwiXCJcclxuICAgKiBAcmV0dXJucyBzdHJpbmdcclxuICAgKi9cclxuICByYW5kb21TdHJpbmcoc2V0dXBQcmFyYW1ldGVyOiB7IGxlbmdodDogbnVtYmVyLCBwcmVmaXg6IHN0cmluZyB9ID0geyBsZW5naHQ6IDEwLCBwcmVmaXg6IFwiXCIgfSk6IHN0cmluZyB7XHJcbiAgICAvL3ZhcmlhYmxlIGNvbnNpc3RpbmcgYWxwaGFiZXRzIGluIHNtYWxsIGFuZCBjYXBpdGFsIGxldHRlciAgXHJcbiAgICBjb25zdCBjaGFyYWN0ZXJzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hUWmFiY2RlZmdoaWtsbW5vcHFyc3R1dnd4eXpcIjtcclxuICAgIC8vbG9vcCB0byBzZWxlY3QgYSBuZXcgY2hhcmFjdGVyIGluIGVhY2ggaXRlcmF0aW9uICBcclxuICAgIGxldCByYW5kb21fc3RyaW5nID0gc2V0dXBQcmFyYW1ldGVyPy5wcmVmaXggfHwgXCJcIjtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0dXBQcmFyYW1ldGVyPy5sZW5naHQ7IGkrKykge1xyXG4gICAgICBjb25zdCBybnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcmFjdGVycy5sZW5ndGgpO1xyXG4gICAgICByYW5kb21fc3RyaW5nICs9IGNoYXJhY3RlcnMuc3Vic3RyaW5nKHJudW0sIHJudW0gKyAxKTtcclxuICAgIH1cclxuICAgIC8vcmV0dXJuIHRoZSBnZW5lcmF0ZWQgc3RyaW5nICBcclxuICAgIHJldHVybiByYW5kb21fc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0Q29udHJvbERhdGEoKSB7XHJcbiAgICBjb25zdCBjaWRlX2VsZW1lbnRfZGF0YSA9IGF3YWl0IHRoaXMuZWxlbWVudFNlcnZpY2U/LmdldEVsZW1lbnREYXRhKHsgc3lwZV9rZXk6IHRoaXMuaWQgfSk7XHJcbiAgICBpZiAoY2lkZV9lbGVtZW50X2RhdGEpIHtcclxuICAgICAgdGhpcy5sYWJlbCA9IGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2xhYmVsIGFzIHN0cmluZztcclxuICAgICAgdGhpcy5sYWJlbFBsYWNlbWVudCA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9sYWJlbF9wbGFjZW1lbnQgfHwgJ2Zsb2F0aW5nJykgYXMgbGFiZWxQbGFjZW1lbnRUeXBlO1xyXG4gICAgICB0aGlzLnR5cGUgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfdHlwZSB8fCAndGV4dCcpIGFzIGNvbnRyb2xUeXBlO1xyXG4gICAgICB0aGlzLnJlcXVpcmVkID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX3JlcXVpcmVkIHx8IGZhbHNlKSBhcyBib29sZWFuO1xyXG4gICAgICB0aGlzLnNpemUgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfc2l6ZSB8fCAnbWQnKSBhcyB0aGVtZVNpemU7XHJcbiAgICAgIHRoaXMuaGVscGVyVGV4dENvbGxhcHNlID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2hlbHBlcl90ZXh0X2NvbGxhcHNlIHx8IGZhbHNlKSBhcyBib29sZWFuO1xyXG4gICAgICB0aGlzLm1heGxlbmd0aCA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9tYXhfbGVuZ3RoKSBhcyBudW1iZXI7XHJcbiAgICAgIHRoaXMubWlubGVuZ3RoID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX21pbl9sZW5ndGgpIGFzIG51bWJlcjtcclxuICAgICAgdGhpcy5sZWFkaW5nSWNvbiA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9sZWFkaW5nX2ljb24pIGFzIHN0cmluZztcclxuICAgICAgdGhpcy5sYWJlbEhpZGUgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfbGFiZWxfaGlkZSkgYXMgYm9vbGVhbjtcclxuICAgICAgdGhpcy5oaWRlSGVscGVyQW5kRXJyb3JUZXh0ID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2hpZGVfaGVscGVyX2FuZF9lcnJvcl90ZXh0KSBhcyBib29sZWFuO1xyXG4gICAgICB0aGlzLmRldGVjdFR5cGVDaGFuZ2UoKTtcclxuICAgICAgLy8gVmFsaWRhdGUgY29udHJvbFxyXG4gICAgICB0aGlzLm9uVmFsaWRhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiB1c2UgdG8gZGV0YWN0IHRoZSBjaGFuZ2UgaW4gdHlwZSBpZiBjaGFuZ2VzIGRvbmUgdGhpcyBtZXRob2QgaXMgdWVkIHRvIHJ1blxyXG4gICAqL1xyXG4gIGRldGVjdFR5cGVDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy50eXBlID09PSAncGFzc3dvcmQnKSB7XHJcbiAgICAgIHRoaXMudHlwZUludGVybmFsID0gXCJwYXNzd29yZFwiO1xyXG4gICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gXCJ2aXNpYmlsaXR5X29mZlwiO1xyXG4gICAgICB0aGlzLmlzVHJhaWxpbmdJY29uQWxsd2VkQ2xpY2sgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50eXBlSW50ZXJuYWwgPSBcInRleHRcIjtcclxuICAgICAgdGhpcy50cmFpbGluZ0ljb25JbnRlcm5hbCA9IHRoaXMudHJhaWxpbmdJY29uO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2lkZS1pbnB1dFwiPlxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1URVhUIHwgUEFTU1dPUkQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdwYXNzd29yZCdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdy1mdWxsIHR3LXJlbGF0aXZlXCIgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkdGggfVwiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtc2l6ZS14eHMnOiAoc2l6ZSA9PT0gJzJ4cycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLXhzJzogKHNpemUgPT09ICd4cycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLXNtJzogKHNpemUgPT09ICdzbScpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLW1kJzogKHNpemUgPT09ICdtZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLWxnJzogKHNpemUgPT09ICdsZycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1sZWFkaW5nLWljb24nOiBsZWFkaW5nSWNvbixcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtdHJhaWxpbmctaWNvbic6IHRyYWlsaW5nSWNvbkludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1jbGVhci1pbnB1dCc6IGNsZWFySW5wdXQsXHJcbiAgICAgICAgICAgICAgICAnY2lkZS1lbGVtZW50LWlucHV0LWxhYmVsLWZsb2F0aW5nJzogKGxhYmVsUGxhY2VtZW50ID09PSAnZmxvYXRpbmcnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtc3RhcnQnOiAobGFiZWxEaXIgPT09ICdzdGFydCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1lbmQnOiAobGFiZWxEaXIgPT09ICdlbmQnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtZml4ZWQnOiAobGFiZWxQbGFjZW1lbnQgPT09ICdmaXhlZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1sZXNzJzogKCFsYWJlbCB8fCBsYWJlbEhpZGUpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zdHlsZS1vdXRsaW5lJzogKGZpbGwgPT09ICdvdXRsaW5lJyksXHJcbiAgICAgICAgICAgICAgICAnY2lkZS1lbGVtZW50LXN0eWxlLXNvbGlkJzogKGZpbGwgPT09ICdzb2xpZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zdHlsZS1zdGFuZGFyZCc6IChmaWxsID09PSAnc3RhbmRhcmQnKSxcclxuICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICA8IS0tIGxhYmVsIC0tPlxyXG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJpZFwiIGNsYXNzPVwiY2lkZS1pbnB1dC1sYWJlbFwiICpuZ0lmPVwibGFiZWwgJiYgIWxhYmVsSGlkZVwiPnt7bGFiZWx9fTwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICA8IS0tIGFsbCBvbmUgbGluZSBlbGVtZXRzIHdoaWNoIGRvc2Ugbm90IGFmZmVjdCB3aXRoIGxhYmVsIGFuZCBlcnJvciB0ZXh0IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lkZS1lbGVtZW50LWlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gTGVhZGluZyBJY29uIC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaWRlLWlucHV0LWxlYWRpbmctaWNvbi13cmFwcGVyXCIgKm5nSWY9XCJsZWFkaW5nSWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2lkZS1pbnB1dC1sZWFkaW5nLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0dy10ZXh0LWNlbnRlclwiPnt7bGVhZGluZ0ljb259fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRyYWxpbmcgaWNvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgY2lkZS1pbnB1dC10cmFpbGluZy1pY29uIC10dy1ib3R0b20tMSB0dy1zZWxlY3Qtbm9uZSB0dy1yaWdodC0wXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRyYWlsaW5nSWNvbkludGVybmFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHR3LXctOCB0dy10ZXh0LWNlbnRlciAhdHctdGV4dC0yeGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3R3LWN1cnNvci1wb2ludGVyJzogaXNUcmFpbGluZ0ljb25BbGx3ZWRDbGlja31cIiBbYXR0ci50YWJpbmRleF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cmFpbGluZ0ljb25DbGljaygpXCIgKGtleXVwKT1cInRyYWlsaW5nSWNvbkNsaWNrKClcIj57e3RyYWlsaW5nSWNvbkludGVybmFsfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBDbGVhciAtLT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjaWRlLWlucHV0LWNsZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNsZWFySW5wdXQgJiYgbmdNb2RlbFwiIChjbGljayk9XCJDbGVhcklucHV0VmFsdWUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2lkZS1pbnB1dC1jbGVhci1pY29uIG1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5jbG9zZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2lkXT1cImlkXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbKChsYWJlbCAmJiBsYWJlbFBsYWNlbWVudCA9PT0gJ2ZpeGVkJykgPyAndHctcm91bmRlZC1lLW1kIHR3LXJvdW5kZWQtZXMtbWQnIDogJ3R3LXJvdW5kZWQtbWQgJyksICghbGVhZGluZ0ljb24gPyAndHctcGwtMScgOiAnJyksICh0cmFpbGluZ0ljb25JbnRlcm5hbCA/ICd0dy1wci04JzogJycpLCAoIXRyYWlsaW5nSWNvbkludGVybmFsID8gJ3R3LXByLTEnIDogJycpLCAoKHNpemUgPT09ICdtZCcpID8gJ3R3LWgtOCB0dy1wdC0wLjUgdHctcGItMCcgOiAoc2l6ZSA9PT0gJ3NtJyA/ICd0dy1oLTcnIDogJycpKSwgKGxhYmVsSGlkZSA/ICchdHctbXQtMCcgOiAnJyldXCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5nTW9kZWxcIiBbdHlwZV09XCJ0eXBlSW50ZXJuYWxcIiAoaW5wdXQpPVwidXBEYXRlVmFsdWUoJGV2ZW50KVwiIChmb2N1cyk9XCJmb2N1c0NvbnRyb2woKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctbS0wIHR3LXctZnVsbCB0dy1iZy10cmFuc3BhcmVudCB0dy1vdmVyZmxvdy1oaWRkZW4gdHctYm9yZGVyLXNvbGlkIHR3LXAtMCBjaWRlLWlucHV0LWlucHV0IHR3LW91dGxpbmUtbm9uZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIGVycm9yIHRleHQgLyBoZWxwZXIgdGV4dCAtLT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIoZXJyb3JUZXh0IHx8IGhlbHBlclRleHQgfHwgIWhlbHBlclRleHRDb2xsYXBzZSkgJiYgIWhpZGVIZWxwZXJBbmRFcnJvclRleHRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaWRlLWlucHV0LWhlbHAtZXJyb3ItdGV4dFwiPnt7XHJcbiAgICAgICAgICAgICAgICBpc1ZhbGlkXHJcbiAgICAgICAgICAgICAgICA/IGhlbHBlclRleHQgOiAoZXJyb3JUZXh0ID9cclxuICAgICAgICAgICAgICAgIChpc1RvdWNoZWQgPyBlcnJvclRleHQgOiBoZWxwZXJUZXh0KVxyXG4gICAgICAgICAgICAgICAgOiBoZWxwZXJUZXh0KX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbnB1dCB3aXRoIHRyYWxsaW5nIGljb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0dy1pbmxpbmUtYmxvY2sgdHctaC0xMiB0dy13LTY0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZnVsbGgtZnVsbCB0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LXRvcC0xLzMgdHctbXgtMiB0dy1iZy13aGl0ZSB0dy1weC0wLjUgdHctcHktMCB0dy10ZXh0LXNtIHR3LWxlYWRpbmctNCB0dy10ZXh0LWdyYXktNzAwXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LWJvdHRvbS1weCB0dy1yaWdodC0wIC10dy16LTEwIHR3LXRleHQtZ3JheS00MDBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0dy13LTggdHctdGV4dC1jZW50ZXIgIXR3LXRleHQtMnhsXCI+IHBlcnNvbiA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInR3LW0tMCB0dy1oLTggdHctdy1mdWxsIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1yb3VuZGVkLW1kIHR3LWJvcmRlci0yIHR3LWJvcmRlci1zb2xpZCB0dy1ib3JkZXItZ3JheS0zMDAgdHctYmctdHJhbnNwYXJlbnQgdHctcC0wIHR3LXBiLTAuNSB0dy1wbC0xIHR3LXByLTggdHctdGV4dC1zbSB0dy10ZXh0LWdyYXktNjAwIHR3LW91dGxpbmUtbm9uZSBob3Zlcjp0dy1ib3JkZXItYmx1ZS00MDAgZm9jdXM6dHctYm9yZGVyLWJsdWUtNDAwIGZvY3VzOnR3LXRleHQtZ3JheS05NTBcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJBbmt1c2ggQmh1cmVcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDwhLS0gSW5wdXQgd2l0aCBsZWFkaW5nIGljb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0dy1pbmxpbmUtYmxvY2sgdHctaC0xMiB0dy13LTY0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZnVsbGgtZnVsbCB0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LXRvcC0xLzMgdHctbXgtMiB0dy1iZy13aGl0ZSB0dy1weC0wLjUgdHctcHktMCB0dy10ZXh0LXNtIHR3LWxlYWRpbmctNCB0dy10ZXh0LWdyYXktNzAwXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LWJvdHRvbS1weCB0dy1sZWZ0LTAgLXR3LXotMTAgdHctdGV4dC1ncmF5LTQwMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHR3LXctOCB0dy10ZXh0LWNlbnRlciAhdHctdGV4dC0yeGxcIj4gcGVyc29uIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctbS0wIHR3LWgtOCB0dy13LWZ1bGwgdHctb3ZlcmZsb3ctaGlkZGVuIHR3LXJvdW5kZWQtbWQgdHctYm9yZGVyLTIgdHctYm9yZGVyLXNvbGlkIHR3LWJvcmRlci1ncmF5LTMwMCB0dy1iZy10cmFuc3BhcmVudCB0dy1wLTAgdHctcGItMC41IHR3LXBsLTggdHctcHItMSB0dy10ZXh0LXNtIHR3LXRleHQtZ3JheS02MDAgdHctb3V0bGluZS1ub25lIGhvdmVyOnR3LWJvcmRlci1ibHVlLTQwMCBmb2N1czp0dy1ib3JkZXItYmx1ZS00MDAgZm9jdXM6dHctdGV4dC1ncmF5LTk1MFwiXHJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cIkFua3VzaCBCaHVyZVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DSEVDS0JPWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnY2hlY2tib3gnXCIgY2xhc3M9XCJ0dy1mbGV4XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNpZGUtY2hlY2tib3ggdHctcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cIm5nTW9kZWxcIiBbdmFsdWVdPVwibmdNb2RlbFwiIFtpZF09XCJpZFJhbmRvbVwiIFt0eXBlXT1cInR5cGVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1hYnNvbHV0ZSB0dy1sZWZ0LTAgdHctaW52aXNpYmxlXCIgKGNsaWNrKT1cInVwZGF0ZVZhbHVlQ2hlY2tCb3goIW5nTW9kZWwpOyBmb2N1c0NvbnRyb2woKVwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNpZGUtY2hlY2tib3gtbGFiZWwgdHctY3Vyc29yLXBvaW50ZXJcIiBbZm9yXT1cImlkUmFuZG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LWJvcmRlci0yIHR3LWJvcmRlci1zb2xpZCB0dy1yZWxhdGl2ZSB0dy1yb3VuZGVkLW1kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEycHhcIiBoZWlnaHQ9XCIxMHB4XCIgY2xhc3M9XCJ0dy1hYnNvbHV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjc2Rmd2lvcmZrbGFzZmpqYWxmandlcndyXCI+PC91c2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LXRleHQtc20gdHctcGwtMiB0dy1sZWFkaW5nLVsxOHB4XSB0dy1zZWxlY3Qtbm9uZSB0dy1jdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbGFiZWxIaWRlXCI+e3tsYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidHctYWJzb2x1dGUgdHctaC0wIHR3LXctMCB0dy1zZWxlY3Qtbm9uZSB0dy1wb2ludGVyLWV2ZW50cy1ub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEVsZW1lbnQgaGlkZGVuIGFuZCBpdHMgeHBhdGggaXMgdXNlZCB0byBkaXNwbGF5IGluc2lkZSBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8c3ltYm9sIGlkPVwic2Rmd2lvcmZrbGFzZmpqYWxmandlcndyXCIgdmlld2JveD1cIjAgMCAxMiAxMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxLjUgNiA0LjUgOSAxMC41IDFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgPC9zeW1ib2w+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU0VMRUNULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnc2VsZWN0J1wiPnNhc1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctYWJzb2x1dGVcIj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygb3B0aW9uOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy13LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==