@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>
400 lines • 26.6 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 { Radio } from './radio.component';
// tslint:disable-next-line: component-class-suffix
export class RadioGroup {
constructor() {
this.orientation = 'horizontal';
this.radioLabelPlacement = 'right';
/**
* Emits event notifying other classes of a change using a `RadioChange` class.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Set to true to disable the whole radio group
*/
this.disabled = false;
/**
* Binds 'form-item' value to the class for `RadioGroup`.
*/
this.radioButtonGroupClass = true;
/**
* To track whether the `RadioGroup` 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 `RadioGroup`.
*/
this._value = null;
/**
* The `Radio` within the `RadioGroup` that is selected.
*/
this._selected = null;
/**
* The name attribute associated with the `RadioGroup`.
*/
this._name = `radio-group-${RadioGroup.radioGroupCount++}`;
/**
* Needed to properly implement ControlValueAccessor.
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
/**
* Method set in registerOnChange to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* Sets the passed in `Radio` item as the selected input within the `RadioGroup`.
* @param {?} selected
* @return {?}
*/
set selected(selected) {
this._selected = selected;
this.value = selected ? selected.value : null;
this.checkSelectedRadio();
}
/**
* Returns the `Radio` that is selected within the `RadioGroup`.
* @return {?}
*/
get selected() {
return this._selected;
}
/**
* Sets the value/state of the selected `Radio` within the `RadioGroup` to the passed in value.
* @param {?} newValue
* @return {?}
*/
set value(newValue) {
if (this._value !== newValue) {
this._value = newValue;
this.updateSelectedRadioFromValue();
this.checkSelectedRadio();
}
}
/**
* Returns the value/state of the selected `Radio` within the `RadioGroup`.
* @return {?}
*/
get value() {
return this._value;
}
/**
* Replaces the name associated with the `RadioGroup` with the provided parameter.
* @param {?} name
* @return {?}
*/
set name(name) {
this._name = name;
this.updateRadios();
}
/**
* Returns the associated name of the `RadioGroup`.
* @return {?}
*/
get name() {
return this._name;
}
/**
* Returns the skeleton value in the `RadioGroup` if there is one.
* @return {?}
*/
get skeleton() {
return this._skeleton;
}
/**
* Sets the skeleton value for all `Radio` to the skeleton value of `RadioGroup`.
* @param {?} value
* @return {?}
*/
set skeleton(value) {
this._skeleton = value;
this.updateChildren();
}
/**
* Updates the selected `Radio` to be checked (selected).
* @return {?}
*/
checkSelectedRadio() {
if (this.selected && !this._selected.checked) {
this.selected.checked = true;
}
}
/**
* Use the value of the `RadioGroup` to update the selected radio to the right state (selected state).
* @return {?}
*/
updateSelectedRadioFromValue() {
/** @type {?} */
const alreadySelected = this._selected != null && this._selected.value === this._value;
if (this.radios && !alreadySelected) {
this._selected = null;
this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
radio => {
if (radio.checked) {
this._selected = radio;
}
}));
}
}
/**
* Creates a class of `RadioChange` to emit the change in the `RadioGroup`.
* @param {?} event
* @return {?}
*/
emitChangeEvent(event) {
this.change.emit(event);
this.propagateChange(event.value);
this.onTouched();
}
/**
* @return {?}
*/
updateRadioNames() {
console.warn('updateRadioNames had been deprecated. Use updateRadios instead');
this.updateRadios();
}
/**
* Synchronizes radio properties.
* @return {?}
*/
updateRadios() {
if (this.radios) {
setTimeout((/**
* @return {?}
*/
() => {
this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
radio => radio.name = this.name));
if (this.radioLabelPlacement === 'left') {
this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
radio => radio.labelPlacement = 'left'));
}
}));
}
}
/**
* Updates the value of the `RadioGroup` using the provided parameter.
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.value = value;
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.radios.changes.subscribe((/**
* @return {?}
*/
() => {
this.updateRadios();
this.updateRadioChangeHandler();
}));
this.updateChildren();
this.updateRadioChangeHandler();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.updateRadios();
}
/**
* Used to set method to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(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.
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @protected
* @return {?}
*/
updateChildren() {
if (this.radios) {
this.radios.forEach((/**
* @param {?} child
* @return {?}
*/
child => child.skeleton = this.skeleton));
}
}
/**
* @protected
* @return {?}
*/
updateRadioChangeHandler() {
this.radios.forEach((/**
* @param {?} radio
* @return {?}
*/
radio => {
radio.registerRadioChangeHandler((/**
* @param {?} event
* @return {?}
*/
(event) => {
// update selected and value from the event
this._selected = event.source;
this._value = event.value;
// bubble the event
this.emitChangeEvent(event);
}));
}));
}
}
RadioGroup.radioGroupCount = 0;
RadioGroup.decorators = [
{ type: Component, args: [{
selector: 'suka-radio-group',
template: `
<div
class="radio-button-group"
[ngClass]="{
'radio-button-group--vertical': orientation === 'vertical',
'radio-button-group--label-left': orientation === 'vertical' && radioLabelPlacement === 'left'
}"
role="radiogroup">
<ng-content></ng-content>
</div>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: RadioGroup,
multi: true
}
]
}] }
];
RadioGroup.propDecorators = {
orientation: [{ type: Input }],
radioLabelPlacement: [{ type: Input }],
change: [{ type: Output }],
radios: [{ type: ContentChildren, args: [forwardRef((/**
* @return {?}
*/
() => Radio)),] }],
selected: [{ type: Input }],
value: [{ type: Input }],
name: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
radioButtonGroupClass: [{ type: HostBinding, args: ['class.form-item',] }]
};
if (false) {
/** @type {?} */
RadioGroup.radioGroupCount;
/** @type {?} */
RadioGroup.prototype.orientation;
/** @type {?} */
RadioGroup.prototype.radioLabelPlacement;
/**
* Emits event notifying other classes of a change using a `RadioChange` class.
* @type {?}
*/
RadioGroup.prototype.change;
/**
* The `Radio` input items in the `RadioGroup`.
* @type {?}
*/
RadioGroup.prototype.radios;
/**
* Set to true to disable the whole radio group
* @type {?}
*/
RadioGroup.prototype.disabled;
/**
* Binds 'form-item' value to the class for `RadioGroup`.
* @type {?}
*/
RadioGroup.prototype.radioButtonGroupClass;
/**
* To track whether the `RadioGroup` has been initialized.
* @type {?}
* @protected
*/
RadioGroup.prototype.isInitialized;
/**
* Reflects whether or not the input is disabled and cannot be selected.
* @type {?}
* @protected
*/
RadioGroup.prototype._disabled;
/**
* Reflects whether or not the dropdown is loading.
* @type {?}
* @protected
*/
RadioGroup.prototype._skeleton;
/**
* The value of the selected option within the `RadioGroup`.
* @type {?}
* @protected
*/
RadioGroup.prototype._value;
/**
* The `Radio` within the `RadioGroup` that is selected.
* @type {?}
* @protected
*/
RadioGroup.prototype._selected;
/**
* The name attribute associated with the `RadioGroup`.
* @type {?}
* @protected
*/
RadioGroup.prototype._name;
/**
* Needed to properly implement ControlValueAccessor.
* @type {?}
*/
RadioGroup.prototype.onTouched;
/**
* Method set in registerOnChange to propagate changes back to the form.
* @type {?}
*/
RadioGroup.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL3JhZGlvL3JhZGlvLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFFTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUF3QjFDLG1EQUFtRDtBQUNuRCxNQUFNLE9BQU8sVUFBVTtJQXRCdkI7UUF5QlcsZ0JBQVcsR0FBOEIsWUFBWSxDQUFDO1FBRXRELHdCQUFtQixHQUFxQixPQUFPLENBQUM7Ozs7O1FBTS9DLFdBQU0sR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQzs7OztRQThEckUsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQXFCTSwwQkFBcUIsR0FBRyxJQUFJLENBQUM7Ozs7UUFLbkQsa0JBQWEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJdEIsY0FBUyxHQUFHLEtBQUssQ0FBQzs7OztRQUlsQixjQUFTLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWxCLFdBQU0sR0FBUSxJQUFJLENBQUM7Ozs7UUFJbkIsY0FBUyxHQUFVLElBQUksQ0FBQzs7OztRQUl4QixVQUFLLEdBQUcsZUFBZSxVQUFVLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQzs7OztRQThGaEUsY0FBUzs7O1FBQWMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDOzs7O1FBS2pDLG9CQUFlOzs7O1FBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBQztJQW1CcEMsQ0FBQzs7Ozs7O0lBeE5DLElBQ0ksUUFBUSxD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b250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOiB2YXJpYWJsZS1uYW1lXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgSG9zdEJpbmRpbmcsXG4gIEFmdGVyVmlld0luaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSYWRpbyB9IGZyb20gJy4vcmFkaW8uY29tcG9uZW50JztcbmltcG9ydCB7IFJhZGlvQ2hhbmdlIH0gZnJvbSAnLi9yYWRpby1jaGFuZ2UuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLXJhZGlvLWdyb3VwJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJhZGlvLWJ1dHRvbi1ncm91cFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdyYWRpby1idXR0b24tZ3JvdXAtLXZlcnRpY2FsJzogb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcsXG4gICAgICAgICdyYWRpby1idXR0b24tZ3JvdXAtLWxhYmVsLWxlZnQnOiBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJiByYWRpb0xhYmVsUGxhY2VtZW50ID09PSAnbGVmdCdcbiAgICAgIH1cIlxuICAgICAgcm9sZT1cInJhZGlvZ3JvdXBcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogUmFkaW9Hcm91cCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgUmFkaW9Hcm91cCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgc3RhdGljIHJhZGlvR3JvdXBDb3VudCA9IDA7XG5cbiAgQElucHV0KCkgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgPSAnaG9yaXpvbnRhbCc7XG5cbiAgQElucHV0KCkgcmFkaW9MYWJlbFBsYWNlbWVudDogJ3JpZ2h0JyB8ICdsZWZ0JyA9ICdyaWdodCc7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IG5vdGlmeWluZyBvdGhlciBjbGFzc2VzIG9mIGEgY2hhbmdlIHVzaW5nIGEgYFJhZGlvQ2hhbmdlYCBjbGFzcy5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4oKTtcblxuICAvKipcbiAgICogVGhlIGBSYWRpb2AgaW5wdXQgaXRlbXMgaW4gdGhlIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBSYWRpbykpIHJhZGlvczogUXVlcnlMaXN0PFJhZGlvPjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgcGFzc2VkIGluIGBSYWRpb2AgaXRlbSBhcyB0aGUgc2VsZWN0ZWQgaW5wdXQgd2l0aGluIHRoZSBgUmFkaW9Hcm91cGAuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IFJhZGlvIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgIHRoaXMuY2hlY2tTZWxlY3RlZFJhZGlvKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYFJhZGlvYCB0aGF0IGlzIHNlbGVjdGVkIHdpdGhpbiB0aGUgYFJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZS9zdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgYFJhZGlvYCB3aXRoaW4gdGhlIGBSYWRpb0dyb3VwYCB0byB0aGUgcGFzc2VkIGluIHZhbHVlLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkUmFkaW9Gcm9tVmFsdWUoKTtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZFJhZGlvKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlL3N0YXRlIG9mIHRoZSBzZWxlY3RlZCBgUmFkaW9gIHdpdGhpbiB0aGUgYFJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGBSYWRpb0dyb3VwYCB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVwZGF0ZVJhZGlvcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIG5hbWUgb2YgdGhlIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhlIHdob2xlIHJhZGlvIGdyb3VwXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBza2VsZXRvbiB2YWx1ZSBpbiB0aGUgYFJhZGlvR3JvdXBgIGlmIHRoZXJlIGlzIG9uZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBza2VsZXRvbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9za2VsZXRvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBza2VsZXRvbiB2YWx1ZSBmb3IgYWxsIGBSYWRpb2AgdG8gdGhlIHNrZWxldG9uIHZhbHVlIG9mIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIHNldCBza2VsZXRvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fc2tlbGV0b24gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgJ2Zvcm0taXRlbScgdmFsdWUgdG8gdGhlIGNsYXNzIGZvciBgUmFkaW9Hcm91cGAuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIHJhZGlvQnV0dG9uR3JvdXBDbGFzcyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRvIHRyYWNrIHdoZXRoZXIgdGhlIGBSYWRpb0dyb3VwYCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIHByb3RlY3RlZCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBzZWxlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlZmxlY3RzIHdoZXRoZXIgb3Igbm90IHRoZSBkcm9wZG93biBpcyBsb2FkaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9za2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gd2l0aGluIHRoZSBgUmFkaW9Hcm91cGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnkgPSBudWxsO1xuICAvKipcbiAgICogVGhlIGBSYWRpb2Agd2l0aGluIHRoZSBgUmFkaW9Hcm91cGAgdGhhdCBpcyBzZWxlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfc2VsZWN0ZWQ6IFJhZGlvID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGBSYWRpb0dyb3VwYC5cbiAgICovXG4gIHByb3RlY3RlZCBfbmFtZSA9IGByYWRpby1ncm91cC0ke1JhZGlvR3JvdXAucmFkaW9Hcm91cENvdW50Kyt9YDtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc2VsZWN0ZWQgYFJhZGlvYCB0byBiZSBjaGVja2VkIChzZWxlY3RlZCkuXG4gICAqL1xuICBjaGVja1NlbGVjdGVkUmFkaW8oKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQgJiYgIXRoaXMuX3NlbGVjdGVkLmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQuY2hlY2tlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgdmFsdWUgb2YgdGhlIGBSYWRpb0dyb3VwYCB0byB1cGRhdGUgdGhlIHNlbGVjdGVkIHJhZGlvIHRvIHRoZSByaWdodCBzdGF0ZSAoc2VsZWN0ZWQgc3RhdGUpLlxuICAgKi9cbiAgdXBkYXRlU2VsZWN0ZWRSYWRpb0Zyb21WYWx1ZSgpIHtcbiAgICBjb25zdCBhbHJlYWR5U2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZCAhPSBudWxsICYmIHRoaXMuX3NlbGVjdGVkLnZhbHVlID09PSB0aGlzLl92YWx1ZTtcblxuICAgIGlmICh0aGlzLnJhZGlvcyAmJiAhYWxyZWFkeVNlbGVjdGVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgICB0aGlzLnJhZGlvcy5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgICAgaWYgKHJhZGlvLmNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHJhZGlvO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsYXNzIG9mIGBSYWRpb0NoYW5nZWAgdG8gZW1pdCB0aGUgY2hhbmdlIGluIHRoZSBgUmFkaW9Hcm91cGAuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoZXZlbnQ6IFJhZGlvQ2hhbmdlKSB7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoZXZlbnQudmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICB1cGRhdGVSYWRpb05hbWVzKCkge1xuICAgIGNvbnNvbGUud2FybigndXBkYXRlUmFkaW9OYW1lcyBoYWQgYmVlbiBkZXByZWNhdGVkLiBVc2UgdXBkYXRlUmFkaW9zIGluc3RlYWQnKTtcbiAgICB0aGlzLnVwZGF0ZVJhZGlvcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyByYWRpbyBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgdXBkYXRlUmFkaW9zKCkge1xuICAgIGlmICh0aGlzLnJhZGlvcykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmFkaW9zLmZvckVhY2gocmFkaW8gPT4gcmFkaW8ubmFtZSA9IHRoaXMubmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvTGFiZWxQbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIHRoaXMucmFkaW9zLmZvckVhY2gocmFkaW8gPT4gcmFkaW8ubGFiZWxQbGFjZW1lbnQgPSAnbGVmdCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIGBSYWRpb0dyb3VwYCB1c2luZyB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMucmFkaW9zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUmFkaW9zKCk7XG4gICAgICB0aGlzLnVwZGF0ZVJhZGlvQ2hhbmdlSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVDaGlsZHJlbigpO1xuICAgIHRoaXMudXBkYXRlUmFkaW9DaGFuZ2VIYW5kbGVyKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVSYWRpb3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCBtZXRob2QgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hlY2tib3ggaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gcmVnaXN0ZXJPbkNoYW5nZSB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuXG4gIHByb3RlY3RlZCB1cGRhdGVDaGlsZHJlbigpIHtcbiAgICBpZiAodGhpcy5yYWRpb3MpIHtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goY2hpbGQgPT4gY2hpbGQuc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlUmFkaW9DaGFuZ2VIYW5kbGVyKCkge1xuICAgIHRoaXMucmFkaW9zLmZvckVhY2gocmFkaW8gPT4ge1xuICAgICAgcmFkaW8ucmVnaXN0ZXJSYWRpb0NoYW5nZUhhbmRsZXIoKGV2ZW50OiBSYWRpb0NoYW5nZSkgPT4ge1xuICAgICAgICAvLyB1cGRhdGUgc2VsZWN0ZWQgYW5kIHZhbHVlIGZyb20gdGhlIGV2ZW50XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZXZlbnQuc291cmNlO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAvLyBidWJibGUgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=