@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>
338 lines • 26.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, HostBinding, EventEmitter, Output, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { NumberChange } from './number-change.class';
var Number = /** @class */ (function () {
/**
* Creates an instance of `Number`.
*/
function Number() {
this.containerClass = true;
/**
* Set to `true` for a disabled number input.
*/
this.disabled = false;
/**
* Set to `true` for a loading number component.
*/
this.skeleton = false;
/**
* Set to `true` for an invalid number component.
*/
this.invalid = false;
/**
* Set to `true` for a valid number component.
*/
this.valid = false;
/**
* The unique id for the number component.
*/
this.id = "number-input-" + Number.numberCount;
/**
* Sets the value attribute on the `input` element.
*/
this.value = 0;
/**
* Sets the min attribute on the `input` element.
*/
this.min = null;
/**
* Sets the max attribute on the `input` element.
*/
this.max = null;
/**
* Emits event notifying other classes when a change in state occurs in the input.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Called when number input is blurred. 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 (_) { });
Number.numberCount++;
}
/**
* This is the initial value set to the component
* @param value The input value.
*/
/**
* This is the initial value set to the component
* @param {?} value The input value.
* @return {?}
*/
Number.prototype.writeValue = /**
* This is the initial value set to the component
* @param {?} value The input value.
* @return {?}
*/
function (value) {
this.value = value;
};
/**
* Sets a method in order to propagate changes back to the form.
*/
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
Number.prototype.registerOnChange = /**
* Sets a method in order 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 number input is touched.
*/
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the number input is touched.
* @return {?}
*/
Number.prototype.registerOnTouched = /**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the number input is touched.
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* Sets the disabled state through the model
*/
/**
* Sets the disabled state through the model
* @param {?} isDisabled
* @return {?}
*/
Number.prototype.setDisabledState = /**
* Sets the disabled state through the model
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/**
* Adds 1 to the current `value`.
*/
/**
* Adds 1 to the current `value`.
* @return {?}
*/
Number.prototype.onIncrement = /**
* Adds 1 to the current `value`.
* @return {?}
*/
function () {
if (this.max === null || this.value < this.max) {
this.value++;
this.emitChangeEvent();
}
};
/**
* Subtracts 1 to the current `value`.
*/
/**
* Subtracts 1 to the current `value`.
* @return {?}
*/
Number.prototype.onDecrement = /**
* Subtracts 1 to the current `value`.
* @return {?}
*/
function () {
if (this.min === null || this.value > this.min) {
this.value--;
this.emitChangeEvent();
}
};
/**
* Creates a class of `NumberChange` to emit the change in the `Number`.
*/
/**
* Creates a class of `NumberChange` to emit the change in the `Number`.
* @return {?}
*/
Number.prototype.emitChangeEvent = /**
* Creates a class of `NumberChange` to emit the change in the `Number`.
* @return {?}
*/
function () {
/** @type {?} */
var event = new NumberChange();
event.source = this;
event.value = this.value;
this.change.emit(event);
this.propagateChange(this.value);
};
/**
* @param {?} event
* @return {?}
*/
Number.prototype.onNumberInputChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.value = event.target.value;
this.emitChangeEvent();
};
/**
* @param {?} value
* @return {?}
*/
Number.prototype.isTemplate = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value instanceof TemplateRef;
};
/**
* Variable used for creating unique ids for number input components.
*/
Number.numberCount = 0;
Number.decorators = [
{ type: Component, args: [{
selector: 'suka-number',
template: "\n <label *ngIf=\"skeleton && label\" class=\"label skeleton\"></label>\n <label *ngIf=\"!skeleton && label\" [for]=\"id\" class=\"label\">\n <ng-container *ngIf=\"!isTemplate(label)\">{{label}}</ng-container>\n <ng-template *ngIf=\"isTemplate(label)\" [ngTemplateOutlet]=\"label\"></ng-template>\n </label>\n <div *ngIf=\"!skeleton && helperText\" class=\"form__helper-text\">\n <ng-container *ngIf=\"!isTemplate(helperText)\">{{helperText}}</ng-container>\n <ng-template *ngIf=\"isTemplate(helperText)\" [ngTemplateOutlet]=\"helperText\"></ng-template>\n </div>\n <div\n data-numberinput\n [attr.data-invalid]=\"(invalid ? true : null)\"\n [attr.data-valid]=\"(valid ? true : null)\"\n class=\"number-input\"\n [ngClass]=\"{\n 'number-input--nolabel': !label,\n 'number-input--helpertext': helperText,\n 'skeleton' : skeleton,\n 'number-input--disabled': disabled\n }\">\n <div class=\"number-input__input-wrapper\">\n <span class=\"number-input__prefix\" *ngIf=\"!skeleton && prefix\">\n <ng-container *ngIf=\"!isTemplate(prefix)\">{{prefix}}</ng-container>\n <ng-template *ngIf=\"isTemplate(prefix)\" [ngTemplateOutlet]=\"prefix\"></ng-template>\n </span>\n <input\n type=\"number\"\n [id]=\"id\"\n [value]=\"value\"\n [attr.min]=\"min\"\n [attr.max]=\"max\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (input)=\"onNumberInputChange($event)\"/>\n <suka-icon *ngIf=\"!skeleton && invalid\" icon=\"alert-circle\" class=\"number-input__invalid\"></suka-icon>\n <suka-icon *ngIf=\"!skeleton && valid\" icon=\"check\" class=\"number-input__valid\"></suka-icon>\n <div *ngIf=\"!skeleton\" class=\"number-input__controls\">\n <button\n class=\"number-input__control-btn up-icon\"\n type=\"button\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n (click)=\"onIncrement()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\" height=\"16\" width=\"16\"><path fill=\"currentColor\" d=\"M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z\"></path></svg>\n </button>\n <button\n class=\"number-input__control-btn down-icon\"\n type=\"button\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n (click)=\"onDecrement()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\" height=\"16\" width=\"16\"><path fill=\"currentColor\" d=\"M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\"></path></svg>\n </button>\n </div>\n </div>\n <div *ngIf=\"invalid\" class=\"form-requirement\">\n <ng-container *ngIf=\"!isTemplate(invalidText)\">{{invalidText}}</ng-container>\n <ng-template *ngIf=\"isTemplate(invalidText)\" [ngTemplateOutlet]=\"invalidText\"></ng-template>\n </div>\n </div>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Number,
multi: true
}
]
}] }
];
/** @nocollapse */
Number.ctorParameters = function () { return []; };
Number.propDecorators = {
containerClass: [{ type: HostBinding, args: ['class.form-item',] }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
invalid: [{ type: Input }],
valid: [{ type: Input }],
id: [{ type: Input }],
required: [{ type: Input }],
value: [{ type: Input }],
min: [{ type: Input }],
max: [{ type: Input }],
label: [{ type: Input }],
prefix: [{ type: Input }],
helperText: [{ type: Input }],
invalidText: [{ type: Input }],
change: [{ type: Output }]
};
return Number;
}());
export { Number };
if (false) {
/**
* Variable used for creating unique ids for number input components.
* @type {?}
*/
Number.numberCount;
/** @type {?} */
Number.prototype.containerClass;
/**
* Set to `true` for a disabled number input.
* @type {?}
*/
Number.prototype.disabled;
/**
* Set to `true` for a loading number component.
* @type {?}
*/
Number.prototype.skeleton;
/**
* Set to `true` for an invalid number component.
* @type {?}
*/
Number.prototype.invalid;
/**
* Set to `true` for a valid number component.
* @type {?}
*/
Number.prototype.valid;
/**
* The unique id for the number component.
* @type {?}
*/
Number.prototype.id;
/**
* Reflects the required attribute of the `input` element.
* @type {?}
*/
Number.prototype.required;
/**
* Sets the value attribute on the `input` element.
* @type {?}
*/
Number.prototype.value;
/**
* Sets the min attribute on the `input` element.
* @type {?}
*/
Number.prototype.min;
/**
* Sets the max attribute on the `input` element.
* @type {?}
*/
Number.prototype.max;
/**
* Sets the text inside the `label` tag.
* @type {?}
*/
Number.prototype.label;
/**
* Sets the a prefix for the input wrapper.
* @type {?}
*/
Number.prototype.prefix;
/**
* Sets the optional helper text.
* @type {?}
*/
Number.prototype.helperText;
/**
* Sets the invalid text.
* @type {?}
*/
Number.prototype.invalidText;
/**
* Emits event notifying other classes when a change in state occurs in the input.
* @type {?}
*/
Number.prototype.change;
/**
* Called when number input is blurred. Needed to properly implement `ControlValueAccessor`.
* @type {?}
*/
Number.prototype.onTouched;
/**
* Method set in `registerOnChange` to propagate changes back to the form.
* @type {?}
*/
Number.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9udW1iZXItaW5wdXQvbnVtYmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQ7SUEwSUU7O09BRUc7SUFDSDtRQTlEZ0MsbUJBQWMsR0FBRyxJQUFJLENBQUM7Ozs7UUFJN0MsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLFlBQU8sR0FBRyxLQUFLLENBQUM7Ozs7UUFJaEIsVUFBSyxHQUFHLEtBQUssQ0FBQzs7OztRQUlkLE9BQUUsR0FBRyxrQkFBZ0IsTUFBTSxDQUFDLFdBQWEsQ0FBQzs7OztRQVExQyxVQUFLLEdBQUcsQ0FBQyxDQUFDOzs7O1FBSVYsUUFBRyxHQUFHLElBQUksQ0FBQzs7OztRQUlYLFFBQUcsR0FBRyxJQUFJLENBQUM7Ozs7O1FBcUJWLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQzs7OztRQTBDcEQsY0FBUzs7O1FBQWMsY0FBUSxDQUFDLEVBQUM7Ozs7UUFLakMsb0JBQWU7Ozs7UUFBRyxVQUFDLENBQU0sSUFBTyxDQUFDLEVBQUM7UUF6Q2hDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSSwyQkFBVTs7Ozs7SUFBakIsVUFBa0IsS0FBVTtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7Ozs7OztJQUNJLGlDQUFnQjs7Ozs7SUFBdkIsVUFBd0IsRUFBTztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSSxrQ0FBaUI7Ozs7O0lBQXhCLFVBQXlCLEVBQU87UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSCxpQ0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFZRDs7T0FFRzs7Ozs7SUFDSCw0QkFBVzs7OztJQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNILDRCQUFXOzs7O0lBQVg7UUFDRSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM5QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsZ0NBQWU7Ozs7SUFBZjs7WUFDUSxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUU7UUFDaEMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEIsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7Ozs7O0lBRUQsb0NBQW1COzs7O0lBQW5CLFVBQW9CLEtBQUs7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7Ozs7SUFFTSwyQkFBVTs7OztJQUFqQixVQUFrQixLQUFLO1FBQ3JCLE9BQU8sS0FBSyxZQUFZLFdBQVcsQ0FBQztJQUN0QyxDQUFDOzs7O0lBbEpNLGtCQUFXLEdBQUcsQ0FBQyxDQUFDOztnQkE3RXhCLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsUUFBUSxFQUFFLHFxR0E2RFQ7b0JBQ0QsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxNQUFNOzRCQUNuQixLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7Ozs7aUNBUUUsV0FBVyxTQUFDLGlCQUFpQjsyQkFJN0IsS0FBSzsyQkFJTCxLQUFLOzBCQUlMLEtBQUs7d0JBSUwsS0FBSztxQkFJTCxLQUFLOzJCQUlMLEtBQUs7d0JBSUwsS0FBSztzQkFJTCxLQUFLO3NCQUlMLEtBQUs7d0JBSUwsS0FBSzt5QkFJTCxLQUFLOzZCQUlMLEtBQUs7OEJBSUwsS0FBSzt5QkFLTCxNQUFNOztJQXdGVCxhQUFDO0NBQUEsQUFoT0QsSUFnT0M7U0F2SlksTUFBTTs7Ozs7O0lBSWpCLG1CQUF1Qjs7SUFFdkIsZ0NBQXNEOzs7OztJQUl0RCwwQkFBMEI7Ozs7O0lBSTFCLDBCQUEwQjs7Ozs7SUFJMUIseUJBQXlCOzs7OztJQUl6Qix1QkFBdUI7Ozs7O0lBSXZCLG9CQUFtRDs7Ozs7SUFJbkQsMEJBQTJCOzs7OztJQUkzQix1QkFBbUI7Ozs7O0lBSW5CLHFCQUFvQjs7Ozs7SUFJcEIscUJBQW9COzs7OztJQUlwQix1QkFBMEM7Ozs7O0lBSTFDLHdCQUEyQzs7Ozs7SUFJM0MsNEJBQStDOzs7OztJQUkvQyw2QkFBZ0Q7Ozs7O0lBS2hELHdCQUFvRDs7Ozs7SUEwQ3BELDJCQUFpQzs7Ozs7SUFLakMsaUNBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE51bWJlckNoYW5nZSB9IGZyb20gJy4vbnVtYmVyLWNoYW5nZS5jbGFzcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtbnVtYmVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWwgKm5nSWY9XCJza2VsZXRvbiAmJiBsYWJlbFwiIGNsYXNzPVwibGFiZWwgc2tlbGV0b25cIj48L2xhYmVsPlxuICAgIDxsYWJlbCAqbmdJZj1cIiFza2VsZXRvbiAmJiBsYWJlbFwiIFtmb3JdPVwiaWRcIiBjbGFzcz1cImxhYmVsXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUobGFiZWwpXCI+e3tsYWJlbH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGxhYmVsKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgKm5nSWY9XCIhc2tlbGV0b24gJiYgaGVscGVyVGV4dFwiIGNsYXNzPVwiZm9ybV9faGVscGVyLXRleHRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShoZWxwZXJUZXh0KVwiPnt7aGVscGVyVGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgZGF0YS1udW1iZXJpbnB1dFxuICAgICAgW2F0dHIuZGF0YS1pbnZhbGlkXT1cIihpbnZhbGlkID8gdHJ1ZSA6IG51bGwpXCJcbiAgICAgIFthdHRyLmRhdGEtdmFsaWRdPVwiKHZhbGlkID8gdHJ1ZSA6IG51bGwpXCJcbiAgICAgIGNsYXNzPVwibnVtYmVyLWlucHV0XCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ251bWJlci1pbnB1dC0tbm9sYWJlbCc6ICFsYWJlbCxcbiAgICAgICAgJ251bWJlci1pbnB1dC0taGVscGVydGV4dCc6IGhlbHBlclRleHQsXG4gICAgICAgICdza2VsZXRvbicgOiBza2VsZXRvbixcbiAgICAgICAgJ251bWJlci1pbnB1dC0tZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgICAgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm51bWJlci1pbnB1dF9faW5wdXQtd3JhcHBlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm51bWJlci1pbnB1dF9fcHJlZml4XCIgKm5nSWY9XCIhc2tlbGV0b24gJiYgcHJlZml4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKHByZWZpeClcIj57e3ByZWZpeH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShwcmVmaXgpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwicHJlZml4XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgW2F0dHIubWluXT1cIm1pblwiXG4gICAgICAgICAgW2F0dHIubWF4XT1cIm1heFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgIChpbnB1dCk9XCJvbk51bWJlcklucHV0Q2hhbmdlKCRldmVudClcIi8+XG4gICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b24gJiYgaW52YWxpZFwiIGljb249XCJhbGVydC1jaXJjbGVcIiBjbGFzcz1cIm51bWJlci1pbnB1dF9faW52YWxpZFwiPjwvc3VrYS1pY29uPlxuICAgICAgICA8c3VrYS1pY29uICpuZ0lmPVwiIXNrZWxldG9uICYmIHZhbGlkXCIgaWNvbj1cImNoZWNrXCIgY2xhc3M9XCJudW1iZXItaW5wdXRfX3ZhbGlkXCI+PC9zdWthLWljb24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhc2tlbGV0b25cIiBjbGFzcz1cIm51bWJlci1pbnB1dF9fY29udHJvbHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm51bWJlci1pbnB1dF9fY29udHJvbC1idG4gdXAtaWNvblwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW5jcmVtZW50KClcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzIwIDUxMlwiIGhlaWdodD1cIjE2XCIgd2lkdGg9XCIxNlwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTI4OC42NjIgMzUySDMxLjMzOGMtMTcuODE4IDAtMjYuNzQxLTIxLjU0My0xNC4xNDItMzQuMTQybDEyOC42NjItMTI4LjY2MmM3LjgxLTcuODEgMjAuNDc0LTcuODEgMjguMjg0IDBsMTI4LjY2MiAxMjguNjYyYzEyLjYgMTIuNTk5IDMuNjc2IDM0LjE0Mi0xNC4xNDIgMzQuMTQyelwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm51bWJlci1pbnB1dF9fY29udHJvbC1idG4gZG93bi1pY29uXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWNyZW1lbnQoKVwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzMjAgNTEyXCIgaGVpZ2h0PVwiMTZcIiB3aWR0aD1cIjE2XCI+PHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMzEuMyAxOTJoMjU3LjNjMTcuOCAwIDI2LjcgMjEuNSAxNC4xIDM0LjFMMTc0LjEgMzU0LjhjLTcuOCA3LjgtMjAuNSA3LjgtMjguMyAwTDE3LjIgMjI2LjFDNC42IDIxMy41IDEzLjUgMTkyIDMxLjMgMTkyelwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJpbnZhbGlkXCIgY2xhc3M9XCJmb3JtLXJlcXVpcmVtZW50XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIj57e2ludmFsaWRUZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnZhbGlkVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogTnVtYmVyLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBOdW1iZXIgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIC8qKlxuICAgKiBWYXJpYWJsZSB1c2VkIGZvciBjcmVhdGluZyB1bmlxdWUgaWRzIGZvciBudW1iZXIgaW5wdXQgY29tcG9uZW50cy5cbiAgICovXG4gIHN0YXRpYyBudW1iZXJDb3VudCA9IDA7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb3JtLWl0ZW0nKSBjb250YWluZXJDbGFzcyA9IHRydWU7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGRpc2FibGVkIG51bWJlciBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhbiBpbnZhbGlkIG51bWJlciBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIHZhbGlkIG51bWJlciBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZCA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIG51bWJlciBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpZCA9IGBudW1iZXItaW5wdXQtJHtOdW1iZXIubnVtYmVyQ291bnR9YDtcbiAgLyoqXG4gICAqIFJlZmxlY3RzIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgb2YgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWx1ZSA9IDA7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBtaW4gYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBtaW4gPSBudWxsO1xuICAvKipcbiAgICogU2V0cyB0aGUgbWF4IGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgbWF4ID0gbnVsbDtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHRleHQgaW5zaWRlIHRoZSBgbGFiZWxgIHRhZy5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2V0cyB0aGUgYSBwcmVmaXggZm9yIHRoZSBpbnB1dCB3cmFwcGVyLlxuICAgKi9cbiAgQElucHV0KCkgcHJlZml4OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2V0cyB0aGUgb3B0aW9uYWwgaGVscGVyIHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBoZWxwZXJUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2V0cyB0aGUgaW52YWxpZCB0ZXh0LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZFRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBpbiB0aGUgaW5wdXQuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnVtYmVyQ2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBOdW1iZXJgLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgTnVtYmVyLm51bWJlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIG51bWJlciBpbnB1dCBpcyB0b3VjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIHRocm91Z2ggdGhlIG1vZGVsXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBudW1iZXIgaW5wdXQgaXMgYmx1cnJlZC4gTmVlZGVkIHRvIHByb3Blcmx5IGltcGxlbWVudCBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gYHJlZ2lzdGVyT25DaGFuZ2VgIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIEFkZHMgMSB0byB0aGUgY3VycmVudCBgdmFsdWVgLlxuICAgKi9cbiAgb25JbmNyZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWF4ID09PSBudWxsIHx8IHRoaXMudmFsdWUgPCB0aGlzLm1heCkge1xuICAgICAgdGhpcy52YWx1ZSsrO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VidHJhY3RzIDEgdG8gdGhlIGN1cnJlbnQgYHZhbHVlYC5cbiAgICovXG4gIG9uRGVjcmVtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1pbiA9PT0gbnVsbCB8fCB0aGlzLnZhbHVlID4gdGhpcy5taW4pIHtcbiAgICAgIHRoaXMudmFsdWUtLTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjbGFzcyBvZiBgTnVtYmVyQ2hhbmdlYCB0byBlbWl0IHRoZSBjaGFuZ2UgaW4gdGhlIGBOdW1iZXJgLlxuICAgKi9cbiAgZW1pdENoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IE51bWJlckNoYW5nZSgpO1xuICAgIGV2ZW50LnNvdXJjZSA9IHRoaXM7XG4gICAgZXZlbnQudmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgb25OdW1iZXJJbnB1dENoYW5nZShldmVudCkge1xuICAgIHRoaXMudmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cbn1cbiJdfQ==