UNPKG

@blox/material

Version:

Material Components for Angular

155 lines 18.2 kB
import { Directive, ElementRef, HostBinding, Input, Renderer2, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { asBoolean, asBooleanOrNull } from '../../utils/value.utils'; import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple'; import { MdcEventRegistry } from '../../utils/mdc.event.registry'; /** * Directive for making an element a ripple surface. The ripple can be customized * with the provided * <a href="https://github.com/material-components/material-components-web/tree/master/packages/mdc-ripple#sass-apis" * target="_blank">Sass Mixins</a>. * Alternatively you can set the <code>surface</code> to get a default styled ripple. */ export class MdcRippleDirective extends AbstractMdcRipple { constructor(_elm, renderer, registry, doc) { super(_elm, renderer, registry, doc); this._elm = _elm; this._initialized = false; this._on = false; this._disabled = null; this._surface = false; this._dim = null; } ngAfterContentInit() { if (this._on) this.initRipple(); this._initialized = true; } ngOnDestroy() { this.destroyRipple(); } /** @internal */ isRippleSurfaceDisabled() { return this._disabled == null ? super.isRippleSurfaceDisabled() : this._disabled; } /** @internal */ computeRippleBoundingRect() { if (this._dim == null) return super.computeRippleBoundingRect(); const { left, top } = this._elm.nativeElement.getBoundingClientRect(); return { left, top, width: this._dim, height: this._dim, right: left + this._dim, bottom: top + this._dim, }; } /** * Set this input to false to remove the ripple effect from the surface. */ get mdcRipple() { return this._on; } set mdcRipple(value) { const newValue = asBoolean(value); if (newValue !== this._on) { this._on = newValue; if (this._initialized) { if (newValue) this.initRipple(); else this.destroyRipple(); } } } /** * When this input has a value other than false, the ripple is unbounded. * Surfaces for bounded ripples should have <code>overflow</code> set to hidden, * while surfaces for unbounded ripples should have it set to <code>visible</code>. */ get unbounded() { return this.isRippleUnbounded(); } set unbounded(value) { this.setRippleUnbounded(asBoolean(value)); } /** @internal */ get _attrUnbounded() { return this.unbounded ? "" : null; } /** * This input sets the dimension of the ripple. * This input can be set to null for returning to the defaults, which uses the surface * element to compute the bounds of the ripple. */ get dimension() { return this._dim; } set dimension(value) { this._dim = value == null ? null : +value; this.layout(); } /** * This input can be used to programmatically enable/disable the ripple. * When true, the ripple effect will be disabled, when false the ripple * effect will be enabled. When not set, or <code>null</code> (default) * the ripple effect enabled/disabled state depend on whether or not the * surface element has the <code>disabled</code> attribute set. */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = asBooleanOrNull(value); } /** * When this input has a value other than false, the ripple element will get the * "mdc-ripple-surface" class. That class has styling for bounded and unbounded * ripples in accordance with your theme customizations. Without this property, * you have to supply your own ripple styles, using the provided * <a href="https://github.com/material-components/material-components-web/tree/master/packages/mdc-ripple#sass-apis" * target="_blank">Sass Mixins</a>. * * To apply a standard surface ripple, set the value to `true`, `"primary"`, or `"accent"`. * The values primary and accent set the ripple color to the theme primary or secondary color. */ get surface() { return !!this._surface; } set surface(value) { if (value === 'primary' || value === 'accent') this._surface = value; else this._surface = asBoolean(value); } get _surfacePrimary() { return this._surface === 'primary'; } get _surfaceAccent() { return this._surface === 'accent'; } } MdcRippleDirective.decorators = [ { type: Directive, args: [{ selector: '[mdcRipple]' },] } ]; MdcRippleDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: MdcEventRegistry }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; MdcRippleDirective.propDecorators = { mdcRipple: [{ type: Input }], unbounded: [{ type: Input }], _attrUnbounded: [{ type: HostBinding, args: ['attr.data-mdc-ripple-is-unbounded',] }], dimension: [{ type: Input }], disabled: [{ type: Input }], surface: [{ type: Input }, { type: HostBinding, args: ['class.mdc-ripple-surface',] }], _surfacePrimary: [{ type: HostBinding, args: ['class.mdc-ripple-surface--primary',] }], _surfaceAccent: [{ type: HostBinding, args: ['class.mdc-ripple-surface--accent',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnJpcHBsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9yaXBwbGUvbWRjLnJpcHBsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVsRTs7Ozs7O0dBTUc7QUFJSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsaUJBQWlCO0lBT3JELFlBQW1CLElBQWdCLEVBQUUsUUFBbUIsRUFBRSxRQUEwQixFQUFvQixHQUFRO1FBQzVHLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFlLENBQUMsQ0FBQztRQURsQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBTjNCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFFBQUcsR0FBRyxLQUFLLENBQUM7UUFDWixjQUFTLEdBQW1CLElBQUksQ0FBQztRQUNqQyxhQUFRLEdBQW1DLEtBQUssQ0FBQztRQUNqRCxTQUFJLEdBQWtCLElBQUksQ0FBQztJQUluQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxJQUFJLENBQUMsR0FBRztZQUNSLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVztRQUNQLElBQUks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UyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFJRCxJQUFzRCxlQUFlO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQXFELGNBQWM7UUFDL0QsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQztJQUN0QyxDQUFDOzs7WUFySkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxhQUFhO2FBQzFCOzs7WUFmcUMsVUFBVTtZQUFpQyxTQUFTO1lBSWpGLGdCQUFnQjs0Q0FtQmtFLE1BQU0sU0FBQyxRQUFROzs7d0JBcUNyRyxLQUFLO3dCQXdCTCxLQUFLOzZCQVdMLFdBQVcsU0FBQyxtQ0FBbUM7d0JBUy9DLEtBQUs7dUJBa0JMLEtBQUs7c0JBcUJMLEtBQUssWUFBSSxXQUFXLFNBQUMsMEJBQTBCOzhCQWEvQyxXQUFXLFNBQUMsbUNBQW1DOzZCQUkvQyxXQUFXLFNBQUMsa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBhc0Jvb2xlYW4sIGFzQm9vbGVhbk9yTnVsbCB9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbHVlLnV0aWxzJztcclxuaW1wb3J0IHsgQWJzdHJhY3RNZGNSaXBwbGUgfSBmcm9tICcuLi9yaXBwbGUvYWJzdHJhY3QubWRjLnJpcHBsZSc7XHJcbmltcG9ydCB7IE1kY0V2ZW50UmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9tZGMuZXZlbnQucmVnaXN0cnknO1xyXG5cclxuLyoqXHJcbiAqIERpcmVjdGl2ZSBmb3IgbWFraW5nIGFuIGVsZW1lbnQgYSByaXBwbGUgc3VyZmFjZS4gVGhlIHJpcHBsZSBjYW4gYmUgY3VzdG9taXplZFxyXG4gKiB3aXRoIHRoZSBwcm92aWRlZFxyXG4gKiA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL21hdGVyaWFsLWNvbXBvbmVudHMvbWF0ZXJpYWwtY29tcG9uZW50cy13ZWIvdHJlZS9tYXN0ZXIvcGFja2FnZXMvbWRjLXJpcHBsZSNzYXNzLWFwaXNcIlxyXG4gKiAgIHRhcmdldD1cIl9ibGFua1wiPlNhc3MgTWl4aW5zPC9hPi5cclxuICogQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNldCB0aGUgPGNvZGU+c3VyZmFjZTwvY29kZT4gdG8gZ2V0IGEgZGVmYXVsdCBzdHlsZWQgcmlwcGxlLlxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ1ttZGNSaXBwbGVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTWRjUmlwcGxlRGlyZWN0aXZlIGV4dGVuZHMgQWJzdHJhY3RNZGNSaXBwbGUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX29uID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfc3VyZmFjZTogYm9vbGVhbiB8ICdwcmltYXJ5JyB8ICdhY2NlbnQnID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9kaW06IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBfZWxtOiBFbGVtZW50UmVmLCByZW5kZXJlcjogUmVuZGVyZXIyLCByZWdpc3RyeTogTWRjRXZlbnRSZWdpc3RyeSwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihfZWxtLCByZW5kZXJlciwgcmVnaXN0cnksIGRvYyBhcyBEb2N1bWVudCk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX29uKVxyXG4gICAgICAgICAgICB0aGlzLmluaXRSaXBwbGUoKTtcclxuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3lSaXBwbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgaXNSaXBwbGVTdXJmYWNlRGlzYWJsZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkID09IG51bGwgPyBzdXBlci5pc1JpcHBsZVN1cmZhY2VEaXNhYmxlZCgpIDogdGhpcy5fZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIGNvbXB1dGVSaXBwbGVCb3VuZGluZ1JlY3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RpbSA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcHV0ZVJpcHBsZUJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHtsZWZ0LCB0b3B9ID0gdGhpcy5fZWxtLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVmdCxcclxuICAgICAgICAgICAgdG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5fZGltLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuX2RpbSxcclxuICAgICAgICAgICAgcmlnaHQ6IGxlZnQgKyB0aGlzLl9kaW0sXHJcbiAgICAgICAgICAgIGJvdHRvbTogdG9wICsgdGhpcy5fZGltLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyBpbnB1dCB0byBmYWxzZSB0byByZW1vdmUgdGhlIHJpcHBsZSBlZmZlY3QgZnJvbSB0aGUgc3VyZmFjZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgZ2V0IG1kY1JpcHBsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb247XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1kY1JpcHBsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYXNCb29sZWFuKHZhbHVlKTtcclxuICAgICAgICBpZiAobmV3VmFsdWUgIT09IHRoaXMuX29uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJpcHBsZSgpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVJpcHBsZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9tZGNSaXBwbGU6IGJvb2xlYW4gfCAnJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdGhpcyBpbnB1dCBoYXMgYSB2YWx1ZSBvdGhlciB0aGFuIGZhbHNlLCB0aGUgcmlwcGxlIGlzIHVuYm91bmRlZC5cclxuICAgICAqIFN1cmZhY2VzIGZvciBib3VuZGVkIHJpcHBsZXMgc2hvdWxkIGhhdmUgPGNvZGU+b3ZlcmZsb3c8L2NvZGU+IHNldCB0byBoaWRkZW4sXHJcbiAgICAgKiB3aGlsZSBzdXJmYWNlcyBmb3IgdW5ib3VuZGVkIHJpcHBsZXMgc2hvdWxkIGhhdmUgaXQgc2V0IHRvIDxjb2RlPnZpc2libGU8L2NvZGU+LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBnZXQgdW5ib3VuZGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzUmlwcGxlVW5ib3VuZGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHVuYm91bmRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuc2V0UmlwcGxlVW5ib3VuZGVkKGFzQm9vbGVhbih2YWx1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV91bmJvdW5kZWQ6IGJvb2xlYW4gfCAnJztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1tZGMtcmlwcGxlLWlzLXVuYm91bmRlZCcpIGdldCBfYXR0clVuYm91bmRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy51bmJvdW5kZWQgPyBcIlwiIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaW5wdXQgc2V0cyB0aGUgZGltZW5zaW9uIG9mIHRoZSByaXBwbGUuXHJcbiAgICAgKiBUaGlzIGlucHV0IGNhbiBiZSBzZXQgdG8gbnVsbCBmb3IgcmV0dXJuaW5nIHRvIHRoZSBkZWZhdWx0cywgd2hpY2ggdXNlcyB0aGUgc3VyZmFjZVxyXG4gICAgICogZWxlbWVudCB0byBjb21wdXRlIHRoZSBib3VuZHMgb2YgdGhlIHJpcHBsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgZ2V0IGRpbWVuc2lvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGltO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBkaW1lbnNpb24odmFsdWU6IG51bWJlciB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9kaW0gPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6ICt2YWx1ZTtcclxuICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaW1lbnNpb246IHN0cmluZyB8IG51bWJlciB8IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlucHV0IGNhbiBiZSB1c2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgZW5hYmxlL2Rpc2FibGUgdGhlIHJpcHBsZS5cclxuICAgICAqIFdoZW4gdHJ1ZSwgdGhlIHJpcHBsZSBlZmZlY3Qgd2lsbCBiZSBkaXNhYmxlZCwgd2hlbiBmYWxzZSB0aGUgcmlwcGxlXHJcbiAgICAgKiBlZmZlY3Qgd2lsbCBiZSBlbmFibGVkLiBXaGVuIG5vdCBzZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IChkZWZhdWx0KVxyXG4gICAgICogdGhlIHJpcHBsZSBlZmZlY3QgZW5hYmxlZC9kaXNhYmxlZCBzdGF0ZSBkZXBlbmQgb24gd2hldGhlciBvciBub3QgdGhlXHJcbiAgICAgKiBzdXJmYWNlIGVsZW1lbnQgaGFzIHRoZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4gYXR0cmlidXRlIHNldC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgZ2V0IGRpc2FibGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBhc0Jvb2xlYW5Pck51bGwodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9ib29sZWFuOiBib29sZWFuIHwgbnVsbCB8ICcnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiB0aGlzIGlucHV0IGhhcyBhIHZhbHVlIG90aGVyIHRoYW4gZmFsc2UsIHRoZSByaXBwbGUgZWxlbWVudCB3aWxsIGdldCB0aGVcclxuICAgICAqIFwibWRjLXJpcHBsZS1zdXJmYWNlXCIgY2xhc3MuIFRoYXQgY2xhc3MgaGFzIHN0eWxpbmcgZm9yIGJvdW5kZWQgYW5kIHVuYm91bmRlZFxyXG4gICAgICogcmlwcGxlcyBpbiBhY2NvcmRhbmNlIHdpdGggeW91ciB0aGVtZSBjdXN0b21pemF0aW9ucy4gV2l0aG91dCB0aGlzIHByb3BlcnR5LFxyXG4gICAgICogeW91IGhhdmUgdG8gc3VwcGx5IHlvdXIgb3duIHJpcHBsZSBzdHlsZXMsIHVzaW5nIHRoZSBwcm92aWRlZFxyXG4gICAgICogPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9tYXRlcmlhbC1jb21wb25lbnRzL21hdGVyaWFsLWNvbXBvbmVudHMtd2ViL3RyZWUvbWFzdGVyL3BhY2thZ2VzL21kYy1yaXBwbGUjc2Fzcy1hcGlzXCJcclxuICAgICAqICAgdGFyZ2V0PVwiX2JsYW5rXCI+U2FzcyBNaXhpbnM8L2E+LlxyXG4gICAgICogXHJcbiAgICAgKiBUbyBhcHBseSBhIHN0YW5kYXJkIHN1cmZhY2UgcmlwcGxlLCBzZXQgdGhlIHZhbHVlIHRvIGB0cnVlYCwgYFwicHJpbWFyeVwiYCwgb3IgYFwiYWNjZW50XCJgLlxyXG4gICAgICogVGhlIHZhbHVlcyBwcmltYXJ5IGFuZCBhY2NlbnQgc2V0IHRoZSByaXBwbGUgY29sb3IgdG8gdGhlIHRoZW1lIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNvbG9yLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy1yaXBwbGUtc3VyZmFjZScpIGdldCBzdXJmYWNlKCkge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMuX3N1cmZhY2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHN1cmZhY2UodmFsdWU6IGJvb2xlYW4gfCAncHJpbWFyeScgfCAnYWNjZW50Jykge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3ByaW1hcnknIHx8IHZhbHVlID09PSAnYWNjZW50JylcclxuICAgICAgICAgICAgdGhpcy5fc3VyZmFjZSA9IHZhbHVlO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5fc3VyZmFjZSA9IGFzQm9vbGVhbih2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3N1cmZhY2U6IGJvb2xlYW4gfCAncHJpbWFyeScgfCAnYWNjZW50JyB8ICcnO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXJpcHBsZS1zdXJmYWNlLS1wcmltYXJ5JykgZ2V0IF9zdXJmYWNlUHJpbWFyeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3VyZmFjZSA9PT0gJ3ByaW1hcnknO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXJpcHBsZS1zdXJmYWNlLS1hY2NlbnQnKSBnZXQgX3N1cmZhY2VBY2NlbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cmZhY2UgPT09ICdhY2NlbnQnO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==