cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
269 lines • 42.6 kB
JavaScript
import { Component, ContentChildren, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
import { WizardStepComponent } from './wizardStep/wizard-step.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class WizardComponent {
stepsQuery;
steps = [];
wizardRoot;
currentStepIndex = 0;
showCancelButton = true;
alwaysShowBackButton = false;
isNextButtonDisabled = false;
isFinishButtonDisabled = false;
cancelText = 'Cancelar';
backText = 'Voltar';
nextText = 'Avançar';
finishText = 'Concluir';
forceMobileMode = null;
orientation = 'horizontal';
isMobileView = false;
stepChange = new EventEmitter();
wizardCancel = new EventEmitter();
wizardComplete = new EventEmitter();
brWizardInstance;
loadInterval;
loadTimeout;
resizeTimeout;
stepChangeTimeout;
get isLastStep() {
return this.currentStepIndex === this.steps.length - 1;
}
ngOnInit() {
this.checkMobileView();
}
ngAfterContentInit() {
this.stepsQuery.changes.subscribe(() => {
this.updateSteps();
this.reinitializeWizard();
});
this.updateSteps();
}
ngAfterViewInit() {
this.ensureCoreLoaded();
}
ngOnDestroy() {
this.clearLoadTimer();
this.clearResizeTimer();
this.clearStepChangeTimeout();
this.destroyWizard();
}
onResize() {
this.clearResizeTimer();
this.resizeTimeout = window.setTimeout(() => {
this.checkMobileView();
}, 100);
}
checkMobileView() {
if (this.forceMobileMode !== null) {
this.isMobileView = this.forceMobileMode;
}
else {
this.isMobileView = window.innerWidth <= 576;
}
}
updateSteps() {
this.steps = this.stepsQuery.toArray();
}
getCore() {
return window.core;
}
ensureCoreLoaded() {
if (typeof window === 'undefined') {
return;
}
if (this.getCore()) {
this.initializeWizard();
return;
}
this.loadInterval = window.setInterval(() => {
if (this.getCore()) {
this.clearLoadTimer();
this.initializeWizard();
}
}, 100);
this.loadTimeout = window.setTimeout(() => this.clearLoadTimer(), 10000);
}
clearLoadTimer() {
if (this.loadInterval) {
window.clearInterval(this.loadInterval);
this.loadInterval = undefined;
}
if (this.loadTimeout) {
window.clearTimeout(this.loadTimeout);
this.loadTimeout = undefined;
}
}
clearResizeTimer() {
if (this.resizeTimeout) {
window.clearTimeout(this.resizeTimeout);
this.resizeTimeout = undefined;
}
}
clearStepChangeTimeout() {
if (this.stepChangeTimeout) {
window.clearTimeout(this.stepChangeTimeout);
this.stepChangeTimeout = undefined;
}
}
initializeWizard() {
const core = this.getCore();
if (!core || !core.BRWizard || !this.wizardRoot) {
return;
}
this.destroyWizard();
const root = this.wizardRoot.nativeElement;
try {
this.brWizardInstance = new core.BRWizard('br-wizard', root);
}
catch (error) {
console.error('Erro ao inicializar BRWizard', error);
return;
}
this.bindWizardEvents();
}
reinitializeWizard() {
this.clearStepChangeTimeout();
this.stepChangeTimeout = window.setTimeout(() => {
this.initializeWizard();
}, 0);
}
destroyWizard() {
const root = this.wizardRoot?.nativeElement;
if (root) {
root.removeEventListener('click', this.onWizardClick);
root.removeEventListener('keydown', this.onWizardKeydown);
}
if (this.brWizardInstance) {
this.brWizardInstance = null;
}
}
bindWizardEvents() {
const root = this.wizardRoot?.nativeElement;
if (!root) {
return;
}
root.addEventListener('click', this.onWizardClick);
root.addEventListener('keydown', this.onWizardKeydown);
}
onWizardClick = (event) => {
const target = event.target;
if (!target) {
return;
}
if (target.closest('.wizard-progress-btn')) {
const btn = target.closest('.wizard-progress-btn');
const index = Array.from(this.wizardRoot.nativeElement.querySelectorAll('.wizard-progress-btn')).indexOf(btn);
this.onStepClick(index);
}
};
onWizardKeydown = (event) => {
if (event.key === 'Enter' || event.key === ' ') {
const target = event.target;
if (target?.closest('.wizard-progress-btn')) {
event.preventDefault();
const btn = target.closest('.wizard-progress-btn');
const index = Array.from(this.wizardRoot.nativeElement.querySelectorAll('.wizard-progress-btn')).indexOf(btn);
this.onStepClick(index);
}
}
};
onStepClick(index) {
if (index < 0 || index >= this.steps.length) {
return;
}
if (this.steps[index].disabled) {
return;
}
this.goToStep(index);
}
next() {
if (this.currentStepIndex < this.steps.length - 1) {
this.currentStepIndex++;
this.updateActiveStep();
this.stepChange.emit(this.currentStepIndex);
}
}
previous() {
if (this.currentStepIndex > 0) {
this.currentStepIndex--;
this.updateActiveStep();
this.stepChange.emit(this.currentStepIndex);
}
}
finish() {
this.wizardComplete.emit();
}
onCancel() {
this.wizardCancel.emit();
}
updateActiveStep() {
this.steps.forEach((step, index) => {
step.isActive = index === this.currentStepIndex;
step.isCompleted = index < this.currentStepIndex;
});
}
goToStep(index) {
if (index >= 0 && index < this.steps.length) {
this.currentStepIndex = index;
this.updateActiveStep();
this.stepChange.emit(this.currentStepIndex);
}
}
getNextAriaDescription(index) {
if (index >= this.steps.length - 1) {
return null;
}
return `Passo ${index + 2} de ${this.steps.length} ${this.steps[index + 1].label}`;
}
getPrevAriaDescription(index) {
if (index <= 0) {
return null;
}
return `Passo ${index} de ${this.steps.length} ${this.steps[index - 1].label}`;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WizardComponent, selector: "cfc-wizard", inputs: { currentStepIndex: "currentStepIndex", showCancelButton: "showCancelButton", alwaysShowBackButton: "alwaysShowBackButton", isNextButtonDisabled: "isNextButtonDisabled", isFinishButtonDisabled: "isFinishButtonDisabled", cancelText: "cancelText", backText: "backText", nextText: "nextText", finishText: "finishText", forceMobileMode: "forceMobileMode", orientation: "orientation" }, outputs: { stepChange: "stepChange", wizardCancel: "wizardCancel", wizardComplete: "wizardComplete" }, host: { listeners: { "window:resize": "onResize()" } }, queries: [{ propertyName: "stepsQuery", predicate: WizardStepComponent }], viewQueries: [{ propertyName: "wizardRoot", first: true, predicate: ["wizardRoot"], descendants: true }], ngImport: i0, template: "<div #wizardRoot\r\n class=\"br-wizard\"\r\n [attr.collapsed]=\"isMobileView ? '' : null\"\r\n [attr.vertical]=\"orientation === 'vertical' ? '' : null\"\r\n [attr.step]=\"currentStepIndex + 1\"\r\n role=\"region\"\r\n [attr.aria-label]=\"'Wizard' + (steps.length ? ' de ' + steps.length + ' passos' : '')\"\r\n>\r\n <div class=\"wizard-progress\" role=\"tablist\">\r\n <button\r\n *ngFor=\"let step of steps; let i = index\"\r\n class=\"wizard-progress-btn\"\r\n type=\"button\"\r\n role=\"tab\"\r\n [attr.aria-labelledby]=\"'info-' + i\"\r\n [attr.aria-controls]=\"'tab-' + i\"\r\n [attr.title]=\"step.label\"\r\n [attr.step]=\"i + 1\"\r\n [attr.active]=\"i === currentStepIndex ? '' : null\"\r\n [attr.aria-selected]=\"i === currentStepIndex ? 'true' : 'false'\"\r\n [attr.disabled]=\"step.disabled ? '' : null\"\r\n (click)=\"onStepClick(i); $event.stopPropagation()\"\r\n >\r\n <span class=\"info\" [id]=\"'info-' + i\">{{ step.label }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"wizard-form\">\r\n <div\r\n *ngFor=\"let step of steps; let i = index; let last = last\"\r\n class=\"wizard-panel\"\r\n role=\"tabpanel\"\r\n [id]=\"'tab-' + i\"\r\n [attr.active]=\"i === currentStepIndex ? '' : null\"\r\n >\r\n <div class=\"wizard-panel-content\" tabindex=\"0\">\r\n <div class=\"h3\">{{ step.label }}</div>\r\n <div class=\"text\">\r\n <ng-container *ngTemplateOutlet=\"step.contentTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wizard-panel-btn\">\r\n <button\r\n *ngIf=\"showCancelButton\"\r\n class=\"br-button wizard-btn-canc\"\r\n type=\"button\"\r\n (click)=\"onCancel(); $event.stopPropagation()\"\r\n >\r\n {{ cancelText }}\r\n </button>\r\n\r\n <div class=\"wizard-navigation-buttons\">\r\n <button\r\n *ngIf=\"currentStepIndex > 0 || alwaysShowBackButton\"\r\n class=\"br-button secondary wizard-btn-prev\"\r\n type=\"button\"\r\n [disabled]=\"currentStepIndex === 0\"\r\n [attr.aria-description]=\"getPrevAriaDescription(i)\"\r\n (click)=\"previous(); $event.stopPropagation()\"\r\n >\r\n {{ backText }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"!isLastStep\"\r\n class=\"br-button primary wizard-btn-next\"\r\n type=\"button\"\r\n [disabled]=\"isNextButtonDisabled\"\r\n [attr.aria-description]=\"getNextAriaDescription(i)\"\r\n (click)=\"next(); $event.stopPropagation()\"\r\n >\r\n {{ nextText }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"isLastStep\"\r\n class=\"br-button primary wizard-btn\"\r\n type=\"button\"\r\n [disabled]=\"isFinishButtonDisabled\"\r\n (click)=\"finish(); $event.stopPropagation()\"\r\n >\r\n {{ finishText }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%;width:100%}.br-wizard{height:100%;min-height:400px}.wizard-panel-content{overflow-y:auto}.wizard-panel-btn{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between}.wizard-btn-canc{order:1}.wizard-navigation-buttons{display:flex;flex-wrap:wrap;gap:8px;align-items:center;order:2}.wizard-btn-prev{order:1}.wizard-btn-next,.wizard-btn{order:2}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-wizard', template: "<div #wizardRoot\r\n class=\"br-wizard\"\r\n [attr.collapsed]=\"isMobileView ? '' : null\"\r\n [attr.vertical]=\"orientation === 'vertical' ? '' : null\"\r\n [attr.step]=\"currentStepIndex + 1\"\r\n role=\"region\"\r\n [attr.aria-label]=\"'Wizard' + (steps.length ? ' de ' + steps.length + ' passos' : '')\"\r\n>\r\n <div class=\"wizard-progress\" role=\"tablist\">\r\n <button\r\n *ngFor=\"let step of steps; let i = index\"\r\n class=\"wizard-progress-btn\"\r\n type=\"button\"\r\n role=\"tab\"\r\n [attr.aria-labelledby]=\"'info-' + i\"\r\n [attr.aria-controls]=\"'tab-' + i\"\r\n [attr.title]=\"step.label\"\r\n [attr.step]=\"i + 1\"\r\n [attr.active]=\"i === currentStepIndex ? '' : null\"\r\n [attr.aria-selected]=\"i === currentStepIndex ? 'true' : 'false'\"\r\n [attr.disabled]=\"step.disabled ? '' : null\"\r\n (click)=\"onStepClick(i); $event.stopPropagation()\"\r\n >\r\n <span class=\"info\" [id]=\"'info-' + i\">{{ step.label }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"wizard-form\">\r\n <div\r\n *ngFor=\"let step of steps; let i = index; let last = last\"\r\n class=\"wizard-panel\"\r\n role=\"tabpanel\"\r\n [id]=\"'tab-' + i\"\r\n [attr.active]=\"i === currentStepIndex ? '' : null\"\r\n >\r\n <div class=\"wizard-panel-content\" tabindex=\"0\">\r\n <div class=\"h3\">{{ step.label }}</div>\r\n <div class=\"text\">\r\n <ng-container *ngTemplateOutlet=\"step.contentTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"wizard-panel-btn\">\r\n <button\r\n *ngIf=\"showCancelButton\"\r\n class=\"br-button wizard-btn-canc\"\r\n type=\"button\"\r\n (click)=\"onCancel(); $event.stopPropagation()\"\r\n >\r\n {{ cancelText }}\r\n </button>\r\n\r\n <div class=\"wizard-navigation-buttons\">\r\n <button\r\n *ngIf=\"currentStepIndex > 0 || alwaysShowBackButton\"\r\n class=\"br-button secondary wizard-btn-prev\"\r\n type=\"button\"\r\n [disabled]=\"currentStepIndex === 0\"\r\n [attr.aria-description]=\"getPrevAriaDescription(i)\"\r\n (click)=\"previous(); $event.stopPropagation()\"\r\n >\r\n {{ backText }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"!isLastStep\"\r\n class=\"br-button primary wizard-btn-next\"\r\n type=\"button\"\r\n [disabled]=\"isNextButtonDisabled\"\r\n [attr.aria-description]=\"getNextAriaDescription(i)\"\r\n (click)=\"next(); $event.stopPropagation()\"\r\n >\r\n {{ nextText }}\r\n </button>\r\n\r\n <button\r\n *ngIf=\"isLastStep\"\r\n class=\"br-button primary wizard-btn\"\r\n type=\"button\"\r\n [disabled]=\"isFinishButtonDisabled\"\r\n (click)=\"finish(); $event.stopPropagation()\"\r\n >\r\n {{ finishText }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;height:100%;width:100%}.br-wizard{height:100%;min-height:400px}.wizard-panel-content{overflow-y:auto}.wizard-panel-btn{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between}.wizard-btn-canc{order:1}.wizard-navigation-buttons{display:flex;flex-wrap:wrap;gap:8px;align-items:center;order:2}.wizard-btn-prev{order:1}.wizard-btn-next,.wizard-btn{order:2}\n"] }]
}], propDecorators: { stepsQuery: [{
type: ContentChildren,
args: [WizardStepComponent]
}], wizardRoot: [{
type: ViewChild,
args: ['wizardRoot', { static: false }]
}], currentStepIndex: [{
type: Input
}], showCancelButton: [{
type: Input
}], alwaysShowBackButton: [{
type: Input
}], isNextButtonDisabled: [{
type: Input
}], isFinishButtonDisabled: [{
type: Input
}], cancelText: [{
type: Input
}], backText: [{
type: Input
}], nextText: [{
type: Input
}], finishText: [{
type: Input
}], forceMobileMode: [{
type: Input
}], orientation: [{
type: Input
}], stepChange: [{
type: Output
}], wizardCancel: [{
type: Output
}], wizardComplete: [{
type: Output
}], onResize: [{
type: HostListener,
args: ['window:resize']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NmYy1kcy9zcmMvbGliL2NvbXBvbmVudHMvd2l6YXJkL3dpemFyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3dpemFyZC93aXphcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxlQUFlLEVBRWYsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7O0FBT3pFLE1BQU0sT0FBTyxlQUFlO0lBQ1ksVUFBVSxDQUFrQztJQUNsRixLQUFLLEdBQTBCLEVBQUUsQ0FBQztJQUVVLFVBQVUsQ0FBMkI7SUFFeEUsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUN4QixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDN0Isb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQzdCLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUUvQixVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQ3hCLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDcEIsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNyQixVQUFVLEdBQUcsVUFBVSxDQUFDO0lBRXhCLGVBQWUsR0FBbUIsSUFBSSxDQUFDO0lBQ3ZDLFdBQVcsR0FBOEIsWUFBWSxDQUFDO0lBRS9ELFlBQVksR0FBRyxLQUFLLENBQUM7SUFFWCxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUN4QyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUN4QyxjQUFjLEdBQUcsSUFB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O2dCQUdRLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFakMsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFxQ1AsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBXaXphcmRTdGVwQ29tcG9uZW50IH0gZnJvbSAnLi93aXphcmRTdGVwL3dpemFyZC1zdGVwLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy13aXphcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi93aXphcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3dpemFyZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXaXphcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgQENvbnRlbnRDaGlsZHJlbihXaXphcmRTdGVwQ29tcG9uZW50KSBzdGVwc1F1ZXJ5ITogUXVlcnlMaXN0PFdpemFyZFN0ZXBDb21wb25lbnQ+O1xyXG4gIHN0ZXBzOiBXaXphcmRTdGVwQ29tcG9uZW50W10gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnd2l6YXJkUm9vdCcsIHsgc3RhdGljOiBmYWxzZSB9KSB3aXphcmRSb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwSW5kZXggPSAwO1xyXG4gIEBJbnB1dCgpIHNob3dDYW5jZWxCdXR0b24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGFsd2F5c1Nob3dCYWNrQnV0dG9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgaXNOZXh0QnV0dG9uRGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBpc0ZpbmlzaEJ1dHRvbkRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNhbmNlbFRleHQgPSAnQ2FuY2VsYXInO1xyXG4gIEBJbnB1dCgpIGJhY2tUZXh0ID0gJ1ZvbHRhcic7XHJcbiAgQElucHV0KCkgbmV4dFRleHQgPSAnQXZhbsOnYXInO1xyXG4gIEBJbnB1dCgpIGZpbmlzaFRleHQgPSAnQ29uY2x1aXInO1xyXG5cclxuICBASW5wdXQoKSBmb3JjZU1vYmlsZU1vZGU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyA9ICdob3Jpem9udGFsJztcclxuXHJcbiAgaXNNb2JpbGVWaWV3ID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIHdpemFyZENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgd2l6YXJkQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgYnJXaXphcmRJbnN0YW5jZTogYW55O1xyXG4gIHByaXZhdGUgbG9hZEludGVydmFsOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBsb2FkVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgcmVzaXplVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgc3RlcENoYW5nZVRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcEluZGV4ID09PSB0aGlzLnN0ZXBzLmxlbmd0aCAtIDE7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hlY2tNb2JpbGVWaWV3KCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0ZXBzUXVlcnkuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZVN0ZXBzKCk7XHJcbiAgICAgIHRoaXMucmVpbml0aWFsaXplV2l6YXJkKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVN0ZXBzKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVuc3VyZUNvcmVMb2FkZWQoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckxvYWRUaW1lcigpO1xyXG4gICAgdGhpcy5jbGVhclJlc2l6ZVRpbWVyKCk7XHJcbiAgICB0aGlzLmNsZWFyU3RlcENoYW5nZVRpbWVvdXQoKTtcclxuICAgIHRoaXMuZGVzdHJveVdpemFyZCgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgb25SZXNpemUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyUmVzaXplVGltZXIoKTtcclxuICAgIHRoaXMucmVzaXplVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jaGVja01vYmlsZVZpZXcoKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICBjaGVja01vYmlsZVZpZXcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JjZU1vYmlsZU1vZGUgIT09IG51bGwpIHtcclxuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSB0aGlzLmZvcmNlTW9iaWxlTW9kZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gd2luZG93LmlubmVyV2lkdGggPD0gNTc2O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlU3RlcHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0ZXBzID0gdGhpcy5zdGVwc1F1ZXJ5LnRvQXJyYXkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29yZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5jb3JlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnN1cmVDb3JlTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5nZXRDb3JlKCkpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplV2l6YXJkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmdldENvcmUoKSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXJMb2FkVGltZXIoKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVXaXphcmQoKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuXHJcbiAgICB0aGlzLmxvYWRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5jbGVhckxvYWRUaW1lcigpLCAxMDAwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyTG9hZFRpbWVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubG9hZEludGVydmFsKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMubG9hZEludGVydmFsKTtcclxuICAgICAgdGhpcy5sb2FkSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sb2FkVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubG9hZFRpbWVvdXQpO1xyXG4gICAgICB0aGlzLmxvYWRUaW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclJlc2l6ZVRpbWVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVzaXplVGltZW91dCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XHJcbiAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJTdGVwQ2hhbmdlVGltZW91dCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN0ZXBDaGFuZ2VUaW1lb3V0KSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5zdGVwQ2hhbmdlVGltZW91dCk7XHJcbiAgICAgIHRoaXMuc3RlcENoYW5nZVRpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVXaXphcmQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb3JlID0gdGhpcy5nZXRDb3JlKCk7XHJcbiAgICBpZiAoIWNvcmUgfHwgIWNvcmUuQlJXaXphcmQgfHwgIXRoaXMud2l6YXJkUm9vdCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZXN0cm95V2l6YXJkKCk7XHJcblxyXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMud2l6YXJkUm9vdC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuYnJXaXphcmRJbnN0YW5jZSA9IG5ldyBjb3JlLkJSV2l6YXJkKCdici13aXphcmQnLCByb290KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gaW5pY2lhbGl6YXIgQlJXaXphcmQnLCBlcnJvcik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJpbmRXaXphcmRFdmVudHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVpbml0aWFsaXplV2l6YXJkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhclN0ZXBDaGFuZ2VUaW1lb3V0KCk7XHJcbiAgICB0aGlzLnN0ZXBDaGFuZ2VUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVXaXphcmQoKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95V2l6YXJkKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMud2l6YXJkUm9vdD8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChyb290KSB7XHJcbiAgICAgIHJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uV2l6YXJkQ2xpY2spO1xyXG4gICAgICByb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uV2l6YXJkS2V5ZG93bik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5icldpemFyZEluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuYnJXaXphcmRJbnN0YW5jZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmRXaXphcmRFdmVudHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb290ID0gdGhpcy53aXphcmRSb290Py5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFyb290KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbldpemFyZENsaWNrKTtcclxuICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25XaXphcmRLZXlkb3duKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25XaXphcmRDbGljayA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLndpemFyZC1wcm9ncmVzcy1idG4nKSkge1xyXG4gICAgICBjb25zdCBidG4gPSB0YXJnZXQuY2xvc2VzdCgnLndpemFyZC1wcm9ncmVzcy1idG4nKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY29uc3QgaW5kZXggPSBBcnJheS5mcm9tKFxyXG4gICAgICAgIHRoaXMud2l6YXJkUm9vdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aXphcmQtcHJvZ3Jlc3MtYnRuJylcclxuICAgICAgKS5pbmRleE9mKGJ0bik7XHJcbiAgICAgIHRoaXMub25TdGVwQ2xpY2soaW5kZXgpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgb25XaXphcmRLZXlkb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgaWYgKHRhcmdldD8uY2xvc2VzdCgnLndpemFyZC1wcm9ncmVzcy1idG4nKSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgY29uc3QgYnRuID0gdGFyZ2V0LmNsb3Nlc3QoJy53aXphcmQtcHJvZ3Jlc3MtYnRuJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBBcnJheS5mcm9tKFxyXG4gICAgICAgICAgdGhpcy53aXphcmRSb290Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLndpemFyZC1wcm9ncmVzcy1idG4nKVxyXG4gICAgICAgICkuaW5kZXhPZihidG4pO1xyXG4gICAgICAgIHRoaXMub25TdGVwQ2xpY2soaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgb25TdGVwQ2xpY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnN0ZXBzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwc1tpbmRleF0uZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nb1RvU3RlcChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBuZXh0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXBJbmRleCA8IHRoaXMuc3RlcHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXgrKztcclxuICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdGVwKCk7XHJcbiAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmV2aW91cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPiAwKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xyXG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0ZXAoKTtcclxuICAgICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbmlzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMud2l6YXJkQ29tcGxldGUuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLndpemFyZENhbmNlbC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBY3RpdmVTdGVwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4ge1xyXG4gICAgICBzdGVwLmlzQWN0aXZlID0gaW5kZXggPT09IHRoaXMuY3VycmVudFN0ZXBJbmRleDtcclxuICAgICAgc3RlcC5pc0NvbXBsZXRlZCA9IGluZGV4IDwgdGhpcy5jdXJyZW50U3RlcEluZGV4O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnb1RvU3RlcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuc3RlcHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IGluZGV4O1xyXG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0ZXAoKTtcclxuICAgICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5leHRBcmlhRGVzY3JpcHRpb24oaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKGluZGV4ID49IHRoaXMuc3RlcHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBgUGFzc28gJHtpbmRleCArIDJ9IGRlICR7dGhpcy5zdGVwcy5sZW5ndGh9ICR7dGhpcy5zdGVwc1tpbmRleCArIDFdLmxhYmVsfWA7XHJcbiAgfVxyXG5cclxuICBnZXRQcmV2QXJpYURlc2NyaXB0aW9uKGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmIChpbmRleCA8PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGBQYXNzbyAke2luZGV4fSBkZSAke3RoaXMuc3RlcHMubGVuZ3RofSAke3RoaXMuc3RlcHNbaW5kZXggLSAxXS5sYWJlbH1gO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICN3aXphcmRSb290XHJcbiAgY2xhc3M9XCJici13aXphcmRcIlxyXG4gIFthdHRyLmNvbGxhcHNlZF09XCJpc01vYmlsZVZpZXcgPyAnJyA6IG51bGxcIlxyXG4gIFthdHRyLnZlcnRpY2FsXT1cIm9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gJycgOiBudWxsXCJcclxuICBbYXR0ci5zdGVwXT1cImN1cnJlbnRTdGVwSW5kZXggKyAxXCJcclxuICByb2xlPVwicmVnaW9uXCJcclxuICBbYXR0ci5hcmlhLWxhYmVsXT1cIidXaXphcmQnICsgKHN0ZXBzLmxlbmd0aCA/ICcgZGUgJyArIHN0ZXBzLmxlbmd0aCArICcgcGFzc29zJyA6ICcnKVwiXHJcbj5cclxuICA8ZGl2IGNsYXNzPVwid2l6YXJkLXByb2dyZXNzXCIgcm9sZT1cInRhYmxpc3RcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICBjbGFzcz1cIndpemFyZC1wcm9ncmVzcy1idG5cIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgcm9sZT1cInRhYlwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInaW5mby0nICsgaVwiXHJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3RhYi0nICsgaVwiXHJcbiAgICAgIFthdHRyLnRpdGxlXT1cInN0ZXAubGFiZWxcIlxyXG4gICAgICBbYXR0ci5zdGVwXT1cImkgKyAxXCJcclxuICAgICAgW2F0dHIuYWN0aXZlXT1cImkgPT09IGN1cnJlbnRTdGVwSW5kZXggPyAnJyA6IG51bGxcIlxyXG4gICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImkgPT09IGN1cnJlbnRTdGVwSW5kZXggPyAndHJ1ZScgOiAnZmFsc2UnXCJcclxuICAgICAgW2F0dHIuZGlzYWJsZWRdPVwic3RlcC5kaXNhYmxlZCA/ICcnIDogbnVsbFwiXHJcbiAgICAgIChjbGljayk9XCJvblN0ZXBDbGljayhpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpbmZvXCIgW2lkXT1cIidpbmZvLScgKyBpXCI+e3sgc3RlcC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwid2l6YXJkLWZvcm1cIj5cclxuICAgIDxkaXZcclxuICAgICAgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiXHJcbiAgICAgIGNsYXNzPVwid2l6YXJkLXBhbmVsXCJcclxuICAgICAgcm9sZT1cInRhYnBhbmVsXCJcclxuICAgICAgW2lkXT1cIid0YWItJyArIGlcIlxyXG4gICAgICBbYXR0ci5hY3RpdmVdPVwiaSA9PT0gY3VycmVudFN0ZXBJbmRleCA/ICcnIDogbnVsbFwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3aXphcmQtcGFuZWwtY29udGVudFwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoM1wiPnt7IHN0ZXAubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0ZXAuY29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIndpemFyZC1wYW5lbC1idG5cIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJici1idXR0b24gd2l6YXJkLWJ0bi1jYW5jXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2FuY2VsKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgY2FuY2VsVGV4dCB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2l6YXJkLW5hdmlnYXRpb24tYnV0dG9uc1wiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRTdGVwSW5kZXggPiAwIHx8IGFsd2F5c1Nob3dCYWNrQnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJici1idXR0b24gc2Vjb25kYXJ5IHdpemFyZC1idG4tcHJldlwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFN0ZXBJbmRleCA9PT0gMFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpcHRpb25dPVwiZ2V0UHJldkFyaWFEZXNjcmlwdGlvbihpKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJwcmV2aW91cygpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBiYWNrVGV4dCB9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cIiFpc0xhc3RTdGVwXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJici1idXR0b24gcHJpbWFyeSB3aXphcmQtYnRuLW5leHRcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTmV4dEJ1dHRvbkRpc2FibGVkXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmlwdGlvbl09XCJnZXROZXh0QXJpYURlc2NyaXB0aW9uKGkpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm5leHQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgbmV4dFRleHQgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJpc0xhc3RTdGVwXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJici1idXR0b24gcHJpbWFyeSB3aXphcmQtYnRuXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0ZpbmlzaEJ1dHRvbkRpc2FibGVkXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImZpbmlzaCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBmaW5pc2hUZXh0IH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==