carbon-components-angular
Version:
Next generation components
323 lines (317 loc) • 26.5 kB
JavaScript
import { Component, Input, HostBinding, TemplateRef, ViewChild, ContentChild } from "@angular/core";
import { PasswordInput } from "./password.directive";
import { BaseIconButton } from "carbon-components-angular/button";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "carbon-components-angular/icon";
import * as i3 from "carbon-components-angular/tooltip";
/**
* Get started with importing the module:
*
* ```typescript
* import { InputModule } from 'carbon-components-angular';
* ```
*
* ```html
* <cds-password-label>
* Label
* <input cdsPassword>
* </cds-password-label>
* ```
*
* [See demo](../../?path=/story/components-input--basic)
*/
/**
* Represents the Password Input Label Component.
*/
export class PasswordInputLabelComponent extends BaseIconButton {
/**
* Constructor for PasswordInputLabelComponent.
* @param changeDetectorRef - Reference to ChangeDetectorRef.
*/
constructor(changeDetectorRef) {
super();
this.changeDetectorRef = changeDetectorRef;
/**
* ID for the input item associated with the label.
*/
this.labelInputID = "cds-password-input-" + PasswordInputLabelComponent.labelCounter++;
/**
* Type for input field, either password or text.
*/
this.inputType = "password";
/**
* Flag for checking if password is visible.
*/
this.passwordIsVisible = false;
/**
* Flag for disabled label.
*/
this.disabled = false;
/**
* Flag for loading (skeleton) label.
*/
this.skeleton = false;
/**
* Flag for an invalid label component.
*/
this.invalid = false;
/**
* Flag for showing a warning.
*/
this.warn = false;
/**
* Tooltip text for hiding password.
*/
this.hidePasswordLabel = "Hide password";
/**
* Tooltip text for showing password.
*/
this.showPasswordLabel = "Show password";
/**
* Binding for applying class to host element.
*/
this.labelClass = true;
this.passwordInputWrapper = true;
this.textInputWrapper = true;
}
/**
* Lifecycle hook called after the view has been initialized to set the ID of the input element
*/
ngAfterViewInit() {
if (this.wrapper) {
const inputElement = this.wrapper.nativeElement.querySelector("input");
if (inputElement) {
if (inputElement.id) {
this.labelInputID = inputElement.id;
this.changeDetectorRef.detectChanges();
}
inputElement.setAttribute("id", this.labelInputID);
return;
}
}
}
/**
* Function to check if a value is a TemplateRef.
* @param value - Value to check.
* @returns Whether the value is a TemplateRef.
*/
isTemplate(value) {
return value instanceof TemplateRef;
}
/**
* Handler for toggling password visibility.
*/
handleTogglePasswordVisibility() {
this.inputType = this.inputType === "password" ? "text" : "password";
this.textInput.type = this.inputType;
this.passwordIsVisible = this.inputType === "text";
}
}
/**
* Counter for generating unique labelInputID.
*/
PasswordInputLabelComponent.labelCounter = 0;
PasswordInputLabelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PasswordInputLabelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
PasswordInputLabelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PasswordInputLabelComponent, selector: "cds-password-label, ibm-password-label", inputs: { labelInputID: "labelInputID", disabled: "disabled", skeleton: "skeleton", labelTemplate: "labelTemplate", passwordInputTemplate: "passwordInputTemplate", helperText: "helperText", invalidText: "invalidText", invalid: "invalid", warn: "warn", warnText: "warnText", ariaLabel: "ariaLabel", hidePasswordLabel: "hidePasswordLabel", showPasswordLabel: "showPasswordLabel" }, host: { properties: { "class.cds--form-item": "this.labelClass", "class.cds--password-input-wrapper": "this.passwordInputWrapper", "class.cds--text-input-wrapper": "this.textInputWrapper" } }, queries: [{ propertyName: "textInput", first: true, predicate: PasswordInput, descendants: true }], viewQueries: [{ propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
<label
[for]="labelInputID"
[attr.aria-label]="ariaLabel"
class="cds--label"
[ngClass]="{
'cds--label--disabled': disabled,
'cds--skeleton': skeleton
}">
<ng-template *ngIf="labelTemplate; else labelContent" [ngTemplateOutlet]="labelTemplate"></ng-template>
<ng-template #labelContent>
<ng-content></ng-content>
</ng-template>
</label>
<div class="cds--text-input__field-outer-wrapper">
<div
class="cds--text-input__field-wrapper"
[ngClass]="{
'cds--text-input__field-wrapper--warning': warn
}"
[attr.data-invalid]="invalid ? true : null"
#wrapper>
<svg
*ngIf="!warn && invalid"
cdsIcon="warning--filled"
size="16"
class="cds--text-input__invalid-icon">
</svg>
<svg
*ngIf="!invalid && warn"
cdsIcon="warning--alt--filled"
size="16"
class="cds--text-input__invalid-icon cds--text-input__invalid-icon--warning">
</svg>
<ng-content select="[cdsPassword], [ibmPassword]"></ng-content>
<cds-tooltip
*ngIf="!skeleton"
[description]="passwordIsVisible ? hidePasswordLabel : showPasswordLabel"
[disabled]="disabled"
[caret]="caret"
[dropShadow]="dropShadow"
[highContrast]="highContrast"
[isOpen]="isOpen"
[align]="align"
[autoAlign]="autoAlign"
[enterDelayMs]="enterDelayMs"
[leaveDelayMs]="leaveDelayMs"
class="cds--toggle-password-tooltip">
<div class="cds--tooltip-trigger__wrapper">
<button
class="cds--text-input--password__visibility__toggle cds--btn cds--tooltip__trigger cds--tooltip--a11y"
[disabled]="disabled"
type="button"
(click)="handleTogglePasswordVisibility($event)">
<svg *ngIf="passwordIsVisible" cdsIcon="view--off" class="cds--icon-visibility-off" size="16"></svg>
<svg *ngIf="!passwordIsVisible" cdsIcon="view" class="cds--icon-visibility-on" size="16"></svg>
</button>
</div>
</cds-tooltip>
</div>
<div
*ngIf="!skeleton && helperText && !invalid && !warn"
class="cds--form__helper-text"
[ngClass]="{ 'cds--form__helper-text--disabled': disabled }">
<ng-container *ngIf="!isTemplate(helperText)">{{ helperText }}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
<div *ngIf="!warn && invalid" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
<div *ngIf="!invalid && warn" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{ warnText }}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i3.Tooltip, selector: "cds-tooltip, ibm-tooltip", inputs: ["id", "enterDelayMs", "leaveDelayMs", "disabled", "description", "templateContext"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PasswordInputLabelComponent, decorators: [{
type: Component,
args: [{
selector: "cds-password-label, ibm-password-label",
template: `
<label
[for]="labelInputID"
[attr.aria-label]="ariaLabel"
class="cds--label"
[ngClass]="{
'cds--label--disabled': disabled,
'cds--skeleton': skeleton
}">
<ng-template *ngIf="labelTemplate; else labelContent" [ngTemplateOutlet]="labelTemplate"></ng-template>
<ng-template #labelContent>
<ng-content></ng-content>
</ng-template>
</label>
<div class="cds--text-input__field-outer-wrapper">
<div
class="cds--text-input__field-wrapper"
[ngClass]="{
'cds--text-input__field-wrapper--warning': warn
}"
[attr.data-invalid]="invalid ? true : null"
#wrapper>
<svg
*ngIf="!warn && invalid"
cdsIcon="warning--filled"
size="16"
class="cds--text-input__invalid-icon">
</svg>
<svg
*ngIf="!invalid && warn"
cdsIcon="warning--alt--filled"
size="16"
class="cds--text-input__invalid-icon cds--text-input__invalid-icon--warning">
</svg>
<ng-content select="[cdsPassword], [ibmPassword]"></ng-content>
<cds-tooltip
*ngIf="!skeleton"
[description]="passwordIsVisible ? hidePasswordLabel : showPasswordLabel"
[disabled]="disabled"
[caret]="caret"
[dropShadow]="dropShadow"
[highContrast]="highContrast"
[isOpen]="isOpen"
[align]="align"
[autoAlign]="autoAlign"
[enterDelayMs]="enterDelayMs"
[leaveDelayMs]="leaveDelayMs"
class="cds--toggle-password-tooltip">
<div class="cds--tooltip-trigger__wrapper">
<button
class="cds--text-input--password__visibility__toggle cds--btn cds--tooltip__trigger cds--tooltip--a11y"
[disabled]="disabled"
type="button"
(click)="handleTogglePasswordVisibility($event)">
<svg *ngIf="passwordIsVisible" cdsIcon="view--off" class="cds--icon-visibility-off" size="16"></svg>
<svg *ngIf="!passwordIsVisible" cdsIcon="view" class="cds--icon-visibility-on" size="16"></svg>
</button>
</div>
</cds-tooltip>
</div>
<div
*ngIf="!skeleton && helperText && !invalid && !warn"
class="cds--form__helper-text"
[ngClass]="{ 'cds--form__helper-text--disabled': disabled }">
<ng-container *ngIf="!isTemplate(helperText)">{{ helperText }}</ng-container>
<ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template>
</div>
<div *ngIf="!warn && invalid" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container>
<ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template>
</div>
<div *ngIf="!invalid && warn" class="cds--form-requirement">
<ng-container *ngIf="!isTemplate(warnText)">{{ warnText }}</ng-container>
<ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template>
</div>
</div>
`
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { textInput: [{
type: ContentChild,
args: [PasswordInput]
}], labelInputID: [{
type: Input
}], disabled: [{
type: Input
}], skeleton: [{
type: Input
}], labelTemplate: [{
type: Input
}], passwordInputTemplate: [{
type: Input
}], helperText: [{
type: Input
}], invalidText: [{
type: Input
}], invalid: [{
type: Input
}], warn: [{
type: Input
}], warnText: [{
type: Input
}], ariaLabel: [{
type: Input
}], hidePasswordLabel: [{
type: Input
}], showPasswordLabel: [{
type: Input
}], wrapper: [{
type: ViewChild,
args: ["wrapper"]
}], labelClass: [{
type: HostBinding,
args: ["class.cds--form-item"]
}], passwordInputWrapper: [{
type: HostBinding,
args: ["class.cds--password-input-wrapper"]
}], textInputWrapper: [{
type: HostBinding,
args: ["class.cds--text-input-wrapper"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtaW5wdXQtbGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lucHV0L3Bhc3N3b3JkLWlucHV0LWxhYmVsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFHTCxXQUFXLEVBQ1gsV0FBVyxFQUNYLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7QUFFbEU7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBb0ZIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDJCQUE0QixTQUFRLGNBQWM7SUErRjlEOzs7T0FHRztJQUNILFlBQXNCLGlCQUFvQztRQUN6RCxLQUFLLEVBQUUsQ0FBQztRQURhLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUEzRjFEOztXQUVHO1FBQ00saUJBQVksR0FBRyxxQkFBcUIsR0FBRywyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUzRjs7V0FFRztRQUNILGNBQVMsR0FBd0IsVUFBVSxDQUFDO1FBRTVDOztVQUVFO1FBQ0Ysc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFzQjFCOztXQUVHO1FBQ00sWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV6Qjs7V0FFRztRQUNNLFNBQUksR0FBRyxLQUFLLENBQUM7UUFZdEI7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFFN0M7O1dBRUc7UUFDTSxzQkFBaUIsR0FBRyxlQUFlLENBQUM7UUFPN0M7O1dBRUc7UUFDa0MsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNMLHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUNoQyxxQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFRdEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixNQUFNLFlBQVksR0FDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELElBQUksWUFBWSxFQUFFO2dCQUNqQixJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUN2QztnQkFDRCxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ25ELE9BQU87YUFDUDtTQUNEO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxVQUFVLENBQUMsS0FBSztRQUN0QixPQUFPLEtBQUssWUFBWSxXQUFXLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksOEJBQThCO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDO0lBQ3BELENBQUM7O0FBeElEOztHQUVHO0FBQ0ksd0NBQVksR0FBRyxDQUFDLENBQUM7d0hBSlosMkJBQTJCOzRHQUEzQiwyQkFBMkIsa3JCQU16QixhQUFhLDJLQTFGakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0ErRU47MkZBS1EsMkJBQTJCO2tCQXRGdkMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsd0NBQXdDO29CQUNsRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0ErRU47aUJBQ0o7d0dBVTZCLFNBQVM7c0JBQXJDLFlBQVk7dUJBQUMsYUFBYTtnQkFLbEIsWUFBWTtzQkFBcEIsS0FBSztnQkFlRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFLRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBS2dCLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFLaUIsVUFBVTtzQkFBOUMsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBQ2Usb0JBQW9CO3NCQUFyRSxXQUFXO3VCQUFDLG1DQUFtQztnQkFDRixnQkFBZ0I7c0JBQTdELFdBQVc7dUJBQUMsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0QWZ0ZXJWaWV3SW5pdCxcblx0RWxlbWVudFJlZixcblx0SG9zdEJpbmRpbmcsXG5cdFRlbXBsYXRlUmVmLFxuXHRWaWV3Q2hpbGQsXG5cdENoYW5nZURldGVjdG9yUmVmLFxuXHRDb250ZW50Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFBhc3N3b3JkSW5wdXQgfSBmcm9tIFwiLi9wYXNzd29yZC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IEJhc2VJY29uQnV0dG9uIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvYnV0dG9uXCI7XG5cbi8qKlxuICogR2V0IHN0YXJ0ZWQgd2l0aCBpbXBvcnRpbmcgdGhlIG1vZHVsZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBJbnB1dE1vZHVsZSB9IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuICogYGBgXG4gKlxuICogYGBgaHRtbFxuICogPGNkcy1wYXNzd29yZC1sYWJlbD5cbiAqIFx0TGFiZWxcbiAqXHQ8aW5wdXQgY2RzUGFzc3dvcmQ+XG4gKiA8L2Nkcy1wYXNzd29yZC1sYWJlbD5cbiAqIGBgYFxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtaW5wdXQtLWJhc2ljKVxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLXBhc3N3b3JkLWxhYmVsLCBpYm0tcGFzc3dvcmQtbGFiZWxcIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8bGFiZWxcblx0XHRcdFtmb3JdPVwibGFiZWxJbnB1dElEXCJcblx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcblx0XHRcdGNsYXNzPVwiY2RzLS1sYWJlbFwiXG5cdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdCdjZHMtLWxhYmVsLS1kaXNhYmxlZCc6IGRpc2FibGVkLFxuXHRcdFx0XHQnY2RzLS1za2VsZXRvbic6IHNrZWxldG9uXG5cdFx0XHR9XCI+XG5cdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJsYWJlbFRlbXBsYXRlOyBlbHNlIGxhYmVsQ29udGVudFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuXHRcdFx0PG5nLXRlbXBsYXRlICNsYWJlbENvbnRlbnQ+XG5cdFx0XHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9sYWJlbD5cblxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLW91dGVyLXdyYXBwZXJcIj5cblx0XHRcdDxkaXZcblx0XHRcdGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCJcblx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0J2Nkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlci0td2FybmluZyc6IHdhcm5cblx0XHRcdH1cIlxuXHRcdFx0W2F0dHIuZGF0YS1pbnZhbGlkXT1cImludmFsaWQgPyB0cnVlIDogbnVsbFwiXG5cdFx0XHQjd3JhcHBlcj5cblx0XHRcdFx0PHN2Z1xuXHRcdFx0XHRcdCpuZ0lmPVwiIXdhcm4gJiYgaW52YWxpZFwiXG5cdFx0XHRcdFx0Y2RzSWNvbj1cIndhcm5pbmctLWZpbGxlZFwiXG5cdFx0XHRcdFx0c2l6ZT1cIjE2XCJcblx0XHRcdFx0XHRjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9faW52YWxpZC1pY29uXCI+XG5cdFx0XHRcdDwvc3ZnPlxuXHRcdFx0XHQ8c3ZnXG5cdFx0XHRcdFx0Km5nSWY9XCIhaW52YWxpZCAmJiB3YXJuXCJcblx0XHRcdFx0XHRjZHNJY29uPVwid2FybmluZy0tYWx0LS1maWxsZWRcIlxuXHRcdFx0XHRcdHNpemU9XCIxNlwiXG5cdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ludmFsaWQtaWNvbiBjZHMtLXRleHQtaW5wdXRfX2ludmFsaWQtaWNvbi0td2FybmluZ1wiPlxuXHRcdFx0XHQ8L3N2Zz5cblx0XHRcdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Nkc1Bhc3N3b3JkXSwgW2libVBhc3N3b3JkXVwiPjwvbmctY29udGVudD5cblx0XHRcdFx0PGNkcy10b29sdGlwXG5cdFx0XHRcdFx0Km5nSWY9XCIhc2tlbGV0b25cIlxuXHRcdFx0XHRcdFtkZXNjcmlwdGlvbl09XCJwYXNzd29yZElzVmlzaWJsZSA/IGhpZGVQYXNzd29yZExhYmVsIDogc2hvd1Bhc3N3b3JkTGFiZWxcIlxuXHRcdFx0XHRcdFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG5cdFx0XHRcdFx0W2NhcmV0XT1cImNhcmV0XCJcblx0XHRcdFx0XHRbZHJvcFNoYWRvd109XCJkcm9wU2hhZG93XCJcblx0XHRcdFx0XHRbaGlnaENvbnRyYXN0XT1cImhpZ2hDb250cmFzdFwiXG5cdFx0XHRcdFx0W2lzT3Blbl09XCJpc09wZW5cIlxuXHRcdFx0XHRcdFthbGlnbl09XCJhbGlnblwiXG5cdFx0XHRcdFx0W2F1dG9BbGlnbl09XCJhdXRvQWxpZ25cIlxuXHRcdFx0XHRcdFtlbnRlckRlbGF5TXNdPVwiZW50ZXJEZWxheU1zXCJcblx0XHRcdFx0XHRbbGVhdmVEZWxheU1zXT1cImxlYXZlRGVsYXlNc1wiXG5cdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLXRvZ2dsZS1wYXNzd29yZC10b29sdGlwXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS10b29sdGlwLXRyaWdnZXJfX3dyYXBwZXJcIj5cblx0XHRcdFx0XHRcdFx0PGJ1dHRvblxuXHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0LS1wYXNzd29yZF9fdmlzaWJpbGl0eV9fdG9nZ2xlIGNkcy0tYnRuIGNkcy0tdG9vbHRpcF9fdHJpZ2dlciBjZHMtLXRvb2x0aXAtLWExMXlcIlxuXHRcdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG5cdFx0XHRcdFx0XHRcdFx0dHlwZT1cImJ1dHRvblwiXG5cdFx0XHRcdFx0XHRcdFx0KGNsaWNrKT1cImhhbmRsZVRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgkZXZlbnQpXCI+XG5cdFx0XHRcdFx0XHRcdFx0PHN2ZyAqbmdJZj1cInBhc3N3b3JkSXNWaXNpYmxlXCIgY2RzSWNvbj1cInZpZXctLW9mZlwiIGNsYXNzPVwiY2RzLS1pY29uLXZpc2liaWxpdHktb2ZmXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG5cdFx0XHRcdFx0XHRcdFx0PHN2ZyAqbmdJZj1cIiFwYXNzd29yZElzVmlzaWJsZVwiIGNkc0ljb249XCJ2aWV3XCIgY2xhc3M9XCJjZHMtLWljb24tdmlzaWJpbGl0eS1vblwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuXHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Nkcy10b29sdGlwPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2XG5cdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmIGhlbHBlclRleHQgJiYgIWludmFsaWQgJiYgIXdhcm5cIlxuXHRcdFx0XHRjbGFzcz1cImNkcy0tZm9ybV9faGVscGVyLXRleHRcIlxuXHRcdFx0XHRbbmdDbGFzc109XCJ7ICdjZHMtLWZvcm1fX2hlbHBlci10ZXh0LS1kaXNhYmxlZCc6IGRpc2FibGVkIH1cIj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3sgaGVscGVyVGV4dCB9fTwvbmctY29udGFpbmVyPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiAqbmdJZj1cIiF3YXJuICYmIGludmFsaWRcIiBjbGFzcz1cImNkcy0tZm9ybS1yZXF1aXJlbWVudFwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCI+e3sgaW52YWxpZFRleHQgfX08L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnZhbGlkVGV4dFwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiAqbmdJZj1cIiFpbnZhbGlkICYmIHdhcm5cIiBjbGFzcz1cImNkcy0tZm9ybS1yZXF1aXJlbWVudFwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUod2FyblRleHQpXCI+e3sgd2FyblRleHQgfX08L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZSh3YXJuVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ3YXJuVGV4dFwiPjwvbmctdGVtcGxhdGU+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cbiAgICBgXG59KVxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBQYXNzd29yZCBJbnB1dCBMYWJlbCBDb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXNzd29yZElucHV0TGFiZWxDb21wb25lbnQgZXh0ZW5kcyBCYXNlSWNvbkJ1dHRvbiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXHQvKipcblx0ICogQ291bnRlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgbGFiZWxJbnB1dElELlxuXHQgKi9cblx0c3RhdGljIGxhYmVsQ291bnRlciA9IDA7XG5cblx0QENvbnRlbnRDaGlsZChQYXNzd29yZElucHV0KSB0ZXh0SW5wdXQ6IFBhc3N3b3JkSW5wdXQ7XG5cblx0LyoqXG5cdCAqIElEIGZvciB0aGUgaW5wdXQgaXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVsLlxuXHQgKi9cblx0QElucHV0KCkgbGFiZWxJbnB1dElEID0gXCJjZHMtcGFzc3dvcmQtaW5wdXQtXCIgKyBQYXNzd29yZElucHV0TGFiZWxDb21wb25lbnQubGFiZWxDb3VudGVyKys7XG5cblx0LyoqXG5cdCAqIFR5cGUgZm9yIGlucHV0IGZpZWxkLCBlaXRoZXIgcGFzc3dvcmQgb3IgdGV4dC5cblx0ICovXG5cdGlucHV0VHlwZTogXCJwYXNzd29yZFwiIHwgXCJ0ZXh0XCIgPSBcInBhc3N3b3JkXCI7XG5cblx0LyoqXG5cdCogRmxhZyBmb3IgY2hlY2tpbmcgaWYgcGFzc3dvcmQgaXMgdmlzaWJsZS5cblx0Ki9cblx0cGFzc3dvcmRJc1Zpc2libGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogRmxhZyBmb3IgZGlzYWJsZWQgbGFiZWwuXG5cdCAqL1xuXHRASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBGbGFnIGZvciBsb2FkaW5nIChza2VsZXRvbikgbGFiZWwuXG5cdCAqL1xuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBUZW1wbGF0ZSBmb3IgbGFiZWwgY29udGVudC5cblx0ICovXG5cdEBJbnB1dCgpIGxhYmVsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIFRlbXBsYXRlIGZvciBwYXNzd29yZCBpbnB1dC5cblx0ICovXG5cdEBJbnB1dCgpIHBhc3N3b3JkSW5wdXRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuXHQvKipcblx0ICogT3B0aW9uYWwgaGVscGVyIHRleHQgdW5kZXIgdGhlIGxhYmVsLlxuXHQgKi9cblx0QElucHV0KCkgaGVscGVyVGV4dDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcblxuXHQvKipcblx0ICogU2V0cyB0aGUgaW52YWxpZCB0ZXh0LlxuXHQgKi9cblx0QElucHV0KCkgaW52YWxpZFRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIEZsYWcgZm9yIGFuIGludmFsaWQgbGFiZWwgY29tcG9uZW50LlxuXHQgKi9cblx0QElucHV0KCkgaW52YWxpZCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBGbGFnIGZvciBzaG93aW5nIGEgd2FybmluZy5cblx0ICovXG5cdEBJbnB1dCgpIHdhcm4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogV2FybmluZyB0ZXh0LlxuXHQgKi9cblx0QElucHV0KCkgd2FyblRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIEFyaWEgbGFiZWwgZm9yIGxhYmVsLlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRvb2x0aXAgdGV4dCBmb3IgaGlkaW5nIHBhc3N3b3JkLlxuXHQgKi9cblx0QElucHV0KCkgaGlkZVBhc3N3b3JkTGFiZWwgPSBcIkhpZGUgcGFzc3dvcmRcIjtcblxuXHQvKipcblx0ICogVG9vbHRpcCB0ZXh0IGZvciBzaG93aW5nIHBhc3N3b3JkLlxuXHQgKi9cblx0QElucHV0KCkgc2hvd1Bhc3N3b3JkTGFiZWwgPSBcIlNob3cgcGFzc3dvcmRcIjtcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSB3cmFwcGVyIGVsZW1lbnQuXG5cdCAqL1xuXHRAVmlld0NoaWxkKFwid3JhcHBlclwiKSB3cmFwcGVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuXHQvKipcblx0ICogQmluZGluZyBmb3IgYXBwbHlpbmcgY2xhc3MgdG8gaG9zdCBlbGVtZW50LlxuXHQgKi9cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1mb3JtLWl0ZW1cIikgbGFiZWxDbGFzcyA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tcGFzc3dvcmQtaW5wdXQtd3JhcHBlclwiKSBwYXNzd29yZElucHV0V3JhcHBlciA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGV4dC1pbnB1dC13cmFwcGVyXCIpIHRleHRJbnB1dFdyYXBwZXIgPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3RvciBmb3IgUGFzc3dvcmRJbnB1dExhYmVsQ29tcG9uZW50LlxuXHQgKiBAcGFyYW0gY2hhbmdlRGV0ZWN0b3JSZWYgLSBSZWZlcmVuY2UgdG8gQ2hhbmdlRGV0ZWN0b3JSZWYuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMaWZlY3ljbGUgaG9vayBjYWxsZWQgYWZ0ZXIgdGhlIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgdG8gc2V0IHRoZSBJRCBvZiB0aGUgaW5wdXQgZWxlbWVudFxuXHQgKi9cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdGlmICh0aGlzLndyYXBwZXIpIHtcblx0XHRcdGNvbnN0IGlucHV0RWxlbWVudCA9XG5cdFx0XHRcdHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKTtcblx0XHRcdGlmIChpbnB1dEVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKGlucHV0RWxlbWVudC5pZCkge1xuXHRcdFx0XHRcdHRoaXMubGFiZWxJbnB1dElEID0gaW5wdXRFbGVtZW50LmlkO1xuXHRcdFx0XHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlucHV0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmxhYmVsSW5wdXRJRCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVmLlxuXHQgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVjay5cblx0ICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBUZW1wbGF0ZVJlZi5cblx0ICovXG5cdHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG5cdFx0cmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlciBmb3IgdG9nZ2xpbmcgcGFzc3dvcmQgdmlzaWJpbGl0eS5cblx0ICovXG5cdHB1YmxpYyBoYW5kbGVUb2dnbGVQYXNzd29yZFZpc2liaWxpdHkoKSB7XG5cdFx0dGhpcy5pbnB1dFR5cGUgPSB0aGlzLmlucHV0VHlwZSA9PT0gXCJwYXNzd29yZFwiID8gXCJ0ZXh0XCIgOiBcInBhc3N3b3JkXCI7XG5cdFx0dGhpcy50ZXh0SW5wdXQudHlwZSA9IHRoaXMuaW5wdXRUeXBlO1xuXHRcdHRoaXMucGFzc3dvcmRJc1Zpc2libGUgPSB0aGlzLmlucHV0VHlwZSA9PT0gXCJ0ZXh0XCI7XG5cdH1cbn1cbiJdfQ==