UNPKG

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