@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>
332 lines • 25.1 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 }\">\n <div class=\"number-input__input-wrapper\">\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 }],
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 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9udW1iZXItaW5wdXQvbnVtYmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQ7SUFpSUU7O09BRUc7SUFDSDtRQTFEZ0MsbUJBQWMsR0FBRyxJQUFJLENBQUM7Ozs7UUFJN0MsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLFlBQU8sR0FBRyxLQUFLLENBQUM7Ozs7UUFJaEIsVUFBSyxHQUFHLEtBQUssQ0FBQzs7OztRQUlkLE9BQUUsR0FBRyxrQkFBZ0IsTUFBTSxDQUFDLFdBQWEsQ0FBQzs7OztRQVExQyxVQUFLLEdBQUcsQ0FBQyxDQUFDOzs7O1FBSVYsUUFBRyxHQUFHLElBQUksQ0FBQzs7OztRQUlYLFFBQUcsR0FBRyxJQUFJLENBQUM7Ozs7O1FBaUJWLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQzs7OztRQTBDcEQsY0FBUzs7O1FBQWMsY0FBUSxDQUFDLEVBQUM7Ozs7UUFLakMsb0JBQWU7Ozs7UUFBRyxVQUFDLENBQU0sSUFBTyxDQUFDLEVBQUM7UUF6Q2hDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSSwyQkFBVTs7Ozs7SUFBakIsVUFBa0IsS0FBVTtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lB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d0JBQW9EOzs7OztJQTBDcEQsMkJBQWlDOzs7OztJQUtqQyxpQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBIb3N0QmluZGluZyxcbiAgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnVtYmVyQ2hhbmdlIH0gZnJvbSAnLi9udW1iZXItY2hhbmdlLmNsYXNzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1udW1iZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxsYWJlbCAqbmdJZj1cInNrZWxldG9uICYmIGxhYmVsXCIgY2xhc3M9XCJsYWJlbCBza2VsZXRvblwiPjwvbGFiZWw+XG4gICAgPGxhYmVsICpuZ0lmPVwiIXNrZWxldG9uICYmIGxhYmVsXCIgW2Zvcl09XCJpZFwiIGNsYXNzPVwibGFiZWxcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShsYWJlbClcIj57e2xhYmVsfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUobGFiZWwpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDwvbGFiZWw+XG4gICAgPGRpdiAqbmdJZj1cIiFza2VsZXRvbiAmJiBoZWxwZXJUZXh0XCIgY2xhc3M9XCJmb3JtX19oZWxwZXItdGV4dFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3toZWxwZXJUZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaGVscGVyVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWxwZXJUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBkYXRhLW51bWJlcmlucHV0XG4gICAgICBbYXR0ci5kYXRhLWludmFsaWRdPVwiKGludmFsaWQgPyB0cnVlIDogbnVsbClcIlxuICAgICAgW2F0dHIuZGF0YS12YWxpZF09XCIodmFsaWQgPyB0cnVlIDogbnVsbClcIlxuICAgICAgY2xhc3M9XCJudW1iZXItaW5wdXRcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnbnVtYmVyLWlucHV0LS1ub2xhYmVsJzogIWxhYmVsLFxuICAgICAgICAnbnVtYmVyLWlucHV0LS1oZWxwZXJ0ZXh0JzogaGVscGVyVGV4dCxcbiAgICAgICAgJ3NrZWxldG9uJyA6IHNrZWxldG9uXG4gICAgICB9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibnVtYmVyLWlucHV0X19pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICBbYXR0ci5taW5dPVwibWluXCJcbiAgICAgICAgICBbYXR0ci5tYXhdPVwibWF4XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgKGlucHV0KT1cIm9uTnVtYmVySW5wdXRDaGFuZ2UoJGV2ZW50KVwiLz5cbiAgICAgICAgPHN1a2EtaWNvbiAqbmdJZj1cIiFza2VsZXRvbiAmJiBpbnZhbGlkXCIgaWNvbj1cImFsZXJ0LWNpcmNsZVwiIGNsYXNzPVwibnVtYmVyLWlucHV0X19pbnZhbGlkXCI+PC9zdWthLWljb24+XG4gICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b24gJiYgdmFsaWRcIiBpY29uPVwiY2hlY2tcIiBjbGFzcz1cIm51bWJlci1pbnB1dF9fdmFsaWRcIj48L3N1a2EtaWNvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFza2VsZXRvblwiIGNsYXNzPVwibnVtYmVyLWlucHV0X19jb250cm9sc1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibnVtYmVyLWlucHV0X19jb250cm9sLWJ0biB1cC1pY29uXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25JbmNyZW1lbnQoKVwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzMjAgNTEyXCIgaGVpZ2h0PVwiMTZcIiB3aWR0aD1cIjE2XCI+PHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMjg4LjY2MiAzNTJIMzEuMzM4Yy0xNy44MTggMC0yNi43NDEtMjEuNTQzLTE0LjE0Mi0zNC4xNDJsMTI4LjY2Mi0xMjguNjYyYzcuODEtNy44MSAyMC40NzQtNy44MSAyOC4yODQgMGwxMjguNjYyIDEyOC42NjJjMTIuNiAxMi41OTkgMy42NzYgMzQuMTQyLTE0LjE0MiAzNC4xNDJ6XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibnVtYmVyLWlucHV0X19jb250cm9sLWJ0biBkb3duLWljb25cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgYXJpYS1hdG9taWM9XCJ0cnVlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkRlY3JlbWVudCgpXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDMyMCA1MTJcIiBoZWlnaHQ9XCIxNlwiIHdpZHRoPVwiMTZcIj48cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0zMS4zIDE5MmgyNTcuM2MxNy44IDAgMjYuNyAyMS41IDE0LjEgMzQuMUwxNzQuMSAzNTQuOGMtNy44IDcuOC0yMC41IDcuOC0yOC4zIDBMMTcuMiAyMjYuMUM0LjYgMjEzLjUgMTMuNSAxOTIgMzEuMyAxOTJ6XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiPnt7aW52YWxpZFRleHR9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImludmFsaWRUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBOdW1iZXIsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGNsYXNzIE51bWJlciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgLyoqXG4gICAqIFZhcmlhYmxlIHVzZWQgZm9yIGNyZWF0aW5nIHVuaXF1ZSBpZHMgZm9yIG51bWJlciBpbnB1dCBjb21wb25lbnRzLlxuICAgKi9cbiAgc3RhdGljIG51bWJlckNvdW50ID0gMDtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIGNvbnRhaW5lckNsYXNzID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgZGlzYWJsZWQgbnVtYmVyIGlucHV0LlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgbG9hZGluZyBudW1iZXIgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGFuIGludmFsaWQgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgdmFsaWQgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbGlkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkIGZvciB0aGUgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYG51bWJlci1pbnB1dC0ke051bWJlci5udW1iZXJDb3VudH1gO1xuICAvKipcbiAgICogUmVmbGVjdHMgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlID0gMDtcbiAgLyoqXG4gICAqIFNldHMgdGhlIG1pbiBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIG1pbiA9IG51bGw7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBtYXggYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBtYXggPSBudWxsO1xuICAvKipcbiAgICogU2V0cyB0aGUgdGV4dCBpbnNpZGUgdGhlIGBsYWJlbGAgdGFnLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcHRpb25hbCBoZWxwZXIgdGV4dC5cbiAgICovXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnZhbGlkIHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IG5vdGlmeWluZyBvdGhlciBjbGFzc2VzIHdoZW4gYSBjaGFuZ2UgaW4gc3RhdGUgb2NjdXJzIGluIHRoZSBpbnB1dC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOdW1iZXJDaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYE51bWJlcmAuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBOdW1iZXIubnVtYmVyQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgaW5wdXQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgbnVtYmVyIGlucHV0IGlzIHRvdWNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgdGhyb3VnaCB0aGUgbW9kZWxcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIG51bWJlciBpbnB1dCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IGBDb250cm9sVmFsdWVBY2Nlc3NvcmAuXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHsgfTtcblxuICAvKipcbiAgICogTWV0aG9kIHNldCBpbiBgcmVnaXN0ZXJPbkNoYW5nZWAgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcblxuICAvKipcbiAgICogQWRkcyAxIHRvIHRoZSBjdXJyZW50IGB2YWx1ZWAuXG4gICAqL1xuICBvbkluY3JlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tYXggPT09IG51bGwgfHwgdGhpcy52YWx1ZSA8IHRoaXMubWF4KSB7XG4gICAgICB0aGlzLnZhbHVlKys7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJ0cmFjdHMgMSB0byB0aGUgY3VycmVudCBgdmFsdWVgLlxuICAgKi9cbiAgb25EZWNyZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWluID09PSBudWxsIHx8IHRoaXMudmFsdWUgPiB0aGlzLm1pbikge1xuICAgICAgdGhpcy52YWx1ZS0tO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsYXNzIG9mIGBOdW1iZXJDaGFuZ2VgIHRvIGVtaXQgdGhlIGNoYW5nZSBpbiB0aGUgYE51bWJlcmAuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgTnVtYmVyQ2hhbmdlKCk7XG4gICAgZXZlbnQuc291cmNlID0gdGhpcztcbiAgICBldmVudC52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBvbk51bWJlcklucHV0Q2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB0aGlzLmVtaXRDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgcHVibGljIGlzVGVtcGxhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgfVxufVxuIl19