UNPKG

@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>

385 lines 31.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, HostBinding, EventEmitter, Output, TemplateRef, ViewChild, ElementRef, ViewContainerRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Overlay } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; var ColorInput = /** @class */ (function () { /** * Creates an instance of `ColorInput`. */ function ColorInput(_overlay, _viewContainerRef) { this._overlay = _overlay; this._viewContainerRef = _viewContainerRef; this.containerClass = true; /** * Set to `true` for a disabled color input. */ this.disabled = false; /** * Set to `true` for a loading color input component. */ this.skeleton = false; /** * Set to `true` for an invalid color input component. */ this.invalid = false; /** * Set to `true` for a valid color input component. */ this.valid = false; /** * The unique id for the color input component. */ this.id = "color-input-" + ColorInput.colorInputCount; /** * Sets the value attribute on the `input` element. */ this.value = ''; /** * Sets the placeholder on the `input` element. */ this.placeholder = ''; /** * 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 (_) { }); ColorInput.colorInputCount++; } /** * 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 {?} */ ColorInput.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 {?} */ ColorInput.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 {?} */ ColorInput.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 {?} */ ColorInput.prototype.setDisabledState = /** * Sets the disabled state through the model * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.disabled = isDisabled; }; /** * 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 {?} */ ColorInput.prototype.emitChangeEvent = /** * Creates a class of `NumberChange` to emit the change in the `Number`. * @return {?} */ function () { this.change.emit(this.value); this.propagateChange(this.value); }; /** * @param {?} value * @return {?} */ ColorInput.prototype.onColorChange = /** * @param {?} value * @return {?} */ function (value) { this.value = value; this.emitChangeEvent(); }; /** * @param {?} event * @return {?} */ ColorInput.prototype.onColorInputChange = /** * @param {?} event * @return {?} */ function (event) { this.value = event.target.value; this.emitChangeEvent(); }; /** * Opens the color picker dialog */ /** * Opens the color picker dialog * @return {?} */ ColorInput.prototype.openColorDialog = /** * Opens the color picker dialog * @return {?} */ function () { var _this = this; if (!this._overlayRef) { /** @type {?} */ var positionStrategy = this._overlay .position() .flexibleConnectedTo(this.origin) .withPositions([{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 8, }]); this._overlayRef = this._overlay.create({ hasBackdrop: true, backdropClass: 'cdk-overlay-transparent-backdrop', positionStrategy: positionStrategy, }); this._overlayRef.backdropClick().subscribe((/** * @return {?} */ function () { return _this._overlayRef.detach(); })); this._portal = new TemplatePortal(this.dialog, this._viewContainerRef); } this._overlayRef.attach(this._portal); }; /** * Closes the color picker dialog */ /** * Closes the color picker dialog * @return {?} */ ColorInput.prototype.closeColorDialog = /** * Closes the color picker dialog * @return {?} */ function () { this._overlayRef.detach(); }; /** * Checks if it is a template */ /** * Checks if it is a template * @param {?} value * @return {?} */ ColorInput.prototype.isTemplate = /** * Checks if it is a template * @param {?} value * @return {?} */ function (value) { return value instanceof TemplateRef; }; /** * Variable used for creating unique ids for color input components. */ ColorInput.colorInputCount = 0; ColorInput.decorators = [ { type: Component, args: [{ selector: 'suka-color-input', 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-color-input\n [attr.data-invalid]=\"(invalid ? true : null)\"\n [attr.data-valid]=\"(valid ? true : null)\"\n class=\"color-input\"\n [ngClass]=\"{\n 'color-input--nolabel': !label,\n 'color-input--helpertext': helperText,\n 'skeleton' : skeleton,\n 'color-input--disabled': disabled\n }\">\n <div class=\"color-input__input-wrapper\">\n <div\n class=\"color-input__color-preview\"\n *ngIf=\"value\"\n [ngStyle]=\"{'background-color': value || 'white'}\"\n (click)=\"openColorDialog()\"\n ></div>\n <svg\n class=\"color-input__color-preview-icon\"\n *ngIf=\"!value\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n (click)=\"openColorDialog()\"\n >\n <path d=\"M8 0C3.55556 0 0 3.55556 0 8C0 12.4444 3.55556 16 8 16C8.71111 16 9.33333 15.3778 9.33333 14.6667C9.33333 14.3111 9.24444 14.0444 8.97778 13.7778C8.8 13.5111 8.62222 13.2444 8.62222 12.8889C8.62222 12.1778 9.24448 11.5556 9.95556 11.5556H11.5556C14.0444 11.5556 16 9.6 16 7.11111C16 3.2 12.4444 0 8 0ZM3.11111 8C2.4 8 1.77778 7.37778 1.77778 6.66667C1.77778 5.95556 2.4 5.33333 3.11111 5.33333C3.82222 5.33333 4.44444 5.95556 4.44444 6.66667C4.44444 7.37778 3.82222 8 3.11111 8ZM5.77778 4.44444C5.06667 4.44444 4.44444 3.82222 4.44444 3.11111C4.44444 2.4 5.06667 1.77778 5.77778 1.77778C6.48889 1.77778 7.11111 2.4 7.11111 3.11111C7.11111 3.82222 6.48889 4.44444 5.77778 4.44444ZM10.2222 4.44444C9.51111 4.44444 8.88889 3.82222 8.88889 3.11111C8.88889 2.4 9.51111 1.77778 10.2222 1.77778C10.9333 1.77778 11.5556 2.4 11.5556 3.11111C11.5556 3.82222 10.9333 4.44444 10.2222 4.44444ZM12.8889 8C12.1778 8 11.5556 7.37778 11.5556 6.66667C11.5556 5.95556 12.1778 5.33333 12.8889 5.33333C13.6 5.33333 14.2222 5.95556 14.2222 6.66667C14.2222 7.37778 13.6 8 12.8889 8Z\" fill=\"#677784\"/>\n </svg>\n\n <input\n #origin\n type=\"text\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (focus)=\"openColorDialog()\"\n (change)=\"onColorInputChange($event)\"/>\n\n <suka-icon *ngIf=\"!skeleton && invalid\" icon=\"alert-circle\" class=\"color-input__invalid\"></suka-icon>\n <suka-icon *ngIf=\"!skeleton && valid\" icon=\"check\" class=\"color-input__valid\"></suka-icon>\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\n <ng-template #colorPickerDialog>\n <div class=\"color-picker-dialog\">\n <suka-color-picker [color]=\"value\" (colorChange)=\"onColorChange($event)\">\n </suka-color-picker>\n </div>\n </ng-template>\n ", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: ColorInput, multi: true } ] }] } ]; /** @nocollapse */ ColorInput.ctorParameters = function () { return [ { type: Overlay }, { type: ViewContainerRef } ]; }; ColorInput.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 }], placeholder: [{ type: Input }], label: [{ type: Input }], helperText: [{ type: Input }], invalidText: [{ type: Input }], change: [{ type: Output }], origin: [{ type: ViewChild, args: ['origin', { static: false },] }], dialog: [{ type: ViewChild, args: ['colorPickerDialog', { static: false },] }] }; return ColorInput; }()); export { ColorInput }; if (false) { /** * Variable used for creating unique ids for color input components. * @type {?} */ ColorInput.colorInputCount; /** * @type {?} * @private */ ColorInput.prototype._overlayRef; /** * @type {?} * @private */ ColorInput.prototype._portal; /** @type {?} */ ColorInput.prototype.containerClass; /** * Set to `true` for a disabled color input. * @type {?} */ ColorInput.prototype.disabled; /** * Set to `true` for a loading color input component. * @type {?} */ ColorInput.prototype.skeleton; /** * Set to `true` for an invalid color input component. * @type {?} */ ColorInput.prototype.invalid; /** * Set to `true` for a valid color input component. * @type {?} */ ColorInput.prototype.valid; /** * The unique id for the color input component. * @type {?} */ ColorInput.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ ColorInput.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ ColorInput.prototype.value; /** * Sets the placeholder on the `input` element. * @type {?} */ ColorInput.prototype.placeholder; /** * Sets the text inside the `label` tag. * @type {?} */ ColorInput.prototype.label; /** * Sets the optional helper text. * @type {?} */ ColorInput.prototype.helperText; /** * Sets the invalid text. * @type {?} */ ColorInput.prototype.invalidText; /** * Emits event notifying other classes when a change in state occurs in the input. * @type {?} */ ColorInput.prototype.change; /** @type {?} */ ColorInput.prototype.origin; /** @type {?} */ ColorInput.prototype.dialog; /** * Called when number input is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ ColorInput.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ ColorInput.prototype.propagateChange; /** * @type {?} * @private */ ColorInput.prototype._overlay; /** * @type {?} * @private */ ColorInput.prototype._viewContainerRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9jb2xvci1waWNrZXIvY29sb3ItcGlja2VyLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJEO0lBNElFOztPQUVHO0lBQ0gsb0JBQ1UsUUFBaUIsRUFDakIsaUJBQW1DO1FBRG5DLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQTNEYixtQkFBYyxHQUFHLElBQUksQ0FBQzs7OztRQUk3QyxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsWUFBTyxHQUFHLEtBQUssQ0FBQzs7OztRQUloQixVQUFLLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWQsT0FBRSxHQUFHLGlCQUFlLFVBQVUsQ0FBQyxlQUFpQixDQUFDOzs7O1FBUWpELFVBQUssR0FBRyxFQUFFLENBQUM7Ozs7UUFJWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQzs7Ozs7UUFpQmhCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBZ0R0QyxjQUFTOzs7UUFBYyxjQUFRLENBQUMsRUFBQzs7OztRQUtqQyxvQkFBZTs7OztRQUFHLFVBQUMsQ0FBTSxJ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ZW50LFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiwgT3ZlcmxheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtY29sb3ItaW5wdXQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxsYWJlbCAqbmdJZj1cInNrZWxldG9uICYmIGxhYmVsXCIgY2xhc3M9XCJsYWJlbCBza2VsZXRvblwiPjwvbGFiZWw+XG4gICAgPGxhYmVsICpuZ0lmPVwiIXNrZWxldG9uICYmIGxhYmVsXCIgW2Zvcl09XCJpZFwiIGNsYXNzPVwibGFiZWxcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShsYWJlbClcIj57e2xhYmVsfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUobGFiZWwpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGFiZWxcIj48L25nLXRlbXBsYXRlPlxuICAgIDwvbGFiZWw+XG4gICAgPGRpdiAqbmdJZj1cIiFza2VsZXRvbiAmJiBoZWxwZXJUZXh0XCIgY2xhc3M9XCJmb3JtX19oZWxwZXItdGV4dFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3toZWxwZXJUZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaGVscGVyVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWxwZXJUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBkYXRhLWNvbG9yLWlucHV0XG4gICAgICBbYXR0ci5kYXRhLWludmFsaWRdPVwiKGludmFsaWQgPyB0cnVlIDogbnVsbClcIlxuICAgICAgW2F0dHIuZGF0YS12YWxpZF09XCIodmFsaWQgPyB0cnVlIDogbnVsbClcIlxuICAgICAgY2xhc3M9XCJjb2xvci1pbnB1dFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdjb2xvci1pbnB1dC0tbm9sYWJlbCc6ICFsYWJlbCxcbiAgICAgICAgJ2NvbG9yLWlucHV0LS1oZWxwZXJ0ZXh0JzogaGVscGVyVGV4dCxcbiAgICAgICAgJ3NrZWxldG9uJyA6IHNrZWxldG9uLFxuICAgICAgICAnY29sb3ItaW5wdXQtLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgICAgIH1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1pbnB1dF9faW5wdXQtd3JhcHBlclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjb2xvci1pbnB1dF9fY29sb3ItcHJldmlld1wiXG4gICAgICAgICAgKm5nSWY9XCJ2YWx1ZVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogdmFsdWUgfHwgJ3doaXRlJ31cIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JEaWFsb2coKVwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIGNsYXNzPVwiY29sb3ItaW5wdXRfX2NvbG9yLXByZXZpZXctaWNvblwiXG4gICAgICAgICAgKm5nSWY9XCIhdmFsdWVcIlxuICAgICAgICAgIHdpZHRoPVwiMTZcIlxuICAgICAgICAgIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Db2xvckRpYWxvZygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCAwQzMuNTU1NTYgMCAwIDMuNTU1NTYgMCA4QzAgMTIuNDQ0NCAzLjU1NTU2IDE2IDggMTZDOC43MTExMSAxNiA5LjMzMzMzIDE1LjM3NzggOS4zMzMzMyAxNC42NjY3QzkuMzMzMzMgMTQuMzExMSA5LjI0NDQ0IDE0LjA0NDQgOC45Nzc3OCAxMy43Nzc4QzguOCAxMy41MTExIDguNjIyMjIgMTMuMjQ0NCA4LjYyMjIyIDEyLjg4ODlDOC42MjIyMiAxMi4xNzc4IDkuMjQ0NDggMTEuNTU1NiA5Ljk1NTU2IDExLjU1NTZIMTEuNTU1NkMxNC4wNDQ0IDExLjU1NTYgMTYgOS42IDE2IDcuMTExMTFDMTYgMy4yIDEyLjQ0NDQgMCA4IDBaTTMuMTExMTEgOEMyLjQgOCAxLjc3Nzc4IDcuMzc3NzggMS43Nzc3OCA2LjY2NjY3QzEuNzc3NzggNS45NTU1NiAyLjQgNS4zMzMzMyAzLjExMTExIDUuMzMzMzNDMy44MjIyMiA1LjMzMzMzIDQuNDQ0NDQgNS45NTU1NiA0LjQ0NDQ0IDYuNjY2NjdDNC40NDQ0NCA3LjM3Nzc4IDMuODIyMjIgOCAzLjExMTExIDhaTTUuNzc3NzggNC40NDQ0NEM1LjA2NjY3IDQuNDQ0NDQgNC40NDQ0NCAzLjgyMjIyIDQuNDQ0NDQgMy4xMTExMUM0LjQ0NDQ0IDIuNCA1LjA2NjY3IDEuNzc3NzggNS43Nzc3OCAxLjc3Nzc4QzYuNDg4ODkgMS43Nzc3OCA3LjExMTExIDIuNCA3LjExMTExIDMuMTExMTFDNy4xMTExMSAzLjgyMjIyIDYuNDg4ODkgNC40NDQ0NCA1Ljc3Nzc4IDQuNDQ0NDRaTTEwLjIyMjIgNC40NDQ0NEM5LjUxMTExIDQuNDQ0NDQgOC44ODg4OSAzLjgyMjIyIDguODg4ODkgMy4xMTExMUM4Ljg4ODg5IDIuNCA5LjUxMTExIDEuNzc3NzggMTAuMjIyMiAxLjc3Nzc4QzEwLjkzMzMgMS43Nzc3OCAxMS41NTU2IDIuNCAxMS41NTU2IDMuMTExMTFDMTEuNTU1NiAzLjgyMjIyIDEwLjkzMzMgNC40NDQ0NCAxMC4yMjIyIDQuNDQ0NDRaTTEyLjg4ODkgOEMxMi4xNzc4IDggMTEuNTU1NiA3LjM3Nzc4IDExLjU1NTYgNi42NjY2N0MxMS41NTU2IDUuOTU1NTYgMTIuMTc3OCA1LjMzMzMzIDEyLjg4ODkgNS4zMzMzM0MxMy42IDUuMzMzMzMgMTQuMjIyMiA1Ljk1NTU2IDE0LjIyMjIgNi42NjY2N0MxNC4yMjIyIDcuMzc3NzggMTMuNiA4IDEyLjg4ODkgOFpcIiBmaWxsPVwiIzY3Nzc4NFwiLz5cbiAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI29yaWdpblxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgKGZvY3VzKT1cIm9wZW5Db2xvckRpYWxvZygpXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uQ29sb3JJbnB1dENoYW5nZSgkZXZlbnQpXCIvPlxuXG4gICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b24gJiYgaW52YWxpZFwiIGljb249XCJhbGVydC1jaXJjbGVcIiBjbGFzcz1cImNvbG9yLWlucHV0X19pbnZhbGlkXCI+PC9zdWthLWljb24+XG4gICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b24gJiYgdmFsaWRcIiBpY29uPVwiY2hlY2tcIiBjbGFzcz1cImNvbG9yLWlucHV0X192YWxpZFwiPjwvc3VrYS1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaW52YWxpZFwiIGNsYXNzPVwiZm9ybS1yZXF1aXJlbWVudFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCI+e3tpbnZhbGlkVGV4dH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaW52YWxpZFRleHRcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI2NvbG9yUGlja2VyRGlhbG9nPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLXBpY2tlci1kaWFsb2dcIj5cbiAgICAgICAgPHN1a2EtY29sb3ItcGlja2VyIFtjb2xvcl09XCJ2YWx1ZVwiIChjb2xvckNoYW5nZSk9XCJvbkNvbG9yQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9zdWthLWNvbG9yLXBpY2tlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IENvbG9ySW5wdXQsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb2xvcklucHV0IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3IgY29sb3IgaW5wdXQgY29tcG9uZW50cy5cbiAgICovXG4gIHN0YXRpYyBjb2xvcklucHV0Q291bnQgPSAwO1xuICBwcml2YXRlIF9vdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICBwcml2YXRlIF9wb3J0YWw6IFRlbXBsYXRlUG9ydGFsPGFueT47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mb3JtLWl0ZW0nKSBjb250YWluZXJDbGFzcyA9IHRydWU7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGRpc2FibGVkIGNvbG9yIGlucHV0LlxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgbG9hZGluZyBjb2xvciBpbnB1dCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYW4gaW52YWxpZCBjb2xvciBpbnB1dCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIHZhbGlkIGNvbG9yIGlucHV0IGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbGlkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkIGZvciB0aGUgY29sb3IgaW5wdXQgY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaWQgPSBgY29sb3ItaW5wdXQtJHtDb2xvcklucHV0LmNvbG9ySW5wdXRDb3VudH1gO1xuICAvKipcbiAgICogUmVmbGVjdHMgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwbGFjZWhvbGRlciBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgLyoqXG4gICAqIFNldHMgdGhlIHRleHQgaW5zaWRlIHRoZSBgbGFiZWxgIHRhZy5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2V0cyB0aGUgb3B0aW9uYWwgaGVscGVyIHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBoZWxwZXJUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogU2V0cyB0aGUgaW52YWxpZCB0ZXh0LlxuICAgKi9cbiAgQElucHV0KCkgaW52YWxpZFRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBFbWl0cyBldmVudCBub3RpZnlpbmcgb3RoZXIgY2xhc3NlcyB3aGVuIGEgY2hhbmdlIGluIHN0YXRlIG9jY3VycyBpbiB0aGUgaW5wdXQuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdvcmlnaW4nLCB7IHN0YXRpYzogZmFsc2UgfSkgb3JpZ2luOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdjb2xvclBpY2tlckRpYWxvZycsIHsgc3RhdGljOiBmYWxzZSB9KSBkaWFsb2c6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYENvbG9ySW5wdXRgLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmXG4gICkge1xuICAgIENvbG9ySW5wdXQuY29sb3JJbnB1dENvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGlucHV0IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIG51bWJlciBpbnB1dCBpcyB0b3VjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIHRocm91Z2ggdGhlIG1vZGVsXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBudW1iZXIgaW5wdXQgaXMgYmx1cnJlZC4gTmVlZGVkIHRvIHByb3Blcmx5IGltcGxlbWVudCBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gYHJlZ2lzdGVyT25DaGFuZ2VgIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjbGFzcyBvZiBgTnVtYmVyQ2hhbmdlYCB0byBlbWl0IHRoZSBjaGFuZ2UgaW4gdGhlIGBOdW1iZXJgLlxuICAgKi9cbiAgZW1pdENoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBvbkNvbG9yQ2hhbmdlKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gIH1cblxuICBvbkNvbG9ySW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGNvbG9yIHBpY2tlciBkaWFsb2dcbiAgICovXG4gIG9wZW5Db2xvckRpYWxvZygpIHtcbiAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYpIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5XG4gICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMub3JpZ2luKVxuICAgICAgICAud2l0aFBvc2l0aW9ucyhbe1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICAgIG9mZnNldFk6IDgsXG4gICAgICAgIH1dKTtcblxuICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKHtcbiAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCkpO1xuICAgICAgdGhpcy5fcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuZGlhbG9nLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTtcblxuICAgIH1cblxuICAgIHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3BvcnRhbCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb2xvciBwaWNrZXIgZGlhbG9nXG4gICAqL1xuICBjbG9zZUNvbG9yRGlhbG9nKCkge1xuICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGl0IGlzIGEgdGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cbn1cbiJdfQ==