UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

232 lines 28.7 kB
import { Component, EventEmitter, Injector, Input, Output } from '@angular/core'; import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level'; import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging'; import { CoreBaseComponent } from '../../common/base.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; function WizardNavigationButtonComponent_span_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "span", 5); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵclassMap(ctx_r0.leftIcon); } } function WizardNavigationButtonComponent_span_9_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "span", 5); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵclassMap(ctx_r1.rightIcon); } } export class WizardNavigationButtonComponent extends CoreBaseComponent { constructor(injector) { super(injector); /** * The internal buttons object */ this.buttonsInternal = []; this.render = false; this.showIcons = true; this.leftIcon = 'sme-icon-chevronLeft'; this.rightIcon = 'sme-icon-chevronRight'; this.buttonAutoWidth = true; this.defaultStartIndex = -2; /** * It emits the start button clicked event. */ this.startButtonClicked = new EventEmitter(); /** * It emits the end button clicked event. */ this.endButtonClicked = new EventEmitter(); this.currentStartButtonIndexInternal = this.defaultStartIndex; } get logSourceName() { return 'WizardNavigationButtonComponent'; } /** * Getter buttons */ get buttons() { return this.buttonsInternal; } /** * Setter buttons */ set buttons(input) { if (!input || input.length < 2) { this.reset(); this.buttonsInternal = []; } else { this.buttonsInternal = input; this.currentStartButtonIndexInternal = -1; } this.render = this.buttons && this.buttons.length >= 2; } /** * Getter currentStartButtonIndex */ get currentStartButtonIndex() { return this.currentStartButtonIndexInternal; } /** * Setter currentStartButtonIndex */ set currentStartButtonIndex(input) { if (typeof input !== 'number') { Logging.log({ consoleGroupHeader: 'WizardNavigationButtonComponent', level: LogLevel.Error, message: 'non number input was passed in.', source: 'BannerComponent.set.currentStartButtonIndex()' }); } this.currentStartButtonIndexInternal = input; } /** * It checks the enable/disable state for the start button * @param index The current index for wizard start button * @returns true for enable and false for disable */ checkStartDisabled(index) { return index < 0; } /** * It checks the enable/disable state for the end button * @param index The current index for wizard end button * @returns true for enable and false for disable */ checkEndDisabled(index) { return index >= this.buttons.length - 2; } /** * It resets the current start button index to -2 if no button objects, * Otherwise it sets the button index to 0. */ reset() { this.currentStartButtonIndex = this.defaultStartIndex; if (this.buttons.length >= 2) { this.currentStartButtonIndex = 0; this.render = true; } else { this.render = false; } } /** * It updates the component by label name, this is tied to pivot tab component clicking events. * @param label the label name. */ updateStartIndexByLabel(label) { const buttons = this.buttons.map((b) => { return b.label; }); const activatedButtonIndex = buttons.indexOf(label); if (activatedButtonIndex === -1 || activatedButtonIndex >= buttons.length) { return; } this.currentStartButtonIndexInternal = activatedButtonIndex - 1; } /** * It handles the start index button click */ onStartButtonClick() { if (this.currentStartButtonIndex > this.defaultStartIndex) { this.currentStartButtonIndex -= 1; } this.startButtonClicked.emit(); } /** * It handles the end index button click */ onEndButtonClick() { if (this.currentStartButtonIndex <= this.buttons.length - 1) { this.currentStartButtonIndex += 1; } this.endButtonClicked.emit(); } /** * It gets the current start index button label. * @returns the label string. */ getCurrentStartButtonLabel() { return this.getButtonLabel(this.currentStartButtonIndex); } /** * It gets the current activated button label. * @returns the label string. */ getCurrentActivatedButtonLabel() { return this.getButtonLabel(this.currentStartButtonIndex + 1); } /** * It gets the current end index button label. * @returns the label string. */ getCurrentEndButtonLabel() { return this.getButtonLabel(this.currentStartButtonIndex + 2); } /** * It gets the button label. * @param index the index for label. * @returns the label string. */ getButtonLabel(index) { if (this.currentStartButtonIndex <= this.defaultStartIndex || this.currentStartButtonIndex > this.buttons.length - 1) { return; } return this.buttons[index]?.label; } } /** @nocollapse */ WizardNavigationButtonComponent.ɵfac = function WizardNavigationButtonComponent_Factory(t) { return new (t || WizardNavigationButtonComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ WizardNavigationButtonComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: WizardNavigationButtonComponent, selectors: [["sme-wizard-navigation-button"]], inputs: { showIcons: "showIcons", leftIcon: "leftIcon", rightIcon: "rightIcon", buttonAutoWidth: "buttonAutoWidth", buttons: "buttons" }, outputs: { startButtonClicked: "startButtonClicked", endButtonClicked: "endButtonClicked" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 10, vars: 16, consts: [[1, "sme-arrange-stack-h", "sme-position-stretch-h"], [1, "sme-padding-right-xs"], ["type", "button", "aria-live", "polite", "tabindex", "0", 1, "sme-arrange-stack-h", 3, "disabled", "click"], ["class", "sme-icon", 3, "class", 4, "ngIf"], [1, "sme-position-flex-auto", "sme-position-flex-grow-start", "sme-arrange-ellipsis", "sme-action-button-text-span"], [1, "sme-icon"]], template: function WizardNavigationButtonComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0)(1, "span", 1)(2, "button", 2); i0.ɵɵlistener("click", function WizardNavigationButtonComponent_Template_button_click_2_listener() { return ctx.onStartButtonClick(); }); i0.ɵɵtemplate(3, WizardNavigationButtonComponent_span_3_Template, 1, 2, "span", 3); i0.ɵɵelementStart(4, "span", 4); i0.ɵɵtext(5); i0.ɵɵelementEnd()()(); i0.ɵɵelementStart(6, "button", 2); i0.ɵɵlistener("click", function WizardNavigationButtonComponent_Template_button_click_6_listener() { return ctx.onEndButtonClick(); }); i0.ɵɵelementStart(7, "span", 4); i0.ɵɵtext(8); i0.ɵɵelementEnd(); i0.ɵɵtemplate(9, WizardNavigationButtonComponent_span_9_Template, 1, 2, "span", 3); i0.ɵɵelementEnd()(); } if (rf & 2) { i0.ɵɵclassProp("sme-layout-hidden", !ctx.render); i0.ɵɵadvance(2); i0.ɵɵclassMap(ctx.buttons[ctx.currentStartButtonIndex] == null ? null : ctx.buttons[ctx.currentStartButtonIndex].class); i0.ɵɵclassProp("sme-button-auto-width", ctx.buttonAutoWidth); i0.ɵɵproperty("disabled", ctx.checkStartDisabled(ctx.currentStartButtonIndex)); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showIcons); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", ctx.buttons[ctx.currentStartButtonIndex] ? ctx.buttons[ctx.currentStartButtonIndex].label : ctx.strings.MsftSmeShell.Angular.Wizard.Lite.Actions.previous, ""); i0.ɵɵadvance(1); i0.ɵɵclassMap(ctx.buttons[ctx.currentStartButtonIndex] == null ? null : ctx.buttons[ctx.currentStartButtonIndex].class); i0.ɵɵclassProp("sme-button-auto-width", ctx.buttonAutoWidth); i0.ɵɵproperty("disabled", ctx.checkEndDisabled(ctx.currentStartButtonIndex)); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", ctx.buttons[ctx.currentStartButtonIndex + 2] ? ctx.buttons[ctx.currentStartButtonIndex + 2].label : ctx.strings.MsftSmeShell.Angular.Wizard.Lite.Actions.next, ""); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.showIcons); } }, dependencies: [i1.NgIf], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WizardNavigationButtonComponent, [{ type: Component, args: [{ selector: 'sme-wizard-navigation-button', template: "<div class=\"sme-arrange-stack-h sme-position-stretch-h\" [class.sme-layout-hidden]=\"!render\">\r\n <span class=\"sme-padding-right-xs\">\r\n <button type=\"button\" aria-live=\"polite\" class=\"sme-arrange-stack-h\" tabindex=\"0\"\r\n [class]=\"buttons[currentStartButtonIndex]?.class\"\r\n [class.sme-button-auto-width]=\"buttonAutoWidth\"\r\n [disabled]=\"checkStartDisabled(currentStartButtonIndex)\"\r\n (click)=\"onStartButtonClick()\">\r\n <span *ngIf=\"showIcons\" class=\"sme-icon\" [class]=\"leftIcon\"></span>\r\n <span class=\"sme-position-flex-auto sme-position-flex-grow-start sme-arrange-ellipsis sme-action-button-text-span\">\r\n {{ buttons[currentStartButtonIndex] ? buttons[currentStartButtonIndex].label : strings.MsftSmeShell.Angular.Wizard.Lite.Actions.previous }}</span>\r\n </button>\r\n </span>\r\n <button type=\"button\" aria-live=\"polite\" class=\"sme-arrange-stack-h\" tabindex=\"0\"\r\n [class]=\"buttons[currentStartButtonIndex]?.class\"\r\n [class.sme-button-auto-width]=\"buttonAutoWidth\"\r\n [disabled]=\"checkEndDisabled(currentStartButtonIndex)\"\r\n (click)=\"onEndButtonClick()\">\r\n <span class=\"sme-position-flex-auto sme-position-flex-grow-start sme-arrange-ellipsis sme-action-button-text-span\">\r\n {{ buttons[currentStartButtonIndex + 2] ? buttons[currentStartButtonIndex + 2].label : strings.MsftSmeShell.Angular.Wizard.Lite.Actions.next }}</span>\r\n <span *ngIf=\"showIcons\" class=\"sme-icon\" [class]=\"rightIcon\"></span>\r\n </button>\r\n</div>\r\n" }] }], function () { return [{ type: i0.Injector }]; }, { showIcons: [{ type: Input }], leftIcon: [{ type: Input }], rightIcon: [{ type: Input }], buttonAutoWidth: [{ type: Input }], buttons: [{ type: Input }], startButtonClicked: [{ type: Output }], endButtonClicked: [{ type: Output }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLW5hdmlnYXRpb24tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3dpemFyZC1saXRlL3dpemFyZC1uYXZpZ2F0aW9uLWJ1dHRvbi93aXphcmQtbmF2aWdhdGlvbi1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvd2l6YXJkLWxpdGUvd2l6YXJkLW5hdmlnYXRpb24tYnV0dG9uL3dpemFyZC1uYXZpZ2F0aW9uLWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7O0lDSTFELDBCQUFtRTs7O0lBQTFCLDhCQUFrQjs7O0lBWTdELDBCQUFvRTs7O0lBQTNCLCtCQUFtQjs7QURLaEUsTUFBTSxPQUFPLCtCQUFnQyxTQUFRLGlCQUFpQjtJQXdHbEUsWUFBWSxRQUFrQjtRQUMxQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFwR3BCOztXQUVHO1FBQ0ksb0JBQWUsR0FBaUMsRUFBRSxDQUFDO1FBRW5ELFdBQU0sR0FBRyxLQUFLLENBQUM7UUFLZixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBR2pCLGFBQVEsR0FBRyxzQkFBc0IsQ0FBQztRQUdsQyxjQUFTLEdBQUcsdUJBQXVCLENBQUM7UUFHcEMsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFnRGIs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Q0FBQzs7aUlBeE1RLCtCQUErQjtpSEFBL0IsK0JBQStCO1FDeEI1Qyw4QkFBNEYsY0FBQSxnQkFBQTtRQU10Riw0R0FBUyx3QkFBb0IsSUFBQztRQUM5QixrRkFBbUU7UUFDbkUsK0JBQW1IO1FBQ2pILFlBQTJJO1FBQUEsaUJBQU8sRUFBQSxFQUFBO1FBR3hKLGlDQUkrQjtRQUE3Qiw0R0FBUyxzQkFBa0IsSUFBQztRQUM1QiwrQkFBbUg7UUFDakgsWUFBK0k7UUFBQSxpQkFBTztRQUN4SixrRkFBb0U7UUFDdEUsaUJBQVMsRUFBQTs7UUFwQjZDLGdEQUFtQztRQUdyRixlQUFpRDtRQUFqRCx1SEFBaUQ7UUFDakQsNERBQStDO1FBQy9DLDhFQUF3RDtRQUVqRCxlQUFlO1FBQWYsb0NBQWU7UUFFcEIsZUFBMkk7UUFBM0kseUxBQTJJO1FBSS9JLGVBQWlEO1FBQWpELHVIQUFpRDtRQUNqRCw0REFBK0M7UUFDL0MsNEVBQXNEO1FBR3BELGVBQStJO1FBQS9JLDZMQUErSTtRQUMxSSxlQUFlO1FBQWYsb0NBQWU7O3VGREtiLCtCQUErQjtjQUozQyxTQUFTOzJCQUNJLDhCQUE4QjsyREFrQmpDLFNBQVM7a0JBRGYsS0FBSztZQUlDLFFBQVE7a0JBRGQsS0FBSztZQUlDLFNBQVM7a0JBRGYsS0FBSztZQUlDLGVBQWU7a0JBRHJCLEtBQUs7WUFjSyxPQUFPO2tCQURqQixLQUFLO1lBMENDLGtCQUFrQjtrQkFEeEIsTUFBTTtZQU9BLGdCQUFnQjtrQkFEdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nLWxldmVsJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IENvcmVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2Jhc2UuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkTmF2aWdhdGlvbkJ1dHRvbkRhdGEge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGFiZWwgZm9yIHRoZSBidXR0b25cclxuICAgICAqL1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5ncyBmb3IgY2xhc3Nlcy5cclxuICAgICAqIEV4YW1wbGU6ICdzbWUtY2xhc3MtYSBzbWUtY2xhc3MtYicuXHJcbiAgICAgKi9cclxuICAgIGNsYXNzPzogc3RyaW5nO1xyXG4gICAgaWNvblN0YXJ0Pzogc3RyaW5nO1xyXG4gICAgaWNvbkVuZD86IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS13aXphcmQtbmF2aWdhdGlvbi1idXR0b24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3dpemFyZC1uYXZpZ2F0aW9uLWJ1dHRvbi5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFdpemFyZE5hdmlnYXRpb25CdXR0b25Db21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCB7XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdXaXphcmROYXZpZ2F0aW9uQnV0dG9uQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpbnRlcm5hbCBidXR0b25zIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYnV0dG9uc0ludGVybmFsOiBXaXphcmROYXZpZ2F0aW9uQnV0dG9uRGF0YVtdID0gW107XHJcblxyXG4gICAgcHVibGljIHJlbmRlciA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY3VycmVudFN0YXJ0QnV0dG9uSW5kZXhJbnRlcm5hbDogbnVtYmVyO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0ljb25zID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxlZnRJY29uID0gJ3NtZS1pY29uLWNoZXZyb25MZWZ0JztcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJpZ2h0SWNvbiA9ICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgYnV0dG9uQXV0b1dpZHRoID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHRlciBidXR0b25zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYnV0dG9ucygpOiBXaXphcmROYXZpZ2F0aW9uQnV0dG9uRGF0YVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5idXR0b25zSW50ZXJuYWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0ZXIgYnV0dG9uc1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNldCBidXR0b25zKGlucHV0OiBXaXphcmROYXZpZ2F0aW9uQnV0dG9uRGF0YVtdKSB7XHJcbiAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dC5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25zSW50ZXJuYWwgPSBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbnNJbnRlcm5hbCA9IGlucHV0O1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4SW50ZXJuYWwgPSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyID0gdGhpcy5idXR0b25zICYmIHRoaXMuYnV0dG9ucy5sZW5ndGggPj0gMjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHRlciBjdXJyZW50U3RhcnRCdXR0b25JbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRTdGFydEJ1dHRvbkluZGV4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXhJbnRlcm5hbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHRlciBjdXJyZW50U3RhcnRCdXR0b25JbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGN1cnJlbnRTdGFydEJ1dHRvbkluZGV4KGlucHV0OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICBMb2dnaW5nLmxvZyh7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlR3JvdXBIZWFkZXI6ICdXaXphcmROYXZpZ2F0aW9uQnV0dG9uQ29tcG9uZW50JyxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5FcnJvcixcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdub24gbnVtYmVyIGlucHV0IHdhcyBwYXNzZWQgaW4uJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0Jhbm5lckNvbXBvbmVudC5zZXQuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXgoKSdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4SW50ZXJuYWwgPSBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRTdGFydEluZGV4ID0gLTI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0aGUgc3RhcnQgYnV0dG9uIGNsaWNrZWQgZXZlbnQuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHN0YXJ0QnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGVuZCBidXR0b24gY2xpY2tlZCBldmVudC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZW5kQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY2hlY2tzIHRoZSBlbmFibGUvZGlzYWJsZSBzdGF0ZSBmb3IgdGhlIHN0YXJ0IGJ1dHRvblxyXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IGZvciB3aXphcmQgc3RhcnQgYnV0dG9uXHJcbiAgICAgKiBAcmV0dXJucyB0cnVlIGZvciBlbmFibGUgYW5kIGZhbHNlIGZvciBkaXNhYmxlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjaGVja1N0YXJ0RGlzYWJsZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBpbmRleCA8IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBjaGVja3MgdGhlIGVuYWJsZS9kaXNhYmxlIHN0YXRlIGZvciB0aGUgZW5kIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IGZvciB3aXphcmQgZW5kIGJ1dHRvblxyXG4gICAgICogQHJldHVybnMgdHJ1ZSBmb3IgZW5hYmxlIGFuZCBmYWxzZSBmb3IgZGlzYWJsZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hlY2tFbmREaXNhYmxlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IHRoaXMuYnV0dG9ucy5sZW5ndGggLSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhcnRCdXR0b25JbmRleEludGVybmFsID0gdGhpcy5kZWZhdWx0U3RhcnRJbmRleDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJlc2V0cyB0aGUgY3VycmVudCBzdGFydCBidXR0b24gaW5kZXggdG8gLTIgaWYgbm8gYnV0dG9uIG9iamVjdHMsXHJcbiAgICAgKiBPdGhlcndpc2UgaXQgc2V0cyB0aGUgYnV0dG9uIGluZGV4IHRvIDAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXNldCgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4ID0gdGhpcy5kZWZhdWx0U3RhcnRJbmRleDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9ucy5sZW5ndGggPj0gMikge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXIgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdXBkYXRlcyB0aGUgY29tcG9uZW50IGJ5IGxhYmVsIG5hbWUsIHRoaXMgaXMgdGllZCB0byBwaXZvdCB0YWIgY29tcG9uZW50IGNsaWNraW5nIGV2ZW50cy5cclxuICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgbmFtZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZVN0YXJ0SW5kZXhCeUxhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBidXR0b25zID0gdGhpcy5idXR0b25zLm1hcCgoYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYi5sYWJlbDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgYWN0aXZhdGVkQnV0dG9uSW5kZXggPSBidXR0b25zLmluZGV4T2YobGFiZWwpO1xyXG5cclxuICAgICAgICBpZiAoYWN0aXZhdGVkQnV0dG9uSW5kZXggPT09IC0xIHx8IGFjdGl2YXRlZEJ1dHRvbkluZGV4ID49IGJ1dHRvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXhJbnRlcm5hbCA9IGFjdGl2YXRlZEJ1dHRvbkluZGV4IC0gMTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHN0YXJ0IGluZGV4IGJ1dHRvbiBjbGlja1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TdGFydEJ1dHRvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4ID4gdGhpcy5kZWZhdWx0U3RhcnRJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4IC09IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN0YXJ0QnV0dG9uQ2xpY2tlZC5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBlbmQgaW5kZXggYnV0dG9uIGNsaWNrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkVuZEJ1dHRvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4IDw9IHRoaXMuYnV0dG9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXggKz0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW5kQnV0dG9uQ2xpY2tlZC5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIHRoZSBjdXJyZW50IHN0YXJ0IGluZGV4IGJ1dHRvbiBsYWJlbC5cclxuICAgICAqIEByZXR1cm5zIHRoZSBsYWJlbCBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdXJyZW50U3RhcnRCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbkxhYmVsKHRoaXMuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZ2V0cyB0aGUgY3VycmVudCBhY3RpdmF0ZWQgYnV0dG9uIGxhYmVsLlxyXG4gICAgICogQHJldHVybnMgdGhlIGxhYmVsIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEN1cnJlbnRBY3RpdmF0ZWRCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbkxhYmVsKHRoaXMuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXggKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgdGhlIGN1cnJlbnQgZW5kIGluZGV4IGJ1dHRvbiBsYWJlbC5cclxuICAgICAqIEByZXR1cm5zIHRoZSBsYWJlbCBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdXJyZW50RW5kQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25MYWJlbCh0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4ICsgMik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIHRoZSBidXR0b24gbGFiZWwuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciBsYWJlbC5cclxuICAgICAqIEByZXR1cm5zIHRoZSBsYWJlbCBzdHJpbmcuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QnV0dG9uTGFiZWwoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0YXJ0QnV0dG9uSW5kZXggPD0gdGhpcy5kZWZhdWx0U3RhcnRJbmRleCB8fCB0aGlzLmN1cnJlbnRTdGFydEJ1dHRvbkluZGV4ID4gdGhpcy5idXR0b25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9uc1tpbmRleF0/LmxhYmVsO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1wb3NpdGlvbi1zdHJldGNoLWhcIiBbY2xhc3Muc21lLWxheW91dC1oaWRkZW5dPVwiIXJlbmRlclwiPlxyXG4gIDxzcGFuIGNsYXNzPVwic21lLXBhZGRpbmctcmlnaHQteHNcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgIFtjbGFzc109XCJidXR0b25zW2N1cnJlbnRTdGFydEJ1dHRvbkluZGV4XT8uY2xhc3NcIlxyXG4gICAgICBbY2xhc3Muc21lLWJ1dHRvbi1hdXRvLXdpZHRoXT1cImJ1dHRvbkF1dG9XaWR0aFwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJjaGVja1N0YXJ0RGlzYWJsZWQoY3VycmVudFN0YXJ0QnV0dG9uSW5kZXgpXCJcclxuICAgICAgKGNsaWNrKT1cIm9uU3RhcnRCdXR0b25DbGljaygpXCI+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0ljb25zXCIgY2xhc3M9XCJzbWUtaWNvblwiIFtjbGFzc109XCJsZWZ0SWNvblwiPjwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1hdXRvIHNtZS1wb3NpdGlvbi1mbGV4LWdyb3ctc3RhcnQgc21lLWFycmFuZ2UtZWxsaXBzaXMgc21lLWFjdGlvbi1idXR0b24tdGV4dC1zcGFuXCI+XHJcbiAgICAgICAge3sgYnV0dG9uc1tjdXJyZW50U3RhcnRCdXR0b25JbmRleF0gPyBidXR0b25zW2N1cnJlbnRTdGFydEJ1dHRvbkluZGV4XS5sYWJlbCA6IHN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuV2l6YXJkLkxpdGUuQWN0aW9ucy5wcmV2aW91cyB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvc3Bhbj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIiB0YWJpbmRleD1cIjBcIlxyXG4gICAgW2NsYXNzXT1cImJ1dHRvbnNbY3VycmVudFN0YXJ0QnV0dG9uSW5kZXhdPy5jbGFzc1wiXHJcbiAgICBbY2xhc3Muc21lLWJ1dHRvbi1hdXRvLXdpZHRoXT1cImJ1dHRvbkF1dG9XaWR0aFwiXHJcbiAgICBbZGlzYWJsZWRdPVwiY2hlY2tFbmREaXNhYmxlZChjdXJyZW50U3RhcnRCdXR0b25JbmRleClcIlxyXG4gICAgKGNsaWNrKT1cIm9uRW5kQnV0dG9uQ2xpY2soKVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJzbWUtcG9zaXRpb24tZmxleC1hdXRvIHNtZS1wb3NpdGlvbi1mbGV4LWdyb3ctc3RhcnQgc21lLWFycmFuZ2UtZWxsaXBzaXMgc21lLWFjdGlvbi1idXR0b24tdGV4dC1zcGFuXCI+XHJcbiAgICAgIHt7IGJ1dHRvbnNbY3VycmVudFN0YXJ0QnV0dG9uSW5kZXggKyAyXSA/IGJ1dHRvbnNbY3VycmVudFN0YXJ0QnV0dG9uSW5kZXggKyAyXS5sYWJlbCA6IHN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuV2l6YXJkLkxpdGUuQWN0aW9ucy5uZXh0IH19PC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJzaG93SWNvbnNcIiBjbGFzcz1cInNtZS1pY29uXCIgW2NsYXNzXT1cInJpZ2h0SWNvblwiPjwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbiJdfQ==