@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
492 lines • 31.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// tslint:disable: variable-name
import { ContentChildren, Component, EventEmitter, forwardRef, Input, Output, QueryList, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ButtonRadio } from './button-radio.component';
var ButtonRadioGroup = /** @class */ (function () {
function ButtonRadioGroup() {
/**
* Emits event notifying other classes of a change using a `ButtonRadioChange` class.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Set to true to disable the whole buttonRadio group
*/
this.disabled = false;
/**
* Binds 'form-item' value to the class for `ButtonRadioGroup`.
*/
this.buttonRadioButtonGroupClass = true;
/**
* To track whether the `ButtonRadioGroup` has been initialized.
*/
this.isInitialized = false;
/**
* Reflects whether or not the input is disabled and cannot be selected.
*/
this._disabled = false;
/**
* Reflects whether or not the dropdown is loading.
*/
this._skeleton = false;
/**
* The value of the selected option within the `ButtonRadioGroup`.
*/
this._value = null;
/**
* The `ButtonRadio` within the `ButtonRadioGroup` that is selected.
*/
this._selected = null;
/**
* The name attribute associated with the `ButtonRadioGroup`.
*/
this._name = "button-radio-group-" + ButtonRadioGroup.buttonRadioGroupCount++;
/**
* Needed to properly implement ControlValueAccessor.
*/
this.onTouched = (/**
* @return {?}
*/
function () { });
/**
* Method set in registerOnChange to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
}
Object.defineProperty(ButtonRadioGroup.prototype, "selected", {
/**
* Returns the `ButtonRadio` that is selected within the `ButtonRadioGroup`.
*/
get: /**
* Returns the `ButtonRadio` that is selected within the `ButtonRadioGroup`.
* @return {?}
*/
function () {
return this._selected;
},
/**
* Sets the passed in `ButtonRadio` item as the selected input within the `ButtonRadioGroup`.
*/
set: /**
* Sets the passed in `ButtonRadio` item as the selected input within the `ButtonRadioGroup`.
* @param {?} selected
* @return {?}
*/
function (selected) {
this._selected = selected;
this.value = selected ? selected.value : null;
this.checkSelectedButtonRadio();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ButtonRadioGroup.prototype, "value", {
/**
* Returns the value/state of the selected `ButtonRadio` within the `ButtonRadioGroup`.
*/
get: /**
* Returns the value/state of the selected `ButtonRadio` within the `ButtonRadioGroup`.
* @return {?}
*/
function () {
return this._value;
},
/**
* Sets the value/state of the selected `ButtonRadio` within the `ButtonRadioGroup` to the passed in value.
*/
set: /**
* Sets the value/state of the selected `ButtonRadio` within the `ButtonRadioGroup` to the passed in value.
* @param {?} newValue
* @return {?}
*/
function (newValue) {
if (this._value !== newValue) {
this._value = newValue;
this.updateSelectedButtonRadioFromValue();
this.checkSelectedButtonRadio();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ButtonRadioGroup.prototype, "name", {
/**
* Returns the associated name of the `ButtonRadioGroup`.
*/
get: /**
* Returns the associated name of the `ButtonRadioGroup`.
* @return {?}
*/
function () {
return this._name;
},
/**
* Replaces the name associated with the `ButtonRadioGroup` with the provided parameter.
*/
set: /**
* Replaces the name associated with the `ButtonRadioGroup` with the provided parameter.
* @param {?} name
* @return {?}
*/
function (name) {
this._name = name;
this.updateButtonRadios();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ButtonRadioGroup.prototype, "skeleton", {
/**
* Returns the skeleton value in the `ButtonRadioGroup` if there is one.
*/
get: /**
* Returns the skeleton value in the `ButtonRadioGroup` if there is one.
* @return {?}
*/
function () {
return this._skeleton;
},
/**
* Sets the skeleton value for all `ButtonRadio` to the skeleton value of `ButtonRadioGroup`.
*/
set: /**
* Sets the skeleton value for all `ButtonRadio` to the skeleton value of `ButtonRadioGroup`.
* @param {?} value
* @return {?}
*/
function (value) {
this._skeleton = value;
this.updateChildren();
},
enumerable: true,
configurable: true
});
/**
* Updates the selected `ButtonRadio` to be checked (selected).
*/
/**
* Updates the selected `ButtonRadio` to be checked (selected).
* @return {?}
*/
ButtonRadioGroup.prototype.checkSelectedButtonRadio = /**
* Updates the selected `ButtonRadio` to be checked (selected).
* @return {?}
*/
function () {
if (this.selected && !this._selected.checked) {
this.selected.checked = true;
}
};
/**
* Use the value of the `ButtonRadioGroup` to update the selected buttonRadio to the right state (selected state).
*/
/**
* Use the value of the `ButtonRadioGroup` to update the selected buttonRadio to the right state (selected state).
* @return {?}
*/
ButtonRadioGroup.prototype.updateSelectedButtonRadioFromValue = /**
* Use the value of the `ButtonRadioGroup` to update the selected buttonRadio to the right state (selected state).
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var alreadySelected = this._selected != null && this._selected.value === this._value;
if (this.buttonRadios && !alreadySelected) {
this._selected = null;
this.buttonRadios.forEach((/**
* @param {?} buttonRadio
* @return {?}
*/
function (buttonRadio) {
if (buttonRadio.checked) {
_this._selected = buttonRadio;
}
}));
}
};
/**
* Creates a class of `ButtonRadioChange` to emit the change in the `ButtonRadioGroup`.
*/
/**
* Creates a class of `ButtonRadioChange` to emit the change in the `ButtonRadioGroup`.
* @param {?} event
* @return {?}
*/
ButtonRadioGroup.prototype.emitChangeEvent = /**
* Creates a class of `ButtonRadioChange` to emit the change in the `ButtonRadioGroup`.
* @param {?} event
* @return {?}
*/
function (event) {
this.change.emit(event);
this.propagateChange(event.value);
this.onTouched();
};
/**
* @return {?}
*/
ButtonRadioGroup.prototype.updateButtonRadioNames = /**
* @return {?}
*/
function () {
console.warn('updateButtonRadioNames had been deprecated. Use updateButtonRadios instead');
this.updateButtonRadios();
};
/**
* Synchronizes buttonRadio properties.
*/
/**
* Synchronizes buttonRadio properties.
* @return {?}
*/
ButtonRadioGroup.prototype.updateButtonRadios = /**
* Synchronizes buttonRadio properties.
* @return {?}
*/
function () {
var _this = this;
if (this.buttonRadios) {
setTimeout((/**
* @return {?}
*/
function () {
_this.buttonRadios.forEach((/**
* @param {?} buttonRadio
* @return {?}
*/
function (buttonRadio) { return buttonRadio.name = _this.name; }));
}));
}
};
/**
* Updates the value of the `ButtonRadioGroup` using the provided parameter.
*/
/**
* Updates the value of the `ButtonRadioGroup` using the provided parameter.
* @param {?} value
* @return {?}
*/
ButtonRadioGroup.prototype.writeValue = /**
* Updates the value of the `ButtonRadioGroup` using the provided parameter.
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
};
/**
* @return {?}
*/
ButtonRadioGroup.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
this.buttonRadios.changes.subscribe((/**
* @return {?}
*/
function () {
_this.updateButtonRadios();
_this.updateButtonRadioChangeHandler();
}));
this.updateChildren();
this.updateButtonRadioChangeHandler();
};
/**
* @return {?}
*/
ButtonRadioGroup.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.updateButtonRadios();
};
/**
* Used to set method to propagate changes back to the form.
*/
/**
* Used to set method to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
ButtonRadioGroup.prototype.registerOnChange = /**
* Used to set method to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.propagateChange = fn;
};
/**
* Registers a callback to be triggered when the control has been touched.
* @param fn Callback to be triggered when the checkbox is touched.
*/
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
ButtonRadioGroup.prototype.registerOnTouched = /**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @protected
* @return {?}
*/
ButtonRadioGroup.prototype.updateChildren = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
if (this.buttonRadios) {
this.buttonRadios.forEach((/**
* @param {?} child
* @return {?}
*/
function (child) { return child.skeleton = _this.skeleton; }));
}
};
/**
* @protected
* @return {?}
*/
ButtonRadioGroup.prototype.updateButtonRadioChangeHandler = /**
* @protected
* @return {?}
*/
function () {
var _this = this;
this.buttonRadios.forEach((/**
* @param {?} buttonRadio
* @return {?}
*/
function (buttonRadio) {
buttonRadio.registerButtonRadioChangeHandler((/**
* @param {?} event
* @return {?}
*/
function (event) {
// update selected and value from the event
_this._selected = event.source;
_this._value = event.value;
// bubble the event
_this.emitChangeEvent(event);
}));
}));
};
ButtonRadioGroup.buttonRadioGroupCount = 0;
ButtonRadioGroup.decorators = [
{ type: Component, args: [{
selector: 'suka-button-radio-group',
template: "\n <div\n class=\"button-radio-group\"\n role=\"buttonRadiogroup\">\n <ng-content></ng-content>\n </div>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: ButtonRadioGroup,
multi: true
}
]
}] }
];
ButtonRadioGroup.propDecorators = {
change: [{ type: Output }],
buttonRadios: [{ type: ContentChildren, args: [forwardRef((/**
* @return {?}
*/
function () { return ButtonRadio; })),] }],
selected: [{ type: Input }],
value: [{ type: Input }],
name: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
buttonRadioButtonGroupClass: [{ type: HostBinding, args: ['class.form-item',] }]
};
return ButtonRadioGroup;
}());
export { ButtonRadioGroup };
if (false) {
/** @type {?} */
ButtonRadioGroup.buttonRadioGroupCount;
/**
* Emits event notifying other classes of a change using a `ButtonRadioChange` class.
* @type {?}
*/
ButtonRadioGroup.prototype.change;
/**
* The `ButtonRadio` input items in the `ButtonRadioGroup`.
* @type {?}
*/
ButtonRadioGroup.prototype.buttonRadios;
/**
* Set to true to disable the whole buttonRadio group
* @type {?}
*/
ButtonRadioGroup.prototype.disabled;
/**
* Binds 'form-item' value to the class for `ButtonRadioGroup`.
* @type {?}
*/
ButtonRadioGroup.prototype.buttonRadioButtonGroupClass;
/**
* To track whether the `ButtonRadioGroup` has been initialized.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype.isInitialized;
/**
* Reflects whether or not the input is disabled and cannot be selected.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._disabled;
/**
* Reflects whether or not the dropdown is loading.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._skeleton;
/**
* The value of the selected option within the `ButtonRadioGroup`.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._value;
/**
* The `ButtonRadio` within the `ButtonRadioGroup` that is selected.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._selected;
/**
* The name attribute associated with the `ButtonRadioGroup`.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._name;
/**
* Needed to properly implement ControlValueAccessor.
* @type {?}
*/
ButtonRadioGroup.prototype.onTouched;
/**
* Method set in registerOnChange to propagate changes back to the form.
* @type {?}
*/
ButtonRadioGroup.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLXJhZGlvLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9idXR0b24tcmFkaW8vYnV0dG9uLXJhZGlvLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFFTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHdkQ7SUFBQTs7Ozs7UUF5QlksV0FBTSxHQUFvQyxJQUFJLFlBQVksRUFBcUIsQ0FBQzs7OztRQThEakYsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQXFCTSxnQ0FBMkIsR0FBRyxJQUFJLENBQUM7Ozs7UUFLekQsa0JBQWEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJdEIsY0FBUyxHQUFHLEtBQUssQ0FBQzs7OztRQUlsQixjQUFTLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWxCLFdBQU0sR0FBUSxJQUFJLENBQUM7Ozs7UUFJbkIsY0FBUyxHQUFnQixJQUFJLENBQUM7Ozs7UUFJOUIsVUFBSyxHQUFHLHdCQUFzQixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBSSxDQUFDOzs7O1FBMkZuRixjQUFTOzs7UUFBYyxjQUFRLENBQUMsRUFBQzs7OztRQUtqQyxvQkFBZTs7OztRQUFHLFVBQUMsQ0FBTSxJQUFPLENBQUMsRUFBQztJQW1CcEMsQ0FBQztJQXJOQyxzQkFDSSxzQ0FBUTtRQU1aOztXQUVHOzs7OztRQUNIO1lBQ0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7UUFmRDs7V0FFRzs7Ozs7O1FBQ0gsVUFDYSxR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NUIscUNBQTRCOzs7Ozs7SUFJNUIsa0NBQTZCOzs7Ozs7SUFJN0IscUNBQXdDOzs7Ozs7SUFJeEMsaUNBQW1GOzs7OztJQTJGbkYscUNBQWlDOzs7OztJQUtqQywyQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTogdmFyaWFibGUtbmFtZVxuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIEhvc3RCaW5kaW5nLFxuICBBZnRlclZpZXdJbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQnV0dG9uUmFkaW8gfSBmcm9tICcuL2J1dHRvbi1yYWRpby5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uUmFkaW9DaGFuZ2UgfSBmcm9tICcuL2J1dHRvbi1yYWRpby1jaGFuZ2UuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWJ1dHRvbi1yYWRpby1ncm91cCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJidXR0b24tcmFkaW8tZ3JvdXBcIlxuICAgICAgcm9sZT1cImJ1dHRvblJhZGlvZ3JvdXBcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogQnV0dG9uUmFkaW9Hcm91cCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQnV0dG9uUmFkaW9Hcm91cCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgc3RhdGljIGJ1dHRvblJhZGlvR3JvdXBDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IG5vdGlmeWluZyBvdGhlciBjbGFzc2VzIG9mIGEgY2hhbmdlIHVzaW5nIGEgYEJ1dHRvblJhZGlvQ2hhbmdlYCBjbGFzcy5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8QnV0dG9uUmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxCdXR0b25SYWRpb0NoYW5nZT4oKTtcblxuICAvKipcbiAgICogVGhlIGBCdXR0b25SYWRpb2AgaW5wdXQgaXRlbXMgaW4gdGhlIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBCdXR0b25SYWRpbykpIGJ1dHRvblJhZGlvczogUXVlcnlMaXN0PEJ1dHRvblJhZGlvPjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgcGFzc2VkIGluIGBCdXR0b25SYWRpb2AgaXRlbSBhcyB0aGUgc2VsZWN0ZWQgaW5wdXQgd2l0aGluIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IEJ1dHRvblJhZGlvIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgIHRoaXMuY2hlY2tTZWxlY3RlZEJ1dHRvblJhZGlvKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYEJ1dHRvblJhZGlvYCB0aGF0IGlzIHNlbGVjdGVkIHdpdGhpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZS9zdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgYEJ1dHRvblJhZGlvYCB3aXRoaW4gdGhlIGBCdXR0b25SYWRpb0dyb3VwYCB0byB0aGUgcGFzc2VkIGluIHZhbHVlLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQnV0dG9uUmFkaW9Gcm9tVmFsdWUoKTtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZEJ1dHRvblJhZGlvKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlL3N0YXRlIG9mIHRoZSBzZWxlY3RlZCBgQnV0dG9uUmFkaW9gIHdpdGhpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGBCdXR0b25SYWRpb0dyb3VwYCB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblJhZGlvcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIG5hbWUgb2YgdGhlIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhlIHdob2xlIGJ1dHRvblJhZGlvIGdyb3VwXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBza2VsZXRvbiB2YWx1ZSBpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgIGlmIHRoZXJlIGlzIG9uZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBza2VsZXRvbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9za2VsZXRvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBza2VsZXRvbiB2YWx1ZSBmb3IgYWxsIGBCdXR0b25SYWRpb2AgdG8gdGhlIHNrZWxldG9uIHZhbHVlIG9mIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIHNldCBza2VsZXRvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fc2tlbGV0b24gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgJ2Zvcm0taXRlbScgdmFsdWUgdG8gdGhlIGNsYXNzIGZvciBgQnV0dG9uUmFkaW9Hcm91cGAuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIGJ1dHRvblJhZGlvQnV0dG9uR3JvdXBDbGFzcyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRvIHRyYWNrIHdoZXRoZXIgdGhlIGBCdXR0b25SYWRpb0dyb3VwYCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIHByb3RlY3RlZCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBzZWxlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlZmxlY3RzIHdoZXRoZXIgb3Igbm90IHRoZSBkcm9wZG93biBpcyBsb2FkaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9za2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gd2l0aGluIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnkgPSBudWxsO1xuICAvKipcbiAgICogVGhlIGBCdXR0b25SYWRpb2Agd2l0aGluIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAgdGhhdCBpcyBzZWxlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfc2VsZWN0ZWQ6IEJ1dHRvblJhZGlvID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIHByb3RlY3RlZCBfbmFtZSA9IGBidXR0b24tcmFkaW8tZ3JvdXAtJHtCdXR0b25SYWRpb0dyb3VwLmJ1dHRvblJhZGlvR3JvdXBDb3VudCsrfWA7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGBCdXR0b25SYWRpb2AgdG8gYmUgY2hlY2tlZCAoc2VsZWN0ZWQpLlxuICAgKi9cbiAgY2hlY2tTZWxlY3RlZEJ1dHRvblJhZGlvKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RlZC5jaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkLmNoZWNrZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHZhbHVlIG9mIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAgdG8gdXBkYXRlIHRoZSBzZWxlY3RlZCBidXR0b25SYWRpbyB0byB0aGUgcmlnaHQgc3RhdGUgKHNlbGVjdGVkIHN0YXRlKS5cbiAgICovXG4gIHVwZGF0ZVNlbGVjdGVkQnV0dG9uUmFkaW9Gcm9tVmFsdWUoKSB7XG4gICAgY29uc3QgYWxyZWFkeVNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQgIT0gbnVsbCAmJiB0aGlzLl9zZWxlY3RlZC52YWx1ZSA9PT0gdGhpcy5fdmFsdWU7XG5cbiAgICBpZiAodGhpcy5idXR0b25SYWRpb3MgJiYgIWFscmVhZHlTZWxlY3RlZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgdGhpcy5idXR0b25SYWRpb3MuZm9yRWFjaChidXR0b25SYWRpbyA9PiB7XG4gICAgICAgIGlmIChidXR0b25SYWRpby5jaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBidXR0b25SYWRpbztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjbGFzcyBvZiBgQnV0dG9uUmFkaW9DaGFuZ2VgIHRvIGVtaXQgdGhlIGNoYW5nZSBpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZW1pdENoYW5nZUV2ZW50KGV2ZW50OiBCdXR0b25SYWRpb0NoYW5nZSkge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgdXBkYXRlQnV0dG9uUmFkaW9OYW1lcygpIHtcbiAgICBjb25zb2xlLndhcm4oJ3VwZGF0ZUJ1dHRvblJhZGlvTmFtZXMgaGFkIGJlZW4gZGVwcmVjYXRlZC4gVXNlIHVwZGF0ZUJ1dHRvblJhZGlvcyBpbnN0ZWFkJyk7XG4gICAgdGhpcy51cGRhdGVCdXR0b25SYWRpb3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgYnV0dG9uUmFkaW8gcHJvcGVydGllcy5cbiAgICovXG4gIHVwZGF0ZUJ1dHRvblJhZGlvcygpIHtcbiAgICBpZiAodGhpcy5idXR0b25SYWRpb3MpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmJ1dHRvblJhZGlvcy5mb3JFYWNoKGJ1dHRvblJhZGlvID0+IGJ1dHRvblJhZGlvLm5hbWUgPSB0aGlzLm5hbWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAgdXNpbmcgdGhlIHByb3ZpZGVkIHBhcmFtZXRlci5cbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmJ1dHRvblJhZGlvcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUJ1dHRvblJhZGlvcygpO1xuICAgICAgdGhpcy51cGRhdGVCdXR0b25SYWRpb0NoYW5nZUhhbmRsZXIoKTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4oKTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblJhZGlvQ2hhbmdlSGFuZGxlcigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlQnV0dG9uUmFkaW9zKCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBzZXQgbWV0aG9kIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNoZWNrYm94IGlzIHRvdWNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogTmVlZGVkIHRvIHByb3Blcmx5IGltcGxlbWVudCBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuXG4gIC8qKlxuICAgKiBNZXRob2Qgc2V0IGluIHJlZ2lzdGVyT25DaGFuZ2UgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcblxuICBwcm90ZWN0ZWQgdXBkYXRlQ2hpbGRyZW4oKSB7XG4gICAgaWYgKHRoaXMuYnV0dG9uUmFkaW9zKSB7XG4gICAgICB0aGlzLmJ1dHRvblJhZGlvcy5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnNrZWxldG9uID0gdGhpcy5za2VsZXRvbik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZUJ1dHRvblJhZGlvQ2hhbmdlSGFuZGxlcigpIHtcbiAgICB0aGlzLmJ1dHRvblJhZGlvcy5mb3JFYWNoKGJ1dHRvblJhZGlvID0+IHtcbiAgICAgIGJ1dHRvblJhZGlvLnJlZ2lzdGVyQnV0dG9uUmFkaW9DaGFuZ2VIYW5kbGVyKChldmVudDogQnV0dG9uUmFkaW9DaGFuZ2UpID0+IHtcbiAgICAgICAgLy8gdXBkYXRlIHNlbGVjdGVkIGFuZCB2YWx1ZSBmcm9tIHRoZSBldmVudFxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGV2ZW50LnNvdXJjZTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBldmVudC52YWx1ZTtcbiAgICAgICAgLy8gYnViYmxlIHRoZSBldmVudFxuICAgICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudChldmVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19