UNPKG

@blox/material

Version:

Material Components for Angular

259 lines 29.5 kB
import { Directive, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Output, Renderer2, Self } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { MDCIconButtonToggleFoundation } from '@material/icon-button'; import { asBoolean } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { AbstractMdcIcon } from './abstract.mdc.icon'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** * Directive for an icon button. Icon buttons can be used with a font icon library such as * <a href="https://material.io/tools/icons" target="_blank">Google Material Icons</a>, SVG * elements or images. They provide material styling and a ripple to the icon. Use it on anchor and * button tags. For toggling icon buttons, see `MdcIconToggleDirective`. */ export class MdcIconButtonDirective extends AbstractMdcIcon { constructor(_elm, renderer, registry, doc) { super(_elm, renderer, registry, doc); /** @internal */ this._cls = true; } ngAfterContentInit() { this.initRipple(true); } ngOnDestroy() { this.destroyRipple(); } } MdcIconButtonDirective.decorators = [ { type: Directive, args: [{ selector: 'button[mdcIconButton],a[mdcIconButton]', providers: [ { provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconButtonDirective) }, { provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconButtonDirective) } ] },] } ]; MdcIconButtonDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcIconButtonDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-icon-button',] }] }; /** * Directive for the icon to display on one of the toggle states of an `mdcIconToggle`. See * `MdcIconToggleDirective` for more information. */ export class MdcIconDirective { constructor() { /** @internal */ this._cls = true; /** @internal */ this._on = false; } /** * Set this input to false to remove the ripple effect from the surface. */ get mdcIcon() { return this._on ? 'on' : ''; } set mdcIcon(value) { this._on = value === 'on'; } } MdcIconDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcIcon]' },] } ]; MdcIconDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-icon-button__icon',] }], _on: [{ type: HostBinding, args: ['class.mdc-icon-button__icon--on',] }], mdcIcon: [{ type: Input }] }; /** * Directive for creating a Material Design icon toggle button: a button that toggles state, and * switches the icon based on the value of the toggle. * * When the applied icon font uses CSS pseudo elements, add a child element for the actual icon, * and give that element the <code>mdcIconButtonIcon</code> directive. The icon button will * then update the child element with the correct icon if it is toggled. */ export class MdcIconToggleDirective extends AbstractMdcIcon { constructor(_elm, rndr, registry, doc) { super(_elm, rndr, registry, doc); /** @internal */ this._cls = true; /** * The aria-label to assign to the icon toggle. You can override the value for the * on respectively off state by assigning to property `labelOn` or `labelOff`. */ this.label = null; /** * The aria-label to assign to the icon toggle when it is on. If this input has no value, * the aria-label will default to the value of the `label` input. */ this.labelOn = null; /** * The aria-label to assign to the icon toggle when it is off. If this input has no value, * the aria-label will default to the value of the `label` input. */ this.labelOff = null; /** * Event emitted when the state of the icon toggle changes (for example when a user clicks * the icon). */ this.onChange = new EventEmitter(); this._onChange = () => { }; this._onTouched = () => { }; this._on = false; this._disabled = false; this.toggleAdapter = { addClass: (className) => this._renderer.addClass(this._elm.nativeElement, className), removeClass: (className) => this._renderer.removeClass(this._elm.nativeElement, className), // TODO return mdc-icon-button__icon--on for on... hasClass: (className) => this._elm.nativeElement.classList.contains(className), setAttr: (name, value) => this._renderer.setAttribute(this._elm.nativeElement, name, value), notifyChange: (evtData) => { this._on = evtData.isOn; this._onChange(this._on); this.onChange.emit(this._on); } }; this.toggleFoundation = null; } ngAfterContentInit() { this.initRipple(true); this.toggleFoundation = new MDCIconButtonToggleFoundation(this.toggleAdapter); this.toggleFoundation.init(); } ngOnDestroy() { var _a; this.destroyRipple(); (_a = this.toggleFoundation) === null || _a === void 0 ? void 0 : _a.destroy(); this.toggleFoundation = null; } /** @internal */ writeValue(obj) { this.on = !!obj; } /** @internal */ registerOnChange(onChange) { this._onChange = onChange; } /** @internal */ registerOnTouched(onTouched) { this._onTouched = onTouched; } /** @internal */ setDisabledState(disabled) { this._disabled = disabled; } /** * The current state of the icon (true for on/pressed, false for off/unpressed). */ get on() { return this.toggleFoundation ? this.toggleFoundation.isOn() : this._on; } set on(value) { const old = this.toggleFoundation ? this.toggleFoundation.isOn() : this._on; this._on = asBoolean(value); if (this.toggleFoundation) this.toggleFoundation.toggle(this._on); if (this._on !== old) this.onChange.emit(this._on); } /** @internal */ get _label() { return this._on ? (this.labelOn || this.label) : (this.labelOff || this.label); } /** @internal */ _onClick() { var _a; (_a = this.toggleFoundation) === null || _a === void 0 ? void 0 : _a.handleClick(); } /** @internal */ _onBlur() { this._onTouched(); } /** * To disable the icon, set this input to true. */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = asBoolean(value); } } MdcIconToggleDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcIconToggle]', providers: [ { provide: AbstractMdcRipple, useExisting: forwardRef(() => MdcIconToggleDirective) }, { provide: AbstractMdcIcon, useExisting: forwardRef(() => MdcIconToggleDirective) } ] },] } ]; MdcIconToggleDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcIconToggleDirective.propDecorators = { _cls: [{ type: HostBinding, args: ['class.mdc-icon-button',] }], label: [{ type: Input }], labelOn: [{ type: Input }], labelOff: [{ type: Input }], onChange: [{ type: Output }], on: [{ type: Input }], _label: [{ type: HostBinding, args: ['attr.aria-label',] }], _onClick: [{ type: HostListener, args: ['click',] }], _onBlur: [{ type: HostListener, args: ['blur',] }], disabled: [{ type: Input }, { type: HostBinding }] }; /** * Directive for adding Angular Forms (<code>ControlValueAccessor</code>) behavior to an * <code>MdcIconToggleDirective</code>. Allows the use of the Angular Forms API with * icon toggle buttons, e.g. binding to <code>[(ngModel)]</code>, form validation, etc. */ export class MdcFormsIconButtonDirective { constructor(mdcIconButton) { this.mdcIconButton = mdcIconButton; } /** @docs-private */ writeValue(obj) { this.mdcIconButton.writeValue(obj); } /** @docs-private */ registerOnChange(onChange) { this.mdcIconButton.registerOnChange(onChange); } /** @docs-private */ registerOnTouched(onTouched) { this.mdcIconButton.registerOnTouched(onTouched); } /** @docs-private */ setDisabledState(disabled) { this.mdcIconButton.setDisabledState(disabled); } } MdcFormsIconButtonDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcIconToggle][formControlName],[mdcIconToggle][formControl],[mdcIconToggle][ngModel]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdcFormsIconButtonDirective), multi: true } ] },] } ]; MdcFormsIconButtonDirective.ctorParameters = () => [ { type: MdcIconToggleDirective, decorators: [{ type: Self }] } ]; export const ICON_BUTTON_DIRECTIVES = [ MdcIconDirective, MdcIconButtonDirective, MdcIconToggleDirective, MdcFormsIconButtonDirective ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLmljb24tYnV0dG9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ljb24tYnV0dG9uL21kYy5pY29uLWJ1dHRvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUNuRixZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSw2QkFBNkIsRUFBOEQsTUFBTSx1QkFBdUIsQ0FBQztBQUNsSSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFJdkQsWUFBWSxJQUFnQixFQUFFLFFBQW1CLEVBQUUsUUFBMEIsRUFBb0IsR0FBUTtRQUNyRyxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBZSxDQUFDLENBQUM7UUFKckQsZ0JBQWdCO1FBQytCLFNBQUksR0FBRyxJQUFJLENBQUM7SUFJM0QsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7O1lBckJKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsd0NBQXdDO2dCQUNsRCxTQUFTLEVBQUU7b0JBQ1AsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO29CQUNwRixFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2lCQUNyRjthQUNKOzs7WUF0QnFDLFVBQVU7WUFDSSxTQUFTO1lBT3BELGdCQUFnQjs0Q0FtQjJELE1BQU0sU0FBQyxRQUFROzs7bUJBRjlGLFdBQVcsU0FBQyx1QkFBdUI7O0FBZXhDOzs7R0FHRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUFIN0I7UUFJSSxnQkFBZ0I7UUFDcUMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNqRSxnQkFBZ0I7UUFDZ0MsUUFBRyxHQUFHLEtBQUssQ0FBQztJQVloRSxDQUFDO0lBVkc7O09BRUc7SUFDSCxJQUFhLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsS0FBZ0I7UUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssSUFBSSxDQUFDO0lBQzlCLENBQUM7OztZQWxCSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLFdBQVc7YUFDeEI7OzttQkFHSSxXQUFXLFNBQUMsNkJBQTZCO2tCQUV6QyxXQUFXLFNBQUMsaUNBQWlDO3NCQUs3QyxLQUFLOztBQVNWOzs7Ozs7O0dBT0c7QUFRSCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsZUFBZTtJQXlDdkQsWUFBWSxJQUFnQixFQUFFLElBQWUsRUFBRSxRQUEwQixFQUFvQixHQUFRO1FBQ2pHLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFlLENBQUMsQ0FBQztRQXpDakQsZ0JBQWdCO1FBQytCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDM0Q7OztXQUdHO1FBQ00sVUFBSyxHQUFrQixJQUFJLENBQUM7UUFDckM7OztXQUdHO1FBQ00sWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDdkM7OztXQUdHO1FBQ00sYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDeEM7OztXQUdHO1FBQ2dCLGFBQVEsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRSxjQUFTLEdBQXlCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMzQyxlQUFVLEdBQWMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ2pDLFFBQUcsR0FBRyxLQUFLLENBQUM7UUFDWixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGtCQUFhLEdBQStCO1lBQ2hELFFBQVEsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQztZQUM1RixXQUFXLEVBQUUsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUM7WUFDbEcsa0RBQWtEO1lBQ2xELFFBQVEsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3RGLE9BQU8sRUFBRSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7WUFDM0csWUFBWSxFQUFFLENBQUMsT0FBdUMsRUFBRSxFQUFFO2dCQUN0RCxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsQ0FBQztTQUNKLENBQUM7UUFDTSxxQkFBZ0IsR0FBeUMsSUFBSSxDQUFDO0lBSXRFLENBQUM7SUFFRCxrQkFBa0I7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLDZCQUE2QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELFdBQVc7O1FBQ1AsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE1BQUEsSUFBSSxDQUFDLGdCQUFnQiwwQ0FBRSxPQUFPLEdBQUc7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFVBQVUsQ0FBQyxHQUFRO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsZ0JBQWdCLENBQUMsUUFBOEI7UUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixpQkFBaUIsQ0FBQyxTQUFvQjtRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGdCQUFnQixDQUFDLFFBQWlCO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDLEtBQWM7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDNUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBSUQsZ0JBQWdCO0lBQ2hCLElBQW9DLE1BQU07UUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxnQkFBZ0I7SUFDTyxRQUFROztRQUMzQixNQUFBLElBQUksQ0FBQyxnQkFBZ0IsMENBQUUsV0FBVyxHQUFHO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDTSxPQUFPO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUVJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7O1lBaElKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixTQUFTLEVBQUU7b0JBQ1AsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO29CQUNwRixFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2lCQUNyRjthQUNKOzs7WUEvRXFDLFVBQVU7WUFDSSxTQUFTO1lBT3BELGdCQUFnQjs0Q0FpSHVELE1BQU0sU0FBQyxRQUFROzs7bUJBdkMxRixXQUFXLFNBQUMsdUJBQXVCO29CQUtuQyxLQUFLO3NCQUtMLEtBQUs7dUJBS0wsS0FBSzt1QkFLTCxNQUFNO2lCQTBETixLQUFLO3FCQWdCTCxXQUFXLFNBQUMsaUJBQWlCO3VCQUs3QixZQUFZLFNBQUMsT0FBTztzQkFLcEIsWUFBWSxTQUFDLE1BQU07dUJBT25CLEtBQUssWUFDTCxXQUFXOztBQVloQjs7OztHQUlHO0FBT0gsTUFBTSxPQUFPLDJCQUEyQjtJQUNwQyxZQUE0QixhQUFxQztRQUFyQyxrQkFBYSxHQUFiLGFBQWEsQ0FBd0I7SUFDakUsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixVQUFVLENBQUMsR0FBUTtRQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsZ0JBQWdCLENBQUMsUUFBOEI7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLGlCQUFpQixDQUFDLFNBQW9CO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixnQkFBZ0IsQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7OztZQTVCSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLHdGQUF3RjtnQkFDbEcsU0FBUyxFQUFFO29CQUNQLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO2lCQUN4RzthQUNKOzs7WUFFOEMsc0JBQXNCLHVCQUFwRCxJQUFJOztBQXdCckIsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUc7SUFDbEMsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsMkJBQTJCO0NBQ2hHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBTZWxmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNRENJY29uQnV0dG9uVG9nZ2xlRm91bmRhdGlvbiwgTURDSWNvbkJ1dHRvblRvZ2dsZUFkYXB0ZXIsIE1EQ0ljb25CdXR0b25Ub2dnbGVFdmVudERldGFpbCB9IGZyb20gJ0BtYXRlcmlhbC9pY29uLWJ1dHRvbic7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1kY1JpcHBsZSB9IGZyb20gJy4uL3JpcHBsZS9hYnN0cmFjdC5tZGMucmlwcGxlJztcbmltcG9ydCB7IEFic3RyYWN0TWRjSWNvbiB9IGZyb20gJy4vYWJzdHJhY3QubWRjLmljb24nO1xuaW1wb3J0IHsgTWRjRXZlbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL21kYy5ldmVudC5yZWdpc3RyeSc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBhbiBpY29uIGJ1dHRvbi4gSWNvbiBidXR0b25zIGNhbiBiZSB1c2VkIHdpdGggYSBmb250IGljb24gbGlicmFyeSBzdWNoIGFzXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9tYXRlcmlhbC5pby90b29scy9pY29uc1wiIHRhcmdldD1cIl9ibGFua1wiPkdvb2dsZSBNYXRlcmlhbCBJY29uczwvYT4sIFNWR1xuICogZWxlbWVudHMgb3IgaW1hZ2VzLiBUaGV5IHByb3ZpZGUgbWF0ZXJpYWwgc3R5bGluZyBhbmQgYSByaXBwbGUgdG8gdGhlIGljb24uIFVzZSBpdCBvbiBhbmNob3IgYW5kXG4gKiBidXR0b24gdGFncy4gRm9yIHRvZ2dsaW5nIGljb24gYnV0dG9ucywgc2VlIGBNZGNJY29uVG9nZ2xlRGlyZWN0aXZlYC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdidXR0b25bbWRjSWNvbkJ1dHRvbl0sYVttZGNJY29uQnV0dG9uXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtwcm92aWRlOiBBYnN0cmFjdE1kY1JpcHBsZSwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvbkJ1dHRvbkRpcmVjdGl2ZSkgfSxcbiAgICAgICAge3Byb3ZpZGU6IEFic3RyYWN0TWRjSWNvbiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvbkJ1dHRvbkRpcmVjdGl2ZSkgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTWRjSWNvbkJ1dHRvbkRpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjSWNvbiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLWljb24tYnV0dG9uJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihfZWxtOiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyLCByZWdpc3RyeTogTWRjRXZlbnRSZWdpc3RyeSwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcbiAgICAgICAgc3VwZXIoX2VsbSwgcmVuZGVyZXIsIHJlZ2lzdHJ5LCBkb2MgYXMgRG9jdW1lbnQpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0UmlwcGxlKHRydWUpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lSaXBwbGUoKTtcbiAgICB9XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciB0aGUgaWNvbiB0byBkaXNwbGF5IG9uIG9uZSBvZiB0aGUgdG9nZ2xlIHN0YXRlcyBvZiBhbiBgbWRjSWNvblRvZ2dsZWAuIFNlZVxuICogYE1kY0ljb25Ub2dnbGVEaXJlY3RpdmVgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNJY29uXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjSWNvbkRpcmVjdGl2ZSAge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1pY29uLWJ1dHRvbl9faWNvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1pY29uLWJ1dHRvbl9faWNvbi0tb24nKSBfb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGlucHV0IHRvIGZhbHNlIHRvIHJlbW92ZSB0aGUgcmlwcGxlIGVmZmVjdCBmcm9tIHRoZSBzdXJmYWNlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBtZGNJY29uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb24gPyAnb24nIDogJyc7XG4gICAgfVxuXG4gICAgc2V0IG1kY0ljb24odmFsdWU6ICdvbicgfCAnJykge1xuICAgICAgICB0aGlzLl9vbiA9IHZhbHVlID09PSAnb24nO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGNyZWF0aW5nIGEgTWF0ZXJpYWwgRGVzaWduIGljb24gdG9nZ2xlIGJ1dHRvbjogYSBidXR0b24gdGhhdCB0b2dnbGVzIHN0YXRlLCBhbmRcbiAqIHN3aXRjaGVzIHRoZSBpY29uIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdG9nZ2xlLlxuICogXG4gKiBXaGVuIHRoZSBhcHBsaWVkIGljb24gZm9udCB1c2VzIENTUyBwc2V1ZG8gZWxlbWVudHMsIGFkZCBhIGNoaWxkIGVsZW1lbnQgZm9yIHRoZSBhY3R1YWwgaWNvbixcbiAqIGFuZCBnaXZlIHRoYXQgZWxlbWVudCB0aGUgPGNvZGU+bWRjSWNvbkJ1dHRvbkljb248L2NvZGU+IGRpcmVjdGl2ZS4gVGhlIGljb24gYnV0dG9uIHdpbGxcbiAqIHRoZW4gdXBkYXRlIHRoZSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIGNvcnJlY3QgaWNvbiBpZiBpdCBpcyB0b2dnbGVkLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNJY29uVG9nZ2xlXScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtwcm92aWRlOiBBYnN0cmFjdE1kY1JpcHBsZSwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSkgfSxcbiAgICAgICAge3Byb3ZpZGU6IEFic3RyYWN0TWRjSWNvbiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSkgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjSWNvbiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1pY29uLWJ1dHRvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmlhLWxhYmVsIHRvIGFzc2lnbiB0byB0aGUgaWNvbiB0b2dnbGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIHZhbHVlIGZvciB0aGVcbiAgICAgKiBvbiByZXNwZWN0aXZlbHkgb2ZmIHN0YXRlIGJ5IGFzc2lnbmluZyB0byBwcm9wZXJ0eSBgbGFiZWxPbmAgb3IgYGxhYmVsT2ZmYC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBsYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFyaWEtbGFiZWwgdG8gYXNzaWduIHRvIHRoZSBpY29uIHRvZ2dsZSB3aGVuIGl0IGlzIG9uLiBJZiB0aGlzIGlucHV0IGhhcyBubyB2YWx1ZSxcbiAgICAgKiB0aGUgYXJpYS1sYWJlbCB3aWxsIGRlZmF1bHQgdG8gdGhlIHZhbHVlIG9mIHRoZSBgbGFiZWxgIGlucHV0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGxhYmVsT246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmlhLWxhYmVsIHRvIGFzc2lnbiB0byB0aGUgaWNvbiB0b2dnbGUgd2hlbiBpdCBpcyBvZmYuIElmIHRoaXMgaW5wdXQgaGFzIG5vIHZhbHVlLFxuICAgICAqIHRoZSBhcmlhLWxhYmVsIHdpbGwgZGVmYXVsdCB0byB0aGUgdmFsdWUgb2YgdGhlIGBsYWJlbGAgaW5wdXQuXG4gICAgICovXG4gICAgQElucHV0KCkgbGFiZWxPZmY6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIGljb24gdG9nZ2xlIGNoYW5nZXMgKGZvciBleGFtcGxlIHdoZW4gYSB1c2VyIGNsaWNrc1xuICAgICAqIHRoZSBpY29uKS4gXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSB0b2dnbGVBZGFwdGVyOiBNRENJY29uQnV0dG9uVG9nZ2xlQWRhcHRlciA9IHtcbiAgICAgICAgYWRkQ2xhc3M6IChjbGFzc05hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5fZWxtLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSksXG4gICAgICAgIHJlbW92ZUNsYXNzOiAoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpLFxuICAgICAgICAvLyBUT0RPIHJldHVybiBtZGMtaWNvbi1idXR0b25fX2ljb24tLW9uIGZvciBvbi4uLlxuICAgICAgICBoYXNDbGFzczogKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB0aGlzLl9lbG0ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSxcbiAgICAgICAgc2V0QXR0cjogKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdGhpcy5fcmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LCBuYW1lLCB2YWx1ZSksXG4gICAgICAgIG5vdGlmeUNoYW5nZTogKGV2dERhdGE6IE1EQ0ljb25CdXR0b25Ub2dnbGVFdmVudERldGFpbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb24gPSBldnREYXRhLmlzT247XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl9vbik7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBwcml2YXRlIHRvZ2dsZUZvdW5kYXRpb246IE1EQ0ljb25CdXR0b25Ub2dnbGVGb3VuZGF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihfZWxtOiBFbGVtZW50UmVmLCBybmRyOiBSZW5kZXJlcjIsIHJlZ2lzdHJ5OiBNZGNFdmVudFJlZ2lzdHJ5LCBASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICBzdXBlcihfZWxtLCBybmRyLCByZWdpc3RyeSwgZG9jIGFzIERvY3VtZW50KTtcbiAgICB9XG4gIFxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0UmlwcGxlKHRydWUpO1xuICAgICAgICB0aGlzLnRvZ2dsZUZvdW5kYXRpb24gPSBuZXcgTURDSWNvbkJ1dHRvblRvZ2dsZUZvdW5kYXRpb24odGhpcy50b2dnbGVBZGFwdGVyKTtcbiAgICAgICAgdGhpcy50b2dnbGVGb3VuZGF0aW9uLmluaXQoKTtcbiAgICB9XG4gIFxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lSaXBwbGUoKTtcbiAgICAgICAgdGhpcy50b2dnbGVGb3VuZGF0aW9uPy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudG9nZ2xlRm91bmRhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vbiA9ICEhb2JqO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IGFueSkge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaWNvbiAodHJ1ZSBmb3Igb24vcHJlc3NlZCwgZmFsc2UgZm9yIG9mZi91bnByZXNzZWQpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGdldCBvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlRm91bmRhdGlvbiA/IHRoaXMudG9nZ2xlRm91bmRhdGlvbi5pc09uKCkgOiB0aGlzLl9vbjtcbiAgICB9XG5cbiAgICBzZXQgb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgb2xkID0gdGhpcy50b2dnbGVGb3VuZGF0aW9uID8gdGhpcy50b2dnbGVGb3VuZGF0aW9uLmlzT24oKSA6IHRoaXMuX29uO1xuICAgICAgICB0aGlzLl9vbiA9IGFzQm9vbGVhbih2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUZvdW5kYXRpb24pXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUZvdW5kYXRpb24udG9nZ2xlKHRoaXMuX29uKTtcbiAgICAgICAgaWYgKHRoaXMuX29uICE9PSBvbGQpXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5fb24pO1xuICAgIH1cblxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9vbjogYm9vbGVhbiB8ICcnO1xuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsJykgZ2V0IF9sYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uID8gKHRoaXMubGFiZWxPbiB8fCB0aGlzLmxhYmVsKSA6ICh0aGlzLmxhYmVsT2ZmIHx8IHRoaXMubGFiZWwpO1xuICAgIH1cbiAgICBcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBfb25DbGljaygpIHtcbiAgICAgICAgdGhpcy50b2dnbGVGb3VuZGF0aW9uPy5oYW5kbGVDbGljaygpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJykgX29uQmx1cigpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG8gZGlzYWJsZSB0aGUgaWNvbiwgc2V0IHRoaXMgaW5wdXQgdG8gdHJ1ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygpXG4gICAgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gYXNCb29sZWFuKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IGJvb2xlYW4gfCAnJztcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGFkZGluZyBBbmd1bGFyIEZvcm1zICg8Y29kZT5Db250cm9sVmFsdWVBY2Nlc3NvcjwvY29kZT4pIGJlaGF2aW9yIHRvIGFuXG4gKiA8Y29kZT5NZGNJY29uVG9nZ2xlRGlyZWN0aXZlPC9jb2RlPi4gQWxsb3dzIHRoZSB1c2Ugb2YgdGhlIEFuZ3VsYXIgRm9ybXMgQVBJIHdpdGhcbiAqIGljb24gdG9nZ2xlIGJ1dHRvbnMsIGUuZy4gYmluZGluZyB0byA8Y29kZT5bKG5nTW9kZWwpXTwvY29kZT4sIGZvcm0gdmFsaWRhdGlvbiwgZXRjLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNJY29uVG9nZ2xlXVtmb3JtQ29udHJvbE5hbWVdLFttZGNJY29uVG9nZ2xlXVtmb3JtQ29udHJvbF0sW21kY0ljb25Ub2dnbGVdW25nTW9kZWxdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNZGNGb3Jtc0ljb25CdXR0b25EaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZX1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE1kY0Zvcm1zSWNvbkJ1dHRvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBjb25zdHJ1Y3RvcihAU2VsZigpIHByaXZhdGUgbWRjSWNvbkJ1dHRvbjogTWRjSWNvblRvZ2dsZURpcmVjdGl2ZSkge1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgd3JpdGVWYWx1ZShvYmo6IGFueSkge1xuICAgICAgICB0aGlzLm1kY0ljb25CdXR0b24ud3JpdGVWYWx1ZShvYmopO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5tZGNJY29uQnV0dG9uLnJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2UpO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiBhbnkpIHtcbiAgICAgICAgdGhpcy5tZGNJY29uQnV0dG9uLnJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZCk7XG4gICAgfVxuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMubWRjSWNvbkJ1dHRvbi5zZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBJQ09OX0JVVFRPTl9ESVJFQ1RJVkVTID0gW1xuICAgIE1kY0ljb25EaXJlY3RpdmUsIE1kY0ljb25CdXR0b25EaXJlY3RpdmUsIE1kY0ljb25Ub2dnbGVEaXJlY3RpdmUsIE1kY0Zvcm1zSWNvbkJ1dHRvbkRpcmVjdGl2ZVxuXTtcbiJdfQ==