ngx-materialize
Version:
An Angular wrap around Materialize library
297 lines (296 loc) • 29.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output, Renderer, } from '@angular/core';
import { HandlePropChanges } from '../shared/index';
export class MzSelectDirective extends HandlePropChanges {
/**
* @param {?} elementRef
* @param {?} changeDetectorRef
* @param {?} renderer
*/
constructor(elementRef, changeDetectorRef, renderer) {
super();
this.elementRef = elementRef;
this.changeDetectorRef = changeDetectorRef;
this.renderer = renderer;
this.update = new EventEmitter();
this.suspend = false;
}
/**
* @return {?}
*/
get inputElement() {
return this.selectElement.siblings('input.select-dropdown');
}
/**
* @return {?}
*/
ngOnInit() {
this.initHandlers();
this.initElements();
this.initOnChange();
this.handleProperties();
// must be done after handlePlaceholder
this.initSelectedOption();
// must be done after handleProperties
this.initMaterialSelect();
// must be done after initMaterialSelect
this.listenOptionChanges();
this.initFilledIn();
this.handleDOMEvents();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.renderer.invokeElementMethod(this.selectElement, 'material_select', ['destroy']);
this.selectElement.off();
this.mutationObserver.disconnect();
}
/**
* @return {?}
*/
initHandlers() {
this.handlers = {
disabled: () => this.handleDisabled(),
label: () => this.handleLabel(),
placeholder: () => this.handlePlaceholder(),
};
}
/**
* @return {?}
*/
initElements() {
this.selectElement = $(this.elementRef.nativeElement);
this.selectContainerElement = $(this.elementRef.nativeElement).parents('.input-field');
this.labelElement = this.createLabelElement();
}
/**
* Need to be done after material_select has been invoked or else the multi-select
* options are not yet in the DOM as it loops on rendered options
* @return {?}
*/
initFilledIn() {
this.checkboxElements = this.selectContainerElement.find(':checkbox');
this.handlers['filledIn'] = () => this.handleFilledIn();
this.handleFilledIn();
}
/**
* @return {?}
*/
initMaterialSelect() {
this.renderer.invokeElementMethod(this.selectElement, 'material_select');
}
/**
* Trigger the native change event from select element instead of the JQuery.
* An issue on Github is open about this problem : https://github.com/Dogfalo/materialize/issues/2843
* This method should be removed when this issue is revolved.
* @return {?}
*/
initOnChange() {
this.selectElement.on('change', (event) => {
if (!this.suspend) {
this.suspend = true;
const /** @type {?} */ customEvent = document.createEvent('CustomEvent');
customEvent.initCustomEvent('change', true, false, event.target.value);
this.renderer.invokeElementMethod(this.selectElement[0], 'dispatchEvent', [customEvent]);
}
});
// Stop the propagation of change event
this.selectElement[0].addEventListener('change', () => {
this.suspend = false;
});
}
/**
* @return {?}
*/
handleDOMEvents() {
this.inputElement.on('blur focus', (event) => {
const /** @type {?} */ customEvent = document.createEvent('CustomEvent');
customEvent.initCustomEvent(event.type, true, false, event.target);
this.selectElement[0].dispatchEvent(customEvent);
});
}
/**
* @return {?}
*/
createLabelElement() {
const /** @type {?} */ labelElement = document.createElement('label');
labelElement.setAttribute('for', this.id);
this.renderer.invokeElementMethod(this.selectElement, 'after', [labelElement]);
return $(labelElement);
}
/**
* @return {?}
*/
handleProperties() {
if (this.selectContainerElement.length === 0) {
console.error('Select with mz-select directive must be place inside a [mz-select-container] tag', this.selectElement);
return;
}
super.executePropHandlers();
}
/**
* @return {?}
*/
initSelectedOption() {
const /** @type {?} */ firstOptionElement = this.selectElement.children().first();
if (firstOptionElement.length > 0
&& this.selectElement.children('option[selected]').length === 0
&& !this.selectElement[0].hasAttribute('multiple')) {
this.renderer.setElementAttribute(firstOptionElement[0], 'selected', '');
}
}
/**
* @return {?}
*/
handleDisabled() {
// when disabled is null/undefined that means the property has not been used on the element
// but it might be set by another process (for example reactive form applies disabled attribute itself)
// therefore we don't want to remove or add it here
if (this.disabled != null) {
this.renderer.setElementProperty(this.selectElement[0], 'disabled', !!this.disabled);
this.updateMaterialSelect();
}
}
/**
* @return {?}
*/
handleLabel() {
if (this.label != null) {
this.renderer.invokeElementMethod(this.labelElement, 'text', [this.label]);
}
}
/**
* @return {?}
*/
handleFilledIn() {
if (this.checkboxElements.length > 0) {
this.checkboxElements.toArray().forEach(checkboxElement => {
this.renderer.setElementClass(checkboxElement, 'filled-in', !!this.filledIn);
});
}
}
/**
* @return {?}
*/
handlePlaceholder() {
const /** @type {?} */ placeholderElement = this.selectElement.children(':disabled').first();
// if placeholder element exists
if (placeholderElement.length > 0) {
if (this.placeholder) {
// update existing placeholder element
this.renderer.invokeElementMethod(placeholderElement, 'text', [this.placeholder]);
}
else {
// remove existing placeholder element
this.renderer.invokeElementMethod(placeholderElement, 'remove');
// Force trigger change event since it's not triggered when value change programmatically
this.renderer.invokeElementMethod(this.selectElement, 'change');
// Required if we don't want exception "Expression has changed after it was checked." https://github.com/angular/angular/issues/6005
this.changeDetectorRef.detectChanges();
}
}
else {
if (this.placeholder) {
// add placeholder element
const /** @type {?} */ placeholderText = document.createTextNode(this.placeholder);
const /** @type {?} */ placeholderOption = document.createElement('option');
placeholderOption.disabled = true;
placeholderOption.value = null;
placeholderOption.appendChild(placeholderText);
this.renderer.invokeElementMethod(this.selectElement, 'prepend', [placeholderOption]);
}
}
this.initMaterialSelect();
}
/**
* @return {?}
*/
listenOptionChanges() {
const /** @type {?} */ mutationObserverConfiguration = {
childList: true,
subtree: true,
};
this.mutationObserver = new MutationObserver((mutations) => {
this.updateMaterialSelect();
});
this.mutationObserver.observe(this.selectElement[0], mutationObserverConfiguration);
}
/**
* @return {?}
*/
updateMaterialSelect() {
this.initMaterialSelect();
if (this.filledIn) {
this.initFilledIn();
}
this.handleDOMEvents();
// wait for materialize select to be initialized
// /!\ race condition warning /!\
setTimeout(() => this.update.emit());
}
}
MzSelectDirective.decorators = [
{ type: Directive, args: [{
selector: 'select[mzSelect], select[mz-select]',
},] },
];
/** @nocollapse */
MzSelectDirective.ctorParameters = () => [
{ type: ElementRef, },
{ type: ChangeDetectorRef, },
{ type: Renderer, },
];
MzSelectDirective.propDecorators = {
"id": [{ type: Input },],
"disabled": [{ type: Input },],
"placeholder": [{ type: Input },],
"label": [{ type: Input },],
"filledIn": [{ type: Input },],
"update": [{ type: Output },],
};
function MzSelectDirective_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MzSelectDirective.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MzSelectDirective.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MzSelectDirective.propDecorators;
/** @type {?} */
MzSelectDirective.prototype.id;
/** @type {?} */
MzSelectDirective.prototype.disabled;
/** @type {?} */
MzSelectDirective.prototype.placeholder;
/** @type {?} */
MzSelectDirective.prototype.label;
/** @type {?} */
MzSelectDirective.prototype.filledIn;
/** @type {?} */
MzSelectDirective.prototype.update;
/** @type {?} */
MzSelectDirective.prototype.checkboxElements;
/** @type {?} */
MzSelectDirective.prototype.labelElement;
/** @type {?} */
MzSelectDirective.prototype.selectElement;
/** @type {?} */
MzSelectDirective.prototype.selectContainerElement;
/** @type {?} */
MzSelectDirective.prototype.mutationObserver;
/** @type {?} */
MzSelectDirective.prototype.suspend;
/** @type {?} */
MzSelectDirective.prototype.elementRef;
/** @type {?} */
MzSelectDirective.prototype.changeDetectorRef;
/** @type {?} */
MzSelectDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXRlcmlhbGl6ZS8iLCJzb3VyY2VzIjpbInNyYy9zZWxlY3Qvc2VsZWN0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUtwRCxNQUFNLHdCQUF5QixTQUFRLGlCQUFpQjs7Ozs7O0lBdUJ0RCxZQUNVLFlBQ0QsbUJBQ0E7UUFFUCxLQUFLLEVBQUUsQ0FBQztRQUpBLGVBQVUsR0FBVixVQUFVO1FBQ1gsc0JBQWlCLEdBQWpCLGlCQUFpQjtRQUNqQixhQUFRLEdBQVIsUUFBUTtzQkFqQkUsSUFBSSxZQUFZLEVBQUU7dUJBWTNCLEtBQUs7S0FRZDs7OztJQWJELElBQUksWUFBWTtRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0tBQzdEOzs7O0lBYUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztRQUd4QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7UUFHMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O1FBRzFCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7S0FDeEI7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxD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QUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxTQUEyQixFQUFFLEVBQUU7WUFDM0UsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7S0FDckY7Ozs7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOzs7UUFJdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztLQUN0Qzs7O1lBbE9GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUNBQXFDO2FBQ2hEOzs7O1lBZkMsVUFBVTtZQUZWLGlCQUFpQjtZQVNqQixRQUFROzs7bUJBV1AsS0FBSzt5QkFDTCxLQUFLOzRCQUNMLEtBQUs7c0JBR0wsS0FBSzt5QkFDTCxLQUFLO3VCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBIYW5kbGVQcm9wQ2hhbmdlcyB9IGZyb20gJy4uL3NoYXJlZC9pbmRleCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ3NlbGVjdFttelNlbGVjdF0sIHNlbGVjdFttei1zZWxlY3RdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE16U2VsZWN0RGlyZWN0aXZlIGV4dGVuZHMgSGFuZGxlUHJvcENoYW5nZXMgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8gbmF0aXZlIHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBpZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIC8vIGRpcmVjdGl2ZSBwcm9wZXJ0aWVzXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBmaWxsZWRJbjogYm9vbGVhbjtcclxuICBAT3V0cHV0KCkgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBjaGVja2JveEVsZW1lbnRzOiBKUXVlcnk7XHJcbiAgbGFiZWxFbGVtZW50OiBKUXVlcnk7XHJcbiAgc2VsZWN0RWxlbWVudDogSlF1ZXJ5O1xyXG4gIHNlbGVjdENvbnRhaW5lckVsZW1lbnQ6IEpRdWVyeTtcclxuXHJcbiAgZ2V0IGlucHV0RWxlbWVudCgpOiBKUXVlcnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0RWxlbWVudC5zaWJsaW5ncygnaW5wdXQuc2VsZWN0LWRyb3Bkb3duJyk7XHJcbiAgfVxyXG5cclxuICBtdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xyXG4gIHN1c3BlbmQgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcixcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdEhhbmRsZXJzKCk7XHJcbiAgICB0aGlzLmluaXRFbGVtZW50cygpO1xyXG4gICAgdGhpcy5pbml0T25DaGFuZ2UoKTtcclxuICAgIHRoaXMuaGFuZGxlUHJvcGVydGllcygpO1xyXG5cclxuICAgIC8vIG11c3QgYmUgZG9uZSBhZnRlciBoYW5kbGVQbGFjZWhvbGRlclxyXG4gICAgdGhpcy5pbml0U2VsZWN0ZWRPcHRpb24oKTtcclxuXHJcbiAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgaGFuZGxlUHJvcGVydGllc1xyXG4gICAgdGhpcy5pbml0TWF0ZXJpYWxTZWxlY3QoKTtcclxuXHJcbiAgICAvLyBtdXN0IGJlIGRvbmUgYWZ0ZXIgaW5pdE1hdGVyaWFsU2VsZWN0XHJcbiAgICB0aGlzLmxpc3Rlbk9wdGlvbkNoYW5nZXMoKTtcclxuICAgIHRoaXMuaW5pdEZpbGxlZEluKCk7XHJcbiAgICB0aGlzLmhhbmRsZURPTUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnbWF0ZXJpYWxfc2VsZWN0JywgWydkZXN0cm95J10pO1xyXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50Lm9mZigpO1xyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICB9XHJcblxyXG4gIGluaXRIYW5kbGVycygpIHtcclxuICAgIHRoaXMuaGFuZGxlcnMgPSB7XHJcbiAgICAgIGRpc2FibGVkOiAoKSA9PiB0aGlzLmhhbmRsZURpc2FibGVkKCksXHJcbiAgICAgIGxhYmVsOiAoKSA9PiB0aGlzLmhhbmRsZUxhYmVsKCksXHJcbiAgICAgIHBsYWNlaG9sZGVyOiAoKSA9PiB0aGlzLmhhbmRsZVBsYWNlaG9sZGVyKCksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgaW5pdEVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbnRhaW5lckVsZW1lbnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5wYXJlbnRzKCcuaW5wdXQtZmllbGQnKTtcclxuICAgIHRoaXMubGFiZWxFbGVtZW50ID0gdGhpcy5jcmVhdGVMYWJlbEVsZW1lbnQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5lZWQgdG8gYmUgZG9uZSBhZnRlciBtYXRlcmlhbF9zZWxlY3QgaGFzIGJlZW4gaW52b2tlZCBvciBlbHNlIHRoZSBtdWx0aS1zZWxlY3RcclxuICAgKiBvcHRpb25zIGFyZSBub3QgeWV0IGluIHRoZSBET00gYXMgaXQgbG9vcHMgb24gcmVuZGVyZWQgb3B0aW9uc1xyXG4gICAqL1xyXG4gIGluaXRGaWxsZWRJbigpIHtcclxuICAgIHRoaXMuY2hlY2tib3hFbGVtZW50cyA9IHRoaXMuc2VsZWN0Q29udGFpbmVyRWxlbWVudC5maW5kKCc6Y2hlY2tib3gnKTtcclxuICAgIHRoaXMuaGFuZGxlcnNbJ2ZpbGxlZEluJ10gPSAoKSA9PiB0aGlzLmhhbmRsZUZpbGxlZEluKCk7XHJcbiAgICB0aGlzLmhhbmRsZUZpbGxlZEluKCk7XHJcbiAgfVxyXG5cclxuICBpbml0TWF0ZXJpYWxTZWxlY3QoKSB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnbWF0ZXJpYWxfc2VsZWN0Jyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmlnZ2VyIHRoZSBuYXRpdmUgY2hhbmdlIGV2ZW50IGZyb20gc2VsZWN0IGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgSlF1ZXJ5LlxyXG4gICAqIEFuIGlzc3VlIG9uIEdpdGh1YiBpcyBvcGVuIGFib3V0IHRoaXMgcHJvYmxlbSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2dmYWxvL21hdGVyaWFsaXplL2lzc3Vlcy8yODQzXHJcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGlzIGlzc3VlIGlzIHJldm9sdmVkLlxyXG4gICAqL1xyXG4gIGluaXRPbkNoYW5nZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0RWxlbWVudC5vbignY2hhbmdlJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLnN1c3BlbmQpIHtcclxuICAgICAgICB0aGlzLnN1c3BlbmQgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xyXG4gICAgICAgIGN1c3RvbUV2ZW50LmluaXRDdXN0b21FdmVudCgnY2hhbmdlJywgdHJ1ZSwgZmFsc2UsIGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW52b2tlRWxlbWVudE1ldGhvZCh0aGlzLnNlbGVjdEVsZW1lbnRbMF0sICdkaXNwYXRjaEV2ZW50JywgW2N1c3RvbUV2ZW50XSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN0b3AgdGhlIHByb3BhZ2F0aW9uIG9mIGNoYW5nZSBldmVudFxyXG4gICAgdGhpcy5zZWxlY3RFbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcclxuICAgICAgdGhpcy5zdXNwZW5kID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZURPTUV2ZW50cygpIHtcclxuICAgIHRoaXMuaW5wdXRFbGVtZW50Lm9uKCdibHVyIGZvY3VzJywgKGV2ZW50OiBKUXVlcnkuRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcclxuICAgICAgY3VzdG9tRXZlbnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50LnR5cGUsIHRydWUsIGZhbHNlLCBldmVudC50YXJnZXQpO1xyXG4gICAgICB0aGlzLnNlbGVjdEVsZW1lbnRbMF0uZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUxhYmVsRWxlbWVudCgpIHtcclxuICAgIGNvbnN0IGxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XHJcbiAgICBsYWJlbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdmb3InLCB0aGlzLmlkKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnYWZ0ZXInLCBbbGFiZWxFbGVtZW50XSk7XHJcblxyXG4gICAgcmV0dXJuICQobGFiZWxFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVByb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RDb250YWluZXJFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdTZWxlY3Qgd2l0aCBtei1zZWxlY3QgZGlyZWN0aXZlIG11c3QgYmUgcGxhY2UgaW5zaWRlIGEgW216LXNlbGVjdC1jb250YWluZXJdIHRhZycsIHRoaXMuc2VsZWN0RWxlbWVudCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHN1cGVyLmV4ZWN1dGVQcm9wSGFuZGxlcnMoKTtcclxuICB9XHJcblxyXG4gIGluaXRTZWxlY3RlZE9wdGlvbigpIHtcclxuICAgIGNvbnN0IGZpcnN0T3B0aW9uRWxlbWVudCA9IHRoaXMuc2VsZWN0RWxlbWVudC5jaGlsZHJlbigpLmZpcnN0KCk7XHJcbiAgICBpZiAoZmlyc3RPcHRpb25FbGVtZW50Lmxlbmd0aCA+IDBcclxuICAgICAgJiYgdGhpcy5zZWxlY3RFbGVtZW50LmNoaWxkcmVuKCdvcHRpb25bc2VsZWN0ZWRdJykubGVuZ3RoID09PSAwXHJcbiAgICAgICYmICF0aGlzLnNlbGVjdEVsZW1lbnRbMF0uaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKGZpcnN0T3B0aW9uRWxlbWVudFswXSwgJ3NlbGVjdGVkJywgJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGlzYWJsZWQoKSB7XHJcbiAgICAvLyB3aGVuIGRpc2FibGVkIGlzIG51bGwvdW5kZWZpbmVkIHRoYXQgbWVhbnMgdGhlIHByb3BlcnR5IGhhcyBub3QgYmVlbiB1c2VkIG9uIHRoZSBlbGVtZW50XHJcbiAgICAvLyBidXQgaXQgbWlnaHQgYmUgc2V0IGJ5IGFub3RoZXIgcHJvY2VzcyAoZm9yIGV4YW1wbGUgcmVhY3RpdmUgZm9ybSBhcHBsaWVzIGRpc2FibGVkIGF0dHJpYnV0ZSBpdHNlbGYpXHJcbiAgICAvLyB0aGVyZWZvcmUgd2UgZG9uJ3Qgd2FudCB0byByZW1vdmUgb3IgYWRkIGl0IGhlcmVcclxuICAgIGlmICh0aGlzLmRpc2FibGVkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50UHJvcGVydHkodGhpcy5zZWxlY3RFbGVtZW50WzBdLCAnZGlzYWJsZWQnLCAhIXRoaXMuZGlzYWJsZWQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1hdGVyaWFsU2VsZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVMYWJlbCgpIHtcclxuICAgIGlmICh0aGlzLmxhYmVsICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kKHRoaXMubGFiZWxFbGVtZW50LCAndGV4dCcsIFt0aGlzLmxhYmVsXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWxsZWRJbigpIHtcclxuICAgIGlmICh0aGlzLmNoZWNrYm94RWxlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNoZWNrYm94RWxlbWVudHMudG9BcnJheSgpLmZvckVhY2goY2hlY2tib3hFbGVtZW50ID0+IHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyhjaGVja2JveEVsZW1lbnQsICdmaWxsZWQtaW4nLCAhIXRoaXMuZmlsbGVkSW4pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVBsYWNlaG9sZGVyKCkge1xyXG4gICAgY29uc3QgcGxhY2Vob2xkZXJFbGVtZW50ID0gdGhpcy5zZWxlY3RFbGVtZW50LmNoaWxkcmVuKCc6ZGlzYWJsZWQnKS5maXJzdCgpO1xyXG5cclxuICAgIC8vIGlmIHBsYWNlaG9sZGVyIGVsZW1lbnQgZXhpc3RzXHJcbiAgICBpZiAocGxhY2Vob2xkZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgLy8gdXBkYXRlIGV4aXN0aW5nIHBsYWNlaG9sZGVyIGVsZW1lbnRcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QocGxhY2Vob2xkZXJFbGVtZW50LCAndGV4dCcsIFt0aGlzLnBsYWNlaG9sZGVyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGV4aXN0aW5nIHBsYWNlaG9sZGVyIGVsZW1lbnRcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QocGxhY2Vob2xkZXJFbGVtZW50LCAncmVtb3ZlJyk7XHJcbiAgICAgICAgLy8gRm9yY2UgdHJpZ2dlciBjaGFuZ2UgZXZlbnQgc2luY2UgaXQncyBub3QgdHJpZ2dlcmVkIHdoZW4gdmFsdWUgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHlcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAnY2hhbmdlJyk7XHJcbiAgICAgICAgLy8gUmVxdWlyZWQgaWYgd2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gXCJFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLlwiIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzYwMDVcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAvLyBhZGQgcGxhY2Vob2xkZXIgZWxlbWVudFxyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMucGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyT3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XHJcbiAgICAgICAgcGxhY2Vob2xkZXJPcHRpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIHBsYWNlaG9sZGVyT3B0aW9uLnZhbHVlID0gbnVsbDtcclxuICAgICAgICBwbGFjZWhvbGRlck9wdGlvbi5hcHBlbmRDaGlsZChwbGFjZWhvbGRlclRleHQpO1xyXG5cclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5zZWxlY3RFbGVtZW50LCAncHJlcGVuZCcsIFtwbGFjZWhvbGRlck9wdGlvbl0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0TWF0ZXJpYWxTZWxlY3QoKTtcclxuICB9XHJcblxyXG4gIGxpc3Rlbk9wdGlvbkNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyQ29uZmlndXJhdGlvbjogTXV0YXRpb25PYnNlcnZlckluaXQgPSB7XHJcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uczogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZU1hdGVyaWFsU2VsZWN0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnNlbGVjdEVsZW1lbnRbMF0sIG11dGF0aW9uT2JzZXJ2ZXJDb25maWd1cmF0aW9uKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU1hdGVyaWFsU2VsZWN0KCkge1xyXG4gICAgdGhpcy5pbml0TWF0ZXJpYWxTZWxlY3QoKTtcclxuXHJcbiAgICBpZiAodGhpcy5maWxsZWRJbikge1xyXG4gICAgICB0aGlzLmluaXRGaWxsZWRJbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlRE9NRXZlbnRzKCk7XHJcblxyXG4gICAgLy8gd2FpdCBmb3IgbWF0ZXJpYWxpemUgc2VsZWN0IHRvIGJlIGluaXRpYWxpemVkXHJcbiAgICAvLyAvIVxcIHJhY2UgY29uZGl0aW9uIHdhcm5pbmcgLyFcXFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZS5lbWl0KCkpO1xyXG4gIH1cclxufVxyXG4iXX0=