dcl-ui-toolkit
Version:
A collection of UI helpers to make it easier to build a Decentraland scene using the SDK 7.
239 lines • 35 kB
JavaScript
import ReactEcs, { UiEntity } from '@dcl/sdk/react-ecs';
import { Color4 } from '@dcl/sdk/math';
import { InPromptUIObject } from '../../InPromptUIObject';
import { SystemInputActions } from '../../../../../utils/systemInputActionsUtils';
import { getImageAtlasMapping } from '../../../../../utils/imageUtils';
import { AtlasTheme, sourcesComponentsCoordinates } from '../../../../../constants/resources';
import { defaultFont } from '../../../../../constants/font';
export var PromptButtonStyles;
(function (PromptButtonStyles) {
PromptButtonStyles["E"] = "E";
PromptButtonStyles["F"] = "F";
PromptButtonStyles["DARK"] = "dark";
PromptButtonStyles["RED"] = "red";
PromptButtonStyles["ROUNDBLACK"] = "roundBlack";
PromptButtonStyles["ROUNDWHITE"] = "roundWhite";
PromptButtonStyles["ROUNDSILVER"] = "roundSilver";
PromptButtonStyles["ROUNDGOLD"] = "roundGold";
PromptButtonStyles["SQUAREBLACK"] = "squareBlack";
PromptButtonStyles["SQUAREWHITE"] = "squareWhite";
PromptButtonStyles["SQUARESILVER"] = "squareSilver";
PromptButtonStyles["SQUAREGOLD"] = "squareGold";
})(PromptButtonStyles || (PromptButtonStyles = {}));
var PromptButtonCustomBgStyles;
(function (PromptButtonCustomBgStyles) {
PromptButtonCustomBgStyles["BUTTONE"] = "buttonE";
PromptButtonCustomBgStyles["BUTTONF"] = "buttonF";
PromptButtonCustomBgStyles["BUTTONECORNER"] = "buttonECorner";
PromptButtonCustomBgStyles["BUTTONEEDGE"] = "buttonEEdge";
PromptButtonCustomBgStyles["BUTTONFCORNER"] = "buttonFCorner";
PromptButtonCustomBgStyles["BUTTONFEDGE"] = "buttonFEdge";
})(PromptButtonCustomBgStyles || (PromptButtonCustomBgStyles = {}));
const promptButtonInitialConfig = {
startHidden: false,
text: '',
xPosition: 0,
yPosition: 0,
positionAbsolute: true,
onMouseDown: () => { },
style: PromptButtonStyles.ROUNDSILVER,
buttonSize: 'auto'
};
export class PromptButton extends InPromptUIObject {
constructor({ parent, startHidden = promptButtonInitialConfig.startHidden, text = promptButtonInitialConfig.text, xPosition = promptButtonInitialConfig.xPosition, yPosition = promptButtonInitialConfig.yPosition, positionAbsolute = promptButtonInitialConfig.positionAbsolute, onMouseDown = promptButtonInitialConfig.onMouseDown, style = promptButtonInitialConfig.style, buttonSize = promptButtonInitialConfig.buttonSize, }) {
super({
startHidden,
parent,
});
this._click = () => {
if (this._disabled || !this.visible || !this.isPromptVisible)
return;
console.log('prompt button _click_________________');
this.onMouseDown();
};
this.text = text;
this.xPosition = xPosition;
this.yPosition = yPosition;
this.positionAbsolute = positionAbsolute,
this.onMouseDown = onMouseDown;
this._style = style;
this._disabled = false;
this._isEStyle = this._style === PromptButtonStyles.E;
this._isFStyle = this._style === PromptButtonStyles.F;
this._width = 174;
this._height = 46;
let buttonImg = this._style;
let buttonImgCorn = this._style;
let buttonImgEdge = this._style;
let labelXOffset = 0;
if (this._isEStyle) {
buttonImg = PromptButtonCustomBgStyles.BUTTONE;
buttonImgCorn = PromptButtonCustomBgStyles.BUTTONECORNER;
buttonImgEdge = PromptButtonCustomBgStyles.BUTTONEEDGE;
labelXOffset = 25;
}
if (this._isFStyle) {
buttonImg = PromptButtonCustomBgStyles.BUTTONF;
buttonImgCorn = PromptButtonCustomBgStyles.BUTTONFCORNER;
buttonImgEdge = PromptButtonCustomBgStyles.BUTTONFEDGE;
labelXOffset = 25;
}
this._labelDisabledColor = Color4.Gray();
this._labelColor =
this._style == PromptButtonStyles.ROUNDWHITE || this._style == PromptButtonStyles.SQUAREWHITE
? Color4.Black()
: Color4.White();
this.labelElement = {};
this.imageElement = {
uiTransform: {
justifyContent: 'flex-end',
width: typeof (buttonSize) == 'number' ? buttonSize : 'auto',
height: this._height,
margin: { top: 30, bottom: 20 },
maxWidth: 300,
},
uiBackground: {
textureMode: 'stretch',
texture: {
src: AtlasTheme.ATLAS_PATH_LIGHT,
},
uvs: getImageAtlasMapping({
...sourcesComponentsCoordinates.buttons[buttonImg],
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
}),
},
};
this.imageElementCorner = {
uiTransform: {
height: this._height,
width: 12
},
uiBackground: {
textureMode: 'stretch',
texture: {
src: AtlasTheme.ATLAS_PATH_LIGHT,
},
uvs: getImageAtlasMapping({
...sourcesComponentsCoordinates.buttons[buttonImgCorn],
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
}),
},
};
this.imageElementEdge = {
uiTransform: {
height: this._height,
width: 12,
margin: { right: 10 }
},
uiBackground: {
textureMode: 'stretch',
texture: {
src: AtlasTheme.ATLAS_PATH_LIGHT,
},
uvs: getImageAtlasMapping({
...sourcesComponentsCoordinates.buttons[buttonImgEdge],
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
}),
},
};
this.iconElement = {
uiTransform: {
width: 26,
height: 26,
alignSelf: 'flex-start',
justifyContent: "center",
position: {
top: '50%',
},
},
uiBackground: {
textureMode: 'stretch',
texture: {
src: AtlasTheme.ATLAS_PATH_LIGHT,
},
uvs: getImageAtlasMapping({
...sourcesComponentsCoordinates.buttons[this._style],
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
}),
},
};
this._createSystemInputAction();
}
show() {
super.show();
this._createSystemInputAction();
}
hide() {
super.hide();
this._clearSystemInputAction();
}
grayOut() {
this._disabled = true;
}
enable() {
this._disabled = false;
}
render(key) {
this._xPosition = this.promptWidth / -2 + this._width / 2 + this.xPosition;
this._yPosition = this.promptHeight / 2 + this._height / -2 + this.yPosition;
return (ReactEcs.createElement(UiEntity, { key: key, uiTransform: (!this.positionAbsolute)
? {
...this.imageElement.uiTransform,
display: this.visible ? 'flex' : 'none',
}
: {
...this.imageElement.uiTransform,
display: this.visible ? 'flex' : 'none',
position: { bottom: this._yPosition, right: this._xPosition * -1 },
positionType: 'absolute'
}, onMouseDown: () => {
console.log('prompt button onMouseDown_________________');
this._click();
} },
ReactEcs.createElement(UiEntity, { ...this.imageElementCorner }),
ReactEcs.createElement(UiEntity, { ...this.imageElement, uiTransform: {
display: this.visible ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { ...this.iconElement, uiTransform: {
...this.iconElement.uiTransform,
display: this._disabled || (!this._isEStyle && !this._isFStyle) ? 'none' : 'flex',
margin: {
top: -26 / 2,
right: 5
},
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: 255,
overflow: 'hidden',
}, uiText: {
value: String(this.text),
color: this._disabled ? this._labelDisabledColor : this.labelElement.color || this._labelColor,
fontSize: 24,
font: defaultFont,
textAlign: 'middle-left'
} })),
ReactEcs.createElement(UiEntity, { ...this.imageElementEdge })));
}
_buttonIconPos(textLen) {
let pos = -20 - textLen * 4;
return pos > -65 ? pos : -65;
}
_createSystemInputAction() {
if (!this.visible || (!this._isEStyle && !this._isFStyle))
return;
this._buttonSystemInputAction = new SystemInputActions({
inputAction: this._isEStyle ? 1 : 2,
callback: this._click,
});
this._buttonSystemInputAction.add();
}
_clearSystemInputAction() {
this._buttonSystemInputAction?.remove();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvdWktZW50aXRpZXMvcHJvbXB0cy9Qcm9tcHQvY29tcG9uZW50cy9CdXR0b24vaW5kZXgudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxFQUFFLEVBQVMsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUt0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sd0JBQXdCLENBQUE7QUFFakYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOENBQThDLENBQUE7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFFdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFBO0FBQzdGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQVkzRCxNQUFNLENBQU4sSUFBWSxrQkFhWDtBQWJELFdBQVksa0JBQWtCO0lBQzVCLDZCQUFPLENBQUE7SUFDUCw2QkFBTyxDQUFBO0lBQ1AsbUNBQWEsQ0FBQTtJQUNiLGlDQUFXLENBQUE7SUFDWCwrQ0FBeUIsQ0FBQTtJQUN6QiwrQ0FBeUIsQ0FBQTtJQUN6QixpREFBMkIsQ0FBQTtJQUMzQiw2Q0FBdUIsQ0FBQTtJQUN2QixpREFBMkIsQ0FBQTtJQUMzQixpREFBMkIsQ0FBQTtJQUMzQixtREFBNkIsQ0FBQTtJQUM3QiwrQ0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBYlcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQWE3QjtBQUVELElBQUssMEJBT0o7QUFQRCxXQUFLLDBCQUEwQjtJQUM3QixpREFBbUIsQ0FBQTtJQUNuQixpREFBbUIsQ0FBQTtJQUNuQiw2REFBK0IsQ0FBQTtJQUMvQix5REFBMkIsQ0FBQTtJQUMzQiw2REFBK0Is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QixDQUFDLEVBQXlCO1lBQy9FLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtTQUN0QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDckMsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLENBQUE7SUFDekMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0RWNzLCB7IExhYmVsLCBVaUVudGl0eSB9IGZyb20gJ0BkY2wvc2RrL3JlYWN0LWVjcydcbmltcG9ydCB7IENhbGxiYWNrIH0gZnJvbSAnQGRjbC9yZWFjdC1lY3MvZGlzdC9jb21wb25lbnRzL2xpc3RlbmVycy90eXBlcydcbmltcG9ydCB7IENvbG9yNCB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBFbnRpdHlQcm9wVHlwZXMgfSBmcm9tICdAZGNsL3JlYWN0LWVjcy9kaXN0L2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyBVaUxhYmVsUHJvcHMgfSBmcm9tICdAZGNsL3JlYWN0LWVjcy9kaXN0L2NvbXBvbmVudHMvTGFiZWwvdHlwZXMnXG5pbXBvcnQgeyBJbnB1dEFjdGlvbiwgVWlUZXh0IH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuXG5pbXBvcnQgeyBJblByb21wdFVJT2JqZWN0LCBJblByb21wdFVJT2JqZWN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vSW5Qcm9tcHRVSU9iamVjdCdcblxuaW1wb3J0IHsgU3lzdGVtSW5wdXRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvc3lzdGVtSW5wdXRBY3Rpb25zVXRpbHMnXG5pbXBvcnQgeyBnZXRJbWFnZUF0bGFzTWFwcGluZyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2ltYWdlVXRpbHMnXG5cbmltcG9ydCB7IEF0bGFzVGhlbWUsIHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb25zdGFudHMvcmVzb3VyY2VzJ1xuaW1wb3J0IHsgZGVmYXVsdEZvbnQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb25zdGFudHMvZm9udCdcblxuZXhwb3J0IHR5cGUgUHJvbXB0QnV0dG9uTGFiZWxFbGVtZW50UHJvcHMgPSBFbnRpdHlQcm9wVHlwZXMgJiBPbWl0PFVpTGFiZWxQcm9wcywgJ3ZhbHVlJz5cblxuZXhwb3J0IHR5cGUgUHJvbXB0QnV0dG9uSWNvbkVsZW1lbnRQcm9wcyA9IE9taXQ8RW50aXR5UHJvcFR5cGVzLCAndWlUcmFuc2Zvcm0nPiAmIHtcbiAgdWlUcmFuc2Zvcm0/OiBPbWl0PE5vbk51bGxhYmxlPEVudGl0eVByb3BUeXBlc1sndWlUcmFuc2Zvcm0nXT4sICdtYXJnaW4nIHwgJ2Rpc3BsYXknPlxufVxuXG5leHBvcnQgdHlwZSBQcm9tcHRCdXR0b25JbWFnZUVsZW1lbnRQcm9wcyA9IE9taXQ8RW50aXR5UHJvcFR5cGVzLCAndWlUcmFuc2Zvcm0nIHwgJ29uTW91c2VEb3duJz4gJiB7XG4gIHVpVHJhbnNmb3JtPzogT21pdDxOb25OdWxsYWJsZTxFbnRpdHlQcm9wVHlwZXNbJ3VpVHJhbnNmb3JtJ10+LCAncG9zaXRpb24nIHwgJ2Rpc3BsYXknPlxufVxuXG5leHBvcnQgZW51bSBQcm9tcHRCdXR0b25TdHlsZXMge1xuICBFID0gYEVgLFxuICBGID0gYEZgLFxuICBEQVJLID0gYGRhcmtgLFxuICBSRUQgPSBgcmVkYCxcbiAgUk9VTkRCTEFDSyA9IGByb3VuZEJsYWNrYCxcbiAgUk9VTkRXSElURSA9IGByb3VuZFdoaXRlYCxcbiAgUk9VTkRTSUxWRVIgPSBgcm91bmRTaWx2ZXJgLFxuICBST1VOREdPTEQgPSBgcm91bmRHb2xkYCxcbiAgU1FVQVJFQkxBQ0sgPSBgc3F1YXJlQmxhY2tgLFxuICBTUVVBUkVXSElURSA9IGBzcXVhcmVXaGl0ZWAsXG4gIFNRVUFSRVNJTFZFUiA9IGBzcXVhcmVTaWx2ZXJgLFxuICBTUVVBUkVHT0xEID0gYHNxdWFyZUdvbGRgLFxufVxuXG5lbnVtIFByb21wdEJ1dHRvbkN1c3RvbUJnU3R5bGVzIHtcbiAgQlVUVE9ORSA9IGBidXR0b25FYCxcbiAgQlVUVE9ORiA9IGBidXR0b25GYCxcbiAgQlVUVE9ORUNPUk5FUiA9IGBidXR0b25FQ29ybmVyYCxcbiAgQlVUVE9ORUVER0UgPSBgYnV0dG9uRUVkZ2VgLFxuICBCVVRUT05GQ09STkVSID0gYGJ1dHRvbkZDb3JuZXJgLFxuICBCVVRUT05GRURHRSA9IGBidXR0b25GRWRnZWAsXG59XG5cbmV4cG9ydCB0eXBlIFByb21wdEJ1dHRvbkNvbmZpZyA9IEluUHJvbXB0VUlPYmplY3RDb25maWcgJiB7XG4gIHRleHQ6IHN0cmluZyB8IG51bWJlclxuICB4UG9zaXRpb24/OiBudW1iZXJcbiAgeVBvc2l0aW9uPzogbnVtYmVyXG4gIHBvc2l0aW9uQWJzb2x1dGU/OiBib29sZWFuXG4gIG9uTW91c2VEb3duOiBDYWxsYmFja1xuICBzdHlsZT86IFByb21wdEJ1dHRvblN0eWxlc1xuICBidXR0b25TaXplPzogbnVtYmVyIHwgJ2F1dG8nXG59XG5cbmNvbnN0IHByb21wdEJ1dHRvbkluaXRpYWxDb25maWc6IE9taXQ8UmVxdWlyZWQ8UHJvbXB0QnV0dG9uQ29uZmlnPiwgJ3BhcmVudCc+ID0ge1xuICBzdGFydEhpZGRlbjogZmFsc2UsXG4gIHRleHQ6ICcnLFxuICB4UG9zaXRpb246IDAsXG4gIHlQb3NpdGlvbjogMCxcbiAgcG9zaXRpb25BYnNvbHV0ZTogdHJ1ZSxcbiAgb25Nb3VzZURvd246ICgpID0+IHsgfSxcbiAgc3R5bGU6IFByb21wdEJ1dHRvblN0eWxlcy5ST1VORFNJTFZFUixcbiAgYnV0dG9uU2l6ZTogJ2F1dG8nXG59IGFzIGNvbnN0XG5cbi8qKlxuICogUHJvbXB0IGJ1dHRvblxuICogQHBhcmFtIHtib29sZWFufSBbc3RhcnRIaWRkZW49ZmFsc2VdIHN0YXJ0aW5nIGhpZGRlblxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IFt0ZXh0PScnXSBsYWJlbCB0ZXh0XG4gKiBAcGFyYW0ge251bWJlcn0gW3hQb3NpdGlvbj0wXSBQb3NpdGlvbiBvbiBYIG9uIHRoZSBwcm9tcHQsIGNvdW50aW5nIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgcHJvbXB0XG4gKiBAcGFyYW0ge251bWJlcn0gW3lQb3NpdGlvbj0wXSBQb3NpdGlvbiBvbiBZIG9uIHRoZSBwcm9tcHQsIGNvdW50aW5nIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgcHJvbXB0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwb3NpdGlvbkFic29sdXRlPXRydWVdIFBvc2l0aW9uIGJ5IGFic29sdXRlXG4gKiBAcGFyYW0ge0NhbGxiYWNrfSBbb25Nb3VzZURvd249MF0gY2xpY2sgYWN0aW9uXG4gKiBAcGFyYW0ge1Byb21wdEJ1dHRvblN0eWxlc30gW3N0eWxlPUNsb3NlSWNvblN0eWxlcy5ST1VORFNJTFZFUl0gdmlzaWJsZSB2YXJpYW50XG4gKlxuICovXG5leHBvcnQgY2xhc3MgUHJvbXB0QnV0dG9uIGV4dGVuZHMgSW5Qcm9tcHRVSU9iamVjdCB7XG4gIHB1YmxpYyBsYWJlbEVsZW1lbnQ6IFByb21wdEJ1dHRvbkxhYmVsRWxlbWVudFByb3BzXG4gIHB1YmxpYyBpbWFnZUVsZW1lbnQ6IFByb21wdEJ1dHRvbkltYWdlRWxlbWVudFByb3BzXG4gIHB1YmxpYyBpbWFnZUVsZW1lbnRDb3JuZXI6IFByb21wdEJ1dHRvbkltYWdlRWxlbWVudFByb3BzXG4gIHB1YmxpYyBpbWFnZUVsZW1lbnRFZGdlOiBQcm9tcHRCdXR0b25JbWFnZUVsZW1lbnRQcm9wc1xuICBwdWJsaWMgaWNvbkVsZW1lbnQ6IFByb21wdEJ1dHRvbkljb25FbGVtZW50UHJvcHNcblxuICBwdWJsaWMgdGV4dDogc3RyaW5nIHwgbnVtYmVyXG4gIHB1YmxpYyB4UG9zaXRpb246IG51bWJlclxuICBwdWJsaWMgeVBvc2l0aW9uOiBudW1iZXJcbiAgcHVibGljIHBvc2l0aW9uQWJzb2x1dGU6IGJvb2xlYW5cbiAgcHVibGljIG9uTW91c2VEb3duOiBDYWxsYmFja1xuXG4gIHByaXZhdGUgX3hQb3NpdGlvbjogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgX3lQb3NpdGlvbjogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgcmVhZG9ubHkgX3dpZHRoOiBudW1iZXJcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVpZ2h0OiBudW1iZXJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBfbGFiZWxDb2xvcjogQ29sb3I0XG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhYmVsRGlzYWJsZWRDb2xvcjogQ29sb3I0XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0eWxlOiBQcm9tcHRCdXR0b25TdHlsZXNcbiAgcHJpdmF0ZSByZWFkb25seSBfaXNFU3R5bGU6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBfaXNGU3R5bGU6IGJvb2xlYW5cbiAgcHJpdmF0ZSBfYnV0dG9uU3lzdGVtSW5wdXRBY3Rpb246IFN5c3RlbUlucHV0QWN0aW9ucyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwYXJlbnQsXG4gICAgc3RhcnRIaWRkZW4gPSBwcm9tcHRCdXR0b25Jbml0aWFsQ29uZmlnLnN0YXJ0SGlkZGVuLFxuICAgIHRleHQgPSBwcm9tcHRCdXR0b25Jbml0aWFsQ29uZmlnLnRleHQsXG4gICAgeFBvc2l0aW9uID0gcHJvbXB0QnV0dG9uSW5pdGlhbENvbmZpZy54UG9zaXRpb24sXG4gICAgeVBvc2l0aW9uID0gcHJvbXB0QnV0dG9uSW5pdGlhbENvbmZpZy55UG9zaXRpb24sXG4gICAgcG9zaXRpb25BYnNvbHV0ZSA9IHByb21wdEJ1dHRvbkluaXRpYWxDb25maWcucG9zaXRpb25BYnNvbHV0ZSxcbiAgICBvbk1vdXNlRG93biA9IHByb21wdEJ1dHRvbkluaXRpYWxDb25maWcub25Nb3VzZURvd24sXG4gICAgc3R5bGUgPSBwcm9tcHRCdXR0b25Jbml0aWFsQ29uZmlnLnN0eWxlLFxuICAgIGJ1dHRvblNpemUgPSBwcm9tcHRCdXR0b25Jbml0aWFsQ29uZmlnLmJ1dHRvblNpemUsXG4gIH06IFByb21wdEJ1dHRvbkNvbmZpZykge1xuICAgIHN1cGVyKHtcbiAgICAgIHN0YXJ0SGlkZGVuLFxuICAgICAgcGFyZW50LFxuICAgIH0pXG5cbiAgICB0aGlzLnRleHQgPSB0ZXh0XG4gICAgdGhpcy54UG9zaXRpb24gPSB4UG9zaXRpb25cbiAgICB0aGlzLnlQb3NpdGlvbiA9IHlQb3NpdGlvblxuICAgIHRoaXMucG9zaXRpb25BYnNvbHV0ZSA9IHBvc2l0aW9uQWJzb2x1dGUsXG4gICAgdGhpcy5vbk1vdXNlRG93biA9IG9uTW91c2VEb3duXG5cbiAgICB0aGlzLl9zdHlsZSA9IHN0eWxlXG5cbiAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9pc0VTdHlsZSA9IHRoaXMuX3N0eWxlID09PSBQcm9tcHRCdXR0b25TdHlsZXMuRVxuICAgIHRoaXMuX2lzRlN0eWxlID0gdGhpcy5fc3R5bGUgPT09IFByb21wdEJ1dHRvblN0eWxlcy5GXG5cblxuICAgIHRoaXMuX3dpZHRoID0gMTc0XG4gICAgdGhpcy5faGVpZ2h0ID0gNDZcblxuICAgIGxldCBidXR0b25JbWc6IFByb21wdEJ1dHRvbkN1c3RvbUJnU3R5bGVzIHwgUHJvbXB0QnV0dG9uU3R5bGVzID0gdGhpcy5fc3R5bGVcbiAgICBsZXQgYnV0dG9uSW1nQ29ybjogUHJvbXB0QnV0dG9uQ3VzdG9tQmdTdHlsZXMgfCBQcm9tcHRCdXR0b25TdHlsZXMgPSB0aGlzLl9zdHlsZVxuICAgIGxldCBidXR0b25JbWdFZGdlOiBQcm9tcHRCdXR0b25DdXN0b21CZ1N0eWxlcyB8IFByb21wdEJ1dHRvblN0eWxlcyA9IHRoaXMuX3N0eWxlXG5cblxuICAgIGxldCBsYWJlbFhPZmZzZXQ6IG51bWJlciA9IDBcblxuICAgIGlmICh0aGlzLl9pc0VTdHlsZSkge1xuICAgICAgYnV0dG9uSW1nID0gUHJvbXB0QnV0dG9uQ3VzdG9tQmdTdHlsZXMuQlVUVE9ORVxuICAgICAgYnV0dG9uSW1nQ29ybiA9IFByb21wdEJ1dHRvbkN1c3RvbUJnU3R5bGVzLkJVVFRPTkVDT1JORVJcbiAgICAgIGJ1dHRvbkltZ0VkZ2UgPSBQcm9tcHRCdXR0b25DdXN0b21CZ1N0eWxlcy5CVVRUT05FRURHRVxuICAgICAgbGFiZWxYT2Zmc2V0ID0gMjVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNGU3R5bGUpIHtcbiAgICAgIGJ1dHRvbkltZyA9IFByb21wdEJ1dHRvbkN1c3RvbUJnU3R5bGVzLkJVVFRPTkZcbiAgICAgIGJ1dHRvbkltZ0Nvcm4gPSBQcm9tcHRCdXR0b25DdXN0b21CZ1N0eWxlcy5CVVRUT05GQ09STkVSXG4gICAgICBidXR0b25JbWdFZGdlID0gUHJvbXB0QnV0dG9uQ3VzdG9tQmdTdHlsZXMuQlVUVE9ORkVER0VcbiAgICAgIGxhYmVsWE9mZnNldCA9IDI1XG4gICAgfVxuXG4gICAgdGhpcy5fbGFiZWxEaXNhYmxlZENvbG9yID0gQ29sb3I0LkdyYXkoKVxuICAgIHRoaXMuX2xhYmVsQ29sb3IgPVxuICAgICAgdGhpcy5fc3R5bGUgPT0gUHJvbXB0QnV0dG9uU3R5bGVzLlJPVU5EV0hJVEUgfHwgdGhpcy5fc3R5bGUgPT0gUHJvbXB0QnV0dG9uU3R5bGVzLlNRVUFSRVdISVRFXG4gICAgICAgID8gQ29sb3I0LkJsYWNrKClcbiAgICAgICAgOiBDb2xvcjQuV2hpdGUoKVxuXG4gICAgdGhpcy5sYWJlbEVsZW1lbnQgPSB7fVxuXG4gICAgdGhpcy5pbWFnZUVsZW1lbnQgPSB7XG4gICAgICB1aVRyYW5zZm9ybToge1xuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJyxcbiAgICAgICAgd2lkdGg6IHR5cGVvZiAoYnV0dG9uU2l6ZSkgPT0gJ251bWJlcicgPyBidXR0b25TaXplIGFzIG51bWJlciA6ICdhdXRvJyxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLl9oZWlnaHQsXG4gICAgICAgIG1hcmdpbjogeyB0b3A6IDMwLCBib3R0b206IDIwIH0sXG4gICAgICAgIG1heFdpZHRoOiAzMDAsXG4gICAgICB9LFxuICAgICAgdWlCYWNrZ3JvdW5kOiB7XG4gICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICBzcmM6IEF0bGFzVGhlbWUuQVRMQVNfUEFUSF9MSUdIVCxcbiAgICAgICAgfSxcbiAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyh7XG4gICAgICAgICAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zW2J1dHRvbkltZ10sXG4gICAgICAgICAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gICAgICAgICAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgdGhpcy5pbWFnZUVsZW1lbnRDb3JuZXIgPSB7XG4gICAgICB1aVRyYW5zZm9ybToge1xuICAgICAgICBoZWlnaHQ6IHRoaXMuX2hlaWdodCxcbiAgICAgICAgd2lkdGg6IDEyXG4gICAgICB9LFxuICAgICAgdWlCYWNrZ3JvdW5kOiB7XG4gICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICBzcmM6IEF0bGFzVGhlbWUuQVRMQVNfUEFUSF9MSUdIVCxcbiAgICAgICAgfSxcbiAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyh7XG4gICAgICAgICAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zW2J1dHRvbkltZ0Nvcm5dLFxuICAgICAgICAgIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICAgICAgICAgIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH1cblxuICAgIHRoaXMuaW1hZ2VFbGVtZW50RWRnZSA9IHtcbiAgICAgIHVpVHJhbnNmb3JtOiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5faGVpZ2h0LFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICAgIG1hcmdpbjogeyByaWdodDogMTAgfVxuICAgICAgfSxcbiAgICAgIHVpQmFja2dyb3VuZDoge1xuICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgc3JjOiBBdGxhc1RoZW1lLkFUTEFTX1BBVEhfTElHSFQsXG4gICAgICAgIH0sXG4gICAgICAgIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcoe1xuICAgICAgICAgIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9uc1tidXR0b25JbWdFZGdlXSxcbiAgICAgICAgICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgICAgICAgICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGgsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICB0aGlzLmljb25FbGVtZW50ID0ge1xuICAgICAgdWlUcmFuc2Zvcm06IHtcbiAgICAgICAgd2lkdGg6IDI2LFxuICAgICAgICBoZWlnaHQ6IDI2LFxuICAgICAgICBhbGlnblNlbGY6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgdG9wOiAnNTAlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB1aUJhY2tncm91bmQ6IHtcbiAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgIHNyYzogQXRsYXNUaGVtZS5BVExBU19QQVRIX0xJR0hULFxuICAgICAgICB9LFxuICAgICAgICB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKHtcbiAgICAgICAgICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnNbdGhpcy5fc3R5bGVdLFxuICAgICAgICAgIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICAgICAgICAgIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH1cblxuICAgIHRoaXMuX2NyZWF0ZVN5c3RlbUlucHV0QWN0aW9uKClcbiAgfVxuXG4gIHB1YmxpYyBzaG93KCk6IHZvaWQge1xuICAgIHN1cGVyLnNob3coKVxuXG4gICAgdGhpcy5fY3JlYXRlU3lzdGVtSW5wdXRBY3Rpb24oKVxuICB9XG5cbiAgcHVibGljIGhpZGUoKTogdm9pZCB7XG4gICAgc3VwZXIuaGlkZSgpXG5cbiAgICB0aGlzLl9jbGVhclN5c3RlbUlucHV0QWN0aW9uKClcbiAgfVxuXG4gIHB1YmxpYyBncmF5T3V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdHJ1ZVxuICB9XG5cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlXG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKGtleT86IHN0cmluZyk6IFJlYWN0RWNzLkpTWC5FbGVtZW50IHtcbiAgICB0aGlzLl94UG9zaXRpb24gPSB0aGlzLnByb21wdFdpZHRoIC8gLTIgKyB0aGlzLl93aWR0aCAvIDIgKyB0aGlzLnhQb3NpdGlvblxuICAgIHRoaXMuX3lQb3NpdGlvbiA9IHRoaXMucHJvbXB0SGVpZ2h0IC8gMiArIHRoaXMuX2hlaWdodCAvIC0yICsgdGhpcy55UG9zaXRpb25cblxuICAgIHJldHVybiAoXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAga2V5PXtrZXl9XG4gICAgICAgIHVpVHJhbnNmb3JtPXtcbiAgICAgICAgICAoIXRoaXMucG9zaXRpb25BYnNvbHV0ZSlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi50aGlzLmltYWdlRWxlbWVudC51aVRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgZGlzcGxheTogdGhpcy52aXNpYmxlID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIC4uLnRoaXMuaW1hZ2VFbGVtZW50LnVpVHJhbnNmb3JtLFxuICAgICAgICAgICAgICBkaXNwbGF5OiB0aGlzLnZpc2libGUgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogdGhpcy5feVBvc2l0aW9uLCByaWdodDogdGhpcy5feFBvc2l0aW9uICogLTEgfSxcbiAgICAgICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnXG4gICAgICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwcm9tcHQgYnV0dG9uIG9uTW91c2VEb3duX19fX19fX19fX19fX19fX18nKVxuICAgICAgICAgIHRoaXMuX2NsaWNrKClcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPFVpRW50aXR5IHsuLi50aGlzLmltYWdlRWxlbWVudENvcm5lcn0vPlxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICB7Li4udGhpcy5pbWFnZUVsZW1lbnR9XG4gICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMudmlzaWJsZSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB7Li4udGhpcy5pY29uRWxlbWVudH1cbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIC4uLnRoaXMuaWNvbkVsZW1lbnQudWlUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMuX2Rpc2FibGVkIHx8ICghdGhpcy5faXNFU3R5bGUgJiYgIXRoaXMuX2lzRlN0eWxlKSA/ICdub25lJyA6ICdmbGV4JyxcbiAgICAgICAgICAgICAgbWFyZ2luOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAtMjYgLyAyLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiA1XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgICAgICAgICBtYXhXaWR0aDogMjU1LFxuICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlUZXh0PXt7XG4gICAgICAgICAgICAgIHZhbHVlOiBTdHJpbmcodGhpcy50ZXh0KSxcbiAgICAgICAgICAgICAgY29sb3I6IHRoaXMuX2Rpc2FibGVkID8gdGhpcy5fbGFiZWxEaXNhYmxlZENvbG9yIDogdGhpcy5sYWJlbEVsZW1lbnQuY29sb3IgfHwgdGhpcy5fbGFiZWxDb2xvcixcbiAgICAgICAgICAgICAgZm9udFNpemU6IDI0LFxuICAgICAgICAgICAgICBmb250OiBkZWZhdWx0Rm9udCxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnbWlkZGxlLWxlZnQnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVWlFbnRpdHk+XG4gICAgICAgIDxVaUVudGl0eSB7Li4udGhpcy5pbWFnZUVsZW1lbnRFZGdlfS8+XG4gICAgICA8L1VpRW50aXR5PlxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgX2NsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCB8fCAhdGhpcy52aXNpYmxlIHx8ICF0aGlzLmlzUHJvbXB0VmlzaWJsZSkgcmV0dXJuXG5cbiAgICBjb25zb2xlLmxvZygncHJvbXB0IGJ1dHRvbiBfY2xpY2tfX19fX19fX19fX19fX19fXycpXG5cbiAgICB0aGlzLm9uTW91c2VEb3duKClcbiAgfVxuXG4gIHByaXZhdGUgX2J1dHRvbkljb25Qb3ModGV4dExlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcG9zID0gLTIwIC0gdGV4dExlbiAqIDRcbiAgICByZXR1cm4gcG9zID4gLTY1ID8gcG9zIDogLTY1XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVTeXN0ZW1JbnB1dEFjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZSB8fCAoIXRoaXMuX2lzRVN0eWxlICYmICF0aGlzLl9pc0ZTdHlsZSkpIHJldHVyblxuXG4gICAgdGhpcy5fYnV0dG9uU3lzdGVtSW5wdXRBY3Rpb24gPSBuZXcgU3lzdGVtSW5wdXRBY3Rpb25zKHtcbiAgICAgIGlucHV0QWN0aW9uOiB0aGlzLl9pc0VTdHlsZSA/IElucHV0QWN0aW9uLklBX1BSSU1BUlkgOiBJbnB1dEFjdGlvbi5JQV9TRUNPTkRBUlksXG4gICAgICBjYWxsYmFjazogdGhpcy5fY2xpY2ssXG4gICAgfSlcblxuICAgIHRoaXMuX2J1dHRvblN5c3RlbUlucHV0QWN0aW9uLmFkZCgpXG4gIH1cblxuICBwcml2YXRlIF9jbGVhclN5c3RlbUlucHV0QWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2J1dHRvblN5c3RlbUlucHV0QWN0aW9uPy5yZW1vdmUoKVxuICB9XG59XG4iXX0=