@ai-table/grid 0.0.11 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- package/angular-konva/components/container.component.d.ts +7 -0
- package/angular-konva/components/container.component.d.ts.map +1 -0
- package/angular-konva/components/container.token.d.ts +3 -0
- package/angular-konva/components/container.token.d.ts.map +1 -0
- package/angular-konva/components/index.d.ts +4 -0
- package/angular-konva/components/index.d.ts.map +1 -0
- package/angular-konva/components/shape.component.d.ts +61 -0
- package/angular-konva/components/shape.component.d.ts.map +1 -0
- package/angular-konva/components/stage.component.d.ts +40 -0
- package/angular-konva/components/stage.component.d.ts.map +1 -0
- package/angular-konva/index.d.ts +5 -0
- package/angular-konva/index.d.ts.map +1 -0
- package/angular-konva/interfaces/component.d.ts +49 -0
- package/angular-konva/interfaces/component.d.ts.map +1 -0
- package/angular-konva/interfaces/config.d.ts +26 -0
- package/angular-konva/interfaces/config.d.ts.map +1 -0
- package/angular-konva/interfaces/event-object.d.ts +7 -0
- package/angular-konva/interfaces/event-object.d.ts.map +1 -0
- package/angular-konva/interfaces/index.d.ts +5 -0
- package/angular-konva/interfaces/index.d.ts.map +1 -0
- package/angular-konva/interfaces/shape.d.ts +42 -0
- package/angular-konva/interfaces/shape.d.ts.map +1 -0
- package/angular-konva/utils/apply-node-props.d.ts +4 -0
- package/angular-konva/utils/apply-node-props.d.ts.map +1 -0
- package/angular-konva/utils/common.d.ts +8 -0
- package/angular-konva/utils/common.d.ts.map +1 -0
- package/angular-konva/utils/index.d.ts +5 -0
- package/angular-konva/utils/index.d.ts.map +1 -0
- package/angular-konva/utils/types.d.ts +4 -0
- package/angular-konva/utils/types.d.ts.map +1 -0
- package/angular-konva/utils/update-picture.d.ts +4 -0
- package/angular-konva/utils/update-picture.d.ts.map +1 -0
- package/components/cell-editors/abstract-cell-editor.component.d.ts +7 -5
- package/components/cell-editors/abstract-cell-editor.component.d.ts.map +1 -1
- package/components/cell-editors/cell-editor.scss +38 -25
- package/components/cell-editors/cell-editor.variables.scss +5 -0
- package/components/cell-editors/date/date-editor.component.d.ts.map +1 -1
- package/components/cell-editors/link/edit-link/edit-link.component.d.ts +33 -0
- package/components/cell-editors/link/edit-link/edit-link.component.d.ts.map +1 -0
- package/components/cell-editors/link/link-editor.component.d.ts +36 -0
- package/components/cell-editors/link/link-editor.component.d.ts.map +1 -0
- package/components/cell-editors/link/link-editor.component.scss +21 -0
- package/components/cell-editors/progress/progress-editor.component.d.ts +0 -1
- package/components/cell-editors/progress/progress-editor.component.d.ts.map +1 -1
- package/components/cell-editors/progress/progress-editor.component.scss +12 -4
- package/components/cell-editors/rating/rating-editor.component.d.ts +0 -1
- package/components/cell-editors/rating/rating-editor.component.d.ts.map +1 -1
- package/components/cell-editors/rating/rating-editor.component.scss +10 -0
- package/components/cell-editors/select/select-editor.component.d.ts +1 -3
- package/components/cell-editors/select/select-editor.component.d.ts.map +1 -1
- package/components/cell-editors/text/text-editor.component.d.ts +0 -1
- package/components/cell-editors/text/text-editor.component.d.ts.map +1 -1
- package/components/cell-views/select/option.component.d.ts.map +1 -1
- package/components/cell-views/select/option.scss +10 -0
- package/components/field-menu/field-menu.component.d.ts +8 -3
- package/components/field-menu/field-menu.component.d.ts.map +1 -1
- package/components/field-property-editor/field-property-editor.component.d.ts +4 -2
- package/components/field-property-editor/field-property-editor.component.d.ts.map +1 -1
- package/components/index.d.ts +3 -1
- package/components/index.d.ts.map +1 -1
- package/constants/colors.d.ts +18 -0
- package/constants/colors.d.ts.map +1 -0
- package/constants/grid.d.ts +17 -1
- package/constants/grid.d.ts.map +1 -1
- package/constants/icon.d.ts +19 -0
- package/constants/icon.d.ts.map +1 -0
- package/constants/index.d.ts +5 -1
- package/constants/index.d.ts.map +1 -1
- package/constants/table.d.ts +60 -0
- package/constants/table.d.ts.map +1 -0
- package/constants/text.d.ts +22 -0
- package/constants/text.d.ts.map +1 -0
- package/core/context.d.ts +14 -0
- package/core/context.d.ts.map +1 -0
- package/core/coordinate.d.ts +96 -0
- package/core/coordinate.d.ts.map +1 -0
- package/core/index.d.ts +3 -2
- package/core/index.d.ts.map +1 -1
- package/core/types/ai-table.d.ts +56 -0
- package/core/types/ai-table.d.ts.map +1 -0
- package/core/types/core.d.ts +29 -23
- package/core/types/core.d.ts.map +1 -1
- package/core/types/index.d.ts +1 -1
- package/core/types/index.d.ts.map +1 -1
- package/core/utils/common.d.ts +1 -2
- package/core/utils/common.d.ts.map +1 -1
- package/core/utils/field.d.ts +1 -1
- package/core/utils/field.d.ts.map +1 -1
- package/core/utils/index.d.ts +0 -1
- package/core/utils/index.d.ts.map +1 -1
- package/core/utils/queries.d.ts +5 -5
- package/core/utils/queries.d.ts.map +1 -1
- package/dom-grid.component.d.ts +11 -0
- package/dom-grid.component.d.ts.map +1 -0
- package/esm2022/angular-konva/components/container.component.mjs +29 -0
- package/esm2022/angular-konva/components/container.token.mjs +3 -0
- package/esm2022/angular-konva/components/index.mjs +4 -0
- package/esm2022/angular-konva/components/shape.component.mjs +142 -0
- package/esm2022/angular-konva/components/stage.component.mjs +123 -0
- package/esm2022/angular-konva/index.mjs +5 -0
- package/esm2022/angular-konva/interfaces/component.mjs +4 -0
- package/esm2022/angular-konva/interfaces/config.mjs +2 -0
- package/esm2022/angular-konva/interfaces/event-object.mjs +2 -0
- package/esm2022/angular-konva/interfaces/index.mjs +5 -0
- package/esm2022/angular-konva/interfaces/shape.mjs +42 -0
- package/esm2022/angular-konva/utils/apply-node-props.mjs +67 -0
- package/esm2022/angular-konva/utils/common.mjs +48 -0
- package/esm2022/angular-konva/utils/index.mjs +5 -0
- package/esm2022/angular-konva/utils/types.mjs +2 -0
- package/esm2022/angular-konva/utils/update-picture.mjs +7 -0
- package/esm2022/components/cell-editors/abstract-cell-editor.component.mjs +12 -7
- package/esm2022/components/cell-editors/date/date-editor.component.mjs +6 -3
- package/esm2022/components/cell-editors/link/edit-link/edit-link.component.mjs +66 -0
- package/esm2022/components/cell-editors/link/link-editor.component.mjs +117 -0
- package/esm2022/components/cell-editors/number/number-editor.component.mjs +2 -2
- package/esm2022/components/cell-editors/progress/progress-editor.component.mjs +3 -6
- package/esm2022/components/cell-editors/rating/rating-editor.component.mjs +4 -7
- package/esm2022/components/cell-editors/select/select-editor.component.mjs +11 -16
- package/esm2022/components/cell-editors/text/text-editor.component.mjs +10 -11
- package/esm2022/components/cell-views/select/option.component.mjs +6 -5
- package/esm2022/components/field-menu/field-menu.component.mjs +11 -8
- package/esm2022/components/field-property-editor/field-property-editor.component.mjs +17 -12
- package/esm2022/components/index.mjs +4 -2
- package/esm2022/constants/colors.mjs +18 -0
- package/esm2022/constants/editor.mjs +2 -3
- package/esm2022/constants/grid.mjs +22 -4
- package/esm2022/constants/icon.mjs +26 -0
- package/esm2022/constants/index.mjs +6 -2
- package/esm2022/constants/table.mjs +62 -0
- package/esm2022/constants/text.mjs +23 -0
- package/esm2022/core/context.mjs +25 -0
- package/esm2022/core/coordinate.mjs +222 -0
- package/esm2022/core/index.mjs +4 -3
- package/esm2022/core/types/ai-table.mjs +44 -0
- package/esm2022/core/types/core.mjs +6 -1
- package/esm2022/core/types/index.mjs +2 -2
- package/esm2022/core/utils/common.mjs +3 -20
- package/esm2022/core/utils/field.mjs +9 -5
- package/esm2022/core/utils/index.mjs +1 -2
- package/esm2022/core/utils/queries.mjs +4 -4
- package/esm2022/dom-grid.component.mjs +82 -0
- package/esm2022/grid-base.component.mjs +154 -0
- package/esm2022/grid.component.mjs +336 -160
- package/esm2022/public-api.mjs +9 -5
- package/esm2022/renderer/components/add-field-column.component.mjs +68 -0
- package/esm2022/renderer/components/cells.component.mjs +35 -0
- package/esm2022/renderer/components/field-head.component.mjs +130 -0
- package/esm2022/renderer/components/field-icon.component.mjs +66 -0
- package/esm2022/renderer/components/frozen-cells.component.mjs +36 -0
- package/esm2022/renderer/components/frozen-heads.component.mjs +117 -0
- package/esm2022/renderer/components/frozen-placeholder-cells.component.mjs +38 -0
- package/esm2022/renderer/components/heads.component.mjs +38 -0
- package/esm2022/renderer/components/hover-row-heads.component.mjs +107 -0
- package/esm2022/renderer/components/icon.component.mjs +80 -0
- package/esm2022/renderer/components/index.mjs +14 -0
- package/esm2022/renderer/components/other-rows.component.mjs +68 -0
- package/esm2022/renderer/components/placeholder-cells.component.mjs +33 -0
- package/esm2022/renderer/components/text.component.mjs +45 -0
- package/esm2022/renderer/creations/create-active-cell-border.mjs +68 -0
- package/esm2022/renderer/creations/create-cells.mjs +135 -0
- package/esm2022/renderer/creations/create-heads.mjs +45 -0
- package/esm2022/renderer/drawers/add-row-layout-drawer.mjs +97 -0
- package/esm2022/renderer/drawers/cell-drawer.mjs +586 -0
- package/esm2022/renderer/drawers/drawer.mjs +936 -0
- package/esm2022/renderer/drawers/layout-drawer.mjs +58 -0
- package/esm2022/renderer/drawers/record-row-layout-drawer.mjs +101 -0
- package/esm2022/renderer/index.mjs +4 -0
- package/esm2022/renderer/renderer.component.mjs +174 -0
- package/esm2022/services/event.service.mjs +115 -11
- package/esm2022/services/field.service.mjs +28 -5
- package/esm2022/services/index.mjs +4 -0
- package/esm2022/services/selection.service.mjs +8 -1
- package/esm2022/types/avatar.mjs +27 -0
- package/esm2022/types/canvas.mjs +2 -0
- package/esm2022/types/cell.mjs +2 -0
- package/esm2022/types/component-config.mjs +7 -0
- package/esm2022/types/field.mjs +1 -1
- package/esm2022/types/grid.mjs +16 -2
- package/esm2022/types/index.mjs +8 -2
- package/esm2022/types/layout.mjs +2 -0
- package/esm2022/types/row.mjs +6 -0
- package/esm2022/utils/build.mjs +39 -0
- package/esm2022/utils/cell.mjs +71 -0
- package/esm2022/utils/common.mjs +49 -0
- package/esm2022/utils/get-placeholder-cells.mjs +66 -0
- package/esm2022/utils/get-text-width.mjs +30 -0
- package/esm2022/utils/image-cache.mjs +57 -0
- package/esm2022/utils/index.mjs +12 -0
- package/esm2022/utils/os.mjs +16 -0
- package/esm2022/utils/position.mjs +48 -0
- package/esm2022/utils/style.mjs +25 -0
- package/esm2022/utils/text-measure.mjs +122 -0
- package/esm2022/utils/visible-range.mjs +38 -0
- package/fesm2022/ai-table-grid.mjs +5526 -693
- package/fesm2022/ai-table-grid.mjs.map +1 -1
- package/grid-base.component.d.ts +52 -0
- package/grid-base.component.d.ts.map +1 -0
- package/grid.component.d.ts +43 -40
- package/grid.component.d.ts.map +1 -1
- package/package.json +5 -2
- package/public-api.d.ts +8 -4
- package/public-api.d.ts.map +1 -1
- package/renderer/components/add-field-column.component.d.ts +16 -0
- package/renderer/components/add-field-column.component.d.ts.map +1 -0
- package/renderer/components/cells.component.d.ts +14 -0
- package/renderer/components/cells.component.d.ts.map +1 -0
- package/renderer/components/field-head.component.d.ts +73 -0
- package/renderer/components/field-head.component.d.ts.map +1 -0
- package/renderer/components/field-icon.component.d.ts +17 -0
- package/renderer/components/field-icon.component.d.ts.map +1 -0
- package/renderer/components/frozen-cells.component.d.ts +14 -0
- package/renderer/components/frozen-cells.component.d.ts.map +1 -0
- package/renderer/components/frozen-heads.component.d.ts +47 -0
- package/renderer/components/frozen-heads.component.d.ts.map +1 -0
- package/renderer/components/frozen-placeholder-cells.component.d.ts +22 -0
- package/renderer/components/frozen-placeholder-cells.component.d.ts.map +1 -0
- package/renderer/components/heads.component.d.ts +9 -0
- package/renderer/components/heads.component.d.ts.map +1 -0
- package/renderer/components/hover-row-heads.component.d.ts +11 -0
- package/renderer/components/hover-row-heads.component.d.ts.map +1 -0
- package/renderer/components/icon.component.d.ts +37 -0
- package/renderer/components/icon.component.d.ts.map +1 -0
- package/renderer/components/index.d.ts +14 -0
- package/renderer/components/index.d.ts.map +1 -0
- package/renderer/components/other-rows.component.d.ts +31 -0
- package/renderer/components/other-rows.component.d.ts.map +1 -0
- package/renderer/components/placeholder-cells.component.d.ts +22 -0
- package/renderer/components/placeholder-cells.component.d.ts.map +1 -0
- package/renderer/components/text.component.d.ts +99 -0
- package/renderer/components/text.component.d.ts.map +1 -0
- package/renderer/creations/create-active-cell-border.d.ts +7 -0
- package/renderer/creations/create-active-cell-border.d.ts.map +1 -0
- package/renderer/creations/create-cells.d.ts +8 -0
- package/renderer/creations/create-cells.d.ts.map +1 -0
- package/renderer/creations/create-heads.d.ts +3 -0
- package/renderer/creations/create-heads.d.ts.map +1 -0
- package/renderer/drawers/add-row-layout-drawer.d.ts +12 -0
- package/renderer/drawers/add-row-layout-drawer.d.ts.map +1 -0
- package/renderer/drawers/cell-drawer.d.ts +22 -0
- package/renderer/drawers/cell-drawer.d.ts.map +1 -0
- package/renderer/drawers/drawer.d.ts +136 -0
- package/renderer/drawers/drawer.d.ts.map +1 -0
- package/renderer/drawers/layout-drawer.d.ts +22 -0
- package/renderer/drawers/layout-drawer.d.ts.map +1 -0
- package/renderer/drawers/record-row-layout-drawer.d.ts +14 -0
- package/renderer/drawers/record-row-layout-drawer.d.ts.map +1 -0
- package/renderer/index.d.ts +4 -0
- package/renderer/index.d.ts.map +1 -0
- package/renderer/renderer.component.d.ts +64 -0
- package/renderer/renderer.component.d.ts.map +1 -0
- package/services/event.service.d.ts +17 -3
- package/services/event.service.d.ts.map +1 -1
- package/services/field.service.d.ts +5 -4
- package/services/field.service.d.ts.map +1 -1
- package/services/index.d.ts +4 -0
- package/services/index.d.ts.map +1 -0
- package/services/selection.service.d.ts.map +1 -1
- package/styles/styles.scss +71 -11
- package/types/avatar.d.ts +24 -0
- package/types/avatar.d.ts.map +1 -0
- package/types/canvas.d.ts +83 -0
- package/types/canvas.d.ts.map +1 -0
- package/types/cell.d.ts +43 -0
- package/types/cell.d.ts.map +1 -0
- package/types/component-config.d.ts +50 -0
- package/types/component-config.d.ts.map +1 -0
- package/types/field.d.ts +27 -1
- package/types/field.d.ts.map +1 -1
- package/types/grid.d.ts +80 -2
- package/types/grid.d.ts.map +1 -1
- package/types/index.d.ts +7 -1
- package/types/index.d.ts.map +1 -1
- package/types/layout.d.ts +11 -0
- package/types/layout.d.ts.map +1 -0
- package/types/row.d.ts +27 -0
- package/types/row.d.ts.map +1 -0
- package/utils/build.d.ts +5 -0
- package/utils/build.d.ts.map +1 -0
- package/utils/cell.d.ts +19 -0
- package/utils/cell.d.ts.map +1 -0
- package/utils/common.d.ts +20 -0
- package/utils/common.d.ts.map +1 -0
- package/utils/get-placeholder-cells.d.ts +16 -0
- package/utils/get-placeholder-cells.d.ts.map +1 -0
- package/utils/get-text-width.d.ts +9 -0
- package/utils/get-text-width.d.ts.map +1 -0
- package/utils/image-cache.d.ts +16 -0
- package/utils/image-cache.d.ts.map +1 -0
- package/utils/index.d.ts +12 -0
- package/utils/index.d.ts.map +1 -0
- package/utils/os.d.ts +4 -0
- package/utils/os.d.ts.map +1 -0
- package/utils/position.d.ts +20 -0
- package/utils/position.d.ts.map +1 -0
- package/utils/style.d.ts +4 -0
- package/utils/style.d.ts.map +1 -0
- package/utils/text-measure.d.ts +32 -0
- package/utils/text-measure.d.ts.map +1 -0
- package/utils/visible-range.d.ts +13 -0
- package/utils/visible-range.d.ts.map +1 -0
- package/components/cell-editors/link/number-editor.component.d.ts +0 -8
- package/components/cell-editors/link/number-editor.component.d.ts.map +0 -1
- package/constants/field.d.ts +0 -20
- package/constants/field.d.ts.map +0 -1
- package/core/action/field.d.ts +0 -12
- package/core/action/field.d.ts.map +0 -1
- package/core/action/general.d.ts +0 -5
- package/core/action/general.d.ts.map +0 -1
- package/core/action/index.d.ts +0 -12
- package/core/action/index.d.ts.map +0 -1
- package/core/action/record.d.ts +0 -12
- package/core/action/record.d.ts.map +0 -1
- package/core/types/action.d.ts +0 -64
- package/core/types/action.d.ts.map +0 -1
- package/core/utils/weak-map.d.ts +0 -3
- package/core/utils/weak-map.d.ts.map +0 -1
- package/esm2022/components/cell-editors/link/number-editor.component.mjs +0 -25
- package/esm2022/constants/field.mjs +0 -25
- package/esm2022/core/action/field.mjs +0 -57
- package/esm2022/core/action/general.mjs +0 -116
- package/esm2022/core/action/index.mjs +0 -9
- package/esm2022/core/action/record.mjs +0 -44
- package/esm2022/core/types/action.mjs +0 -18
- package/esm2022/core/utils/weak-map.mjs +0 -2
@@ -0,0 +1,586 @@
|
|
1
|
+
import _ from 'lodash';
|
2
|
+
import { AI_TABLE_CELL_ADD_ITEM_BUTTON_SIZE, AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE, AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE_OFFSET, AI_TABLE_CELL_EMOJI_PADDING, AI_TABLE_CELL_EMOJI_SIZE, AI_TABLE_CELL_MAX_ROW_COUNT, AI_TABLE_CELL_MEMBER_ITEM_HEIGHT, AI_TABLE_CELL_MEMBER_ITEM_PADDING, AI_TABLE_CELL_MULTI_DOT_RADIUS, AI_TABLE_CELL_MULTI_ITEM_MARGIN_TOP, AI_TABLE_CELL_MULTI_ITEM_MIN_WIDTH, AI_TABLE_CELL_MULTI_PADDING_LEFT, AI_TABLE_CELL_MULTI_PADDING_TOP, AI_TABLE_CELL_PADDING, AI_TABLE_COMMON_FONT_SIZE, AI_TABLE_DOT_RADIUS, AI_TABLE_MEMBER_AVATAR_SIZE, AI_TABLE_MEMBER_ITEM_AVATAR_MARGIN_RIGHT, AI_TABLE_MEMBER_ITEM_PADDING_RIGHT, AI_TABLE_MIN_TEXT_WIDTH, AI_TABLE_OFFSET, AI_TABLE_OPTION_ITEM_FONT_SIZE, AI_TABLE_OPTION_ITEM_HEIGHT, AI_TABLE_OPTION_ITEM_PADDING, AI_TABLE_OPTION_ITEM_RADIUS, AI_TABLE_PIECE_RADIUS, AI_TABLE_PIECE_WIDTH, AI_TABLE_PROGRESS_BAR_HEIGHT, AI_TABLE_PROGRESS_BAR_RADIUS, AI_TABLE_PROGRESS_TEXT_Width, AI_TABLE_ROW_BLANK_HEIGHT, AI_TABLE_TAG_FONT_SIZE, AI_TABLE_TAG_PADDING, AI_TABLE_TEXT_GAP, Colors, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_FONT_WEIGHT, DEFAULT_TEXT_ALIGN_LEFT, DEFAULT_TEXT_ALIGN_RIGHT, DEFAULT_TEXT_DECORATION, DEFAULT_TEXT_LINE_HEIGHT, DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE, FONT_SIZE_SM, StarFill } from '../../constants';
|
3
|
+
import { AITable, AITableFieldType, AITableSelectOptionStyle } from '../../core';
|
4
|
+
import { AITableAvatarSize, AITableAvatarType, AITableMemberType } from '../../types';
|
5
|
+
import { getAvatarBgColor, getAvatarShortName, getTextWidth } from '../../utils';
|
6
|
+
import { Drawer } from './drawer';
|
7
|
+
/**
|
8
|
+
* 处理和渲染表格单元格的内容
|
9
|
+
*/
|
10
|
+
export class CellDrawer extends Drawer {
|
11
|
+
// 样式初始化
|
12
|
+
initStyle(field, styleProps) {
|
13
|
+
const { type: fieldType } = field;
|
14
|
+
const { fontWeight = DEFAULT_FONT_WEIGHT } = styleProps;
|
15
|
+
switch (fieldType) {
|
16
|
+
case AITableFieldType.text:
|
17
|
+
case AITableFieldType.date:
|
18
|
+
case AITableFieldType.createdAt:
|
19
|
+
case AITableFieldType.updatedAt:
|
20
|
+
case AITableFieldType.rate:
|
21
|
+
case AITableFieldType.progress:
|
22
|
+
case AITableFieldType.member:
|
23
|
+
case AITableFieldType.createdBy:
|
24
|
+
case AITableFieldType.updatedBy:
|
25
|
+
return this.setStyle({ fontSize: DEFAULT_FONT_SIZE, fontWeight });
|
26
|
+
default:
|
27
|
+
return null;
|
28
|
+
}
|
29
|
+
}
|
30
|
+
// 单元格渲染
|
31
|
+
renderCell(render, ctx) {
|
32
|
+
const { field } = render;
|
33
|
+
const fieldType = field.type;
|
34
|
+
switch (fieldType) {
|
35
|
+
case AITableFieldType.text:
|
36
|
+
case AITableFieldType.number:
|
37
|
+
case AITableFieldType.link:
|
38
|
+
return this.renderCellText(render, ctx);
|
39
|
+
case AITableFieldType.select:
|
40
|
+
return this.renderCellSelect(render, ctx);
|
41
|
+
case AITableFieldType.date:
|
42
|
+
case AITableFieldType.createdAt:
|
43
|
+
case AITableFieldType.updatedAt:
|
44
|
+
return this.renderCellDate(render, ctx);
|
45
|
+
case AITableFieldType.rate:
|
46
|
+
return this.renderCellRate(render, ctx);
|
47
|
+
case AITableFieldType.progress:
|
48
|
+
return this.renderCellProgress(render, ctx);
|
49
|
+
case AITableFieldType.member:
|
50
|
+
case AITableFieldType.createdBy:
|
51
|
+
case AITableFieldType.updatedBy:
|
52
|
+
return this.renderCellMember(render, ctx);
|
53
|
+
default:
|
54
|
+
return null;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
renderCellText(render, ctx) {
|
58
|
+
const { x, y, transformValue, field, columnWidth, style } = render;
|
59
|
+
const fieldType = field.type;
|
60
|
+
let renderText = fieldType === AITableFieldType.link ? transformValue.text : transformValue;
|
61
|
+
if (renderText == null) {
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
const isSingleLine = !columnWidth;
|
65
|
+
const isTextField = fieldType === AITableFieldType.text;
|
66
|
+
const isNumberField = fieldType === AITableFieldType.number;
|
67
|
+
if (isTextField && isSingleLine) {
|
68
|
+
renderText = renderText.replace(/\r|\n/g, ' ');
|
69
|
+
}
|
70
|
+
const color = style?.color || this.colors.gray800;
|
71
|
+
const textAlign = style?.textAlign || DEFAULT_TEXT_ALIGN_LEFT;
|
72
|
+
const fontWeight = style?.fontWeight;
|
73
|
+
const textMaxWidth = columnWidth - 2 * AI_TABLE_CELL_PADDING;
|
74
|
+
const renderX = textAlign === DEFAULT_TEXT_ALIGN_RIGHT ? x + columnWidth - AI_TABLE_CELL_PADDING : x + AI_TABLE_CELL_PADDING;
|
75
|
+
const renderY = y + AI_TABLE_ROW_BLANK_HEIGHT / 2;
|
76
|
+
const textDecoration = DEFAULT_TEXT_DECORATION;
|
77
|
+
if (isNumberField) {
|
78
|
+
renderText = String(renderText);
|
79
|
+
const { text } = this.textEllipsis({
|
80
|
+
text: renderText,
|
81
|
+
maxWidth: columnWidth && textMaxWidth,
|
82
|
+
fontWeight
|
83
|
+
});
|
84
|
+
if (ctx) {
|
85
|
+
let pureText = text;
|
86
|
+
this.text({
|
87
|
+
x: renderX,
|
88
|
+
y: renderY,
|
89
|
+
text: pureText,
|
90
|
+
textAlign,
|
91
|
+
fillStyle: color,
|
92
|
+
fontWeight,
|
93
|
+
textDecoration,
|
94
|
+
verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE
|
95
|
+
});
|
96
|
+
}
|
97
|
+
}
|
98
|
+
else {
|
99
|
+
this.wrapText({
|
100
|
+
x: renderX,
|
101
|
+
y: renderY,
|
102
|
+
text: renderText,
|
103
|
+
maxWidth: textMaxWidth,
|
104
|
+
maxRow: AI_TABLE_CELL_MAX_ROW_COUNT,
|
105
|
+
lineHeight: DEFAULT_TEXT_LINE_HEIGHT,
|
106
|
+
textAlign,
|
107
|
+
verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE,
|
108
|
+
fillStyle: fieldType === AITableFieldType.link ? Colors.primary : color,
|
109
|
+
fontWeight,
|
110
|
+
textDecoration,
|
111
|
+
fieldType,
|
112
|
+
needDraw: true
|
113
|
+
});
|
114
|
+
}
|
115
|
+
}
|
116
|
+
renderCellSelect(render, ctx) {
|
117
|
+
const { field } = render;
|
118
|
+
if (field.settings?.is_multiple) {
|
119
|
+
this.renderCellMultiSelect(render, ctx);
|
120
|
+
}
|
121
|
+
else {
|
122
|
+
this.renderSingleSelectCell(render, ctx);
|
123
|
+
}
|
124
|
+
}
|
125
|
+
renderCellMultiSelect(render, ctx) {
|
126
|
+
const { x, y, field, transformValue, columnWidth } = render;
|
127
|
+
if (!transformValue?.length || !Array.isArray(transformValue))
|
128
|
+
return;
|
129
|
+
let currentX = x + AI_TABLE_CELL_PADDING;
|
130
|
+
const maxContainerWidth = columnWidth - 2 * AI_TABLE_CELL_PADDING;
|
131
|
+
const optionStyle = field.settings.option_style;
|
132
|
+
const fontStyle = `${DEFAULT_FONT_WEIGHT} ${AI_TABLE_OPTION_ITEM_FONT_SIZE}px ${DEFAULT_FONT_FAMILY}`;
|
133
|
+
const isDotOrPiece = optionStyle === AITableSelectOptionStyle.dot || optionStyle === AITableSelectOptionStyle.piece;
|
134
|
+
let totalWidth = 0;
|
135
|
+
const cellItemInfoMap = new Map();
|
136
|
+
let drawableIndex = 0;
|
137
|
+
transformValue.forEach((optionId, index) => {
|
138
|
+
const item = field.settings.options?.find((option) => option._id === optionId);
|
139
|
+
const textWidth = getTextWidth(ctx, item?.text, fontStyle);
|
140
|
+
totalWidth += textWidth + 2 * AI_TABLE_CELL_PADDING;
|
141
|
+
if (index < transformValue.length - 1) {
|
142
|
+
totalWidth += AI_TABLE_CELL_MULTI_PADDING_LEFT;
|
143
|
+
}
|
144
|
+
if (isDotOrPiece) {
|
145
|
+
totalWidth += AI_TABLE_CELL_MULTI_DOT_RADIUS * 2 + AI_TABLE_CELL_MULTI_PADDING_LEFT;
|
146
|
+
}
|
147
|
+
if (totalWidth < maxContainerWidth || totalWidth === maxContainerWidth) {
|
148
|
+
drawableIndex = index;
|
149
|
+
}
|
150
|
+
cellItemInfoMap.set(optionId, { textWidth, item, offset: totalWidth });
|
151
|
+
});
|
152
|
+
const baseWidth = AI_TABLE_MIN_TEXT_WIDTH + AI_TABLE_CELL_PADDING * 2;
|
153
|
+
const minWidth = isDotOrPiece ? baseWidth + AI_TABLE_CELL_MULTI_DOT_RADIUS * 2 + AI_TABLE_CELL_MULTI_PADDING_LEFT : baseWidth;
|
154
|
+
if (transformValue[drawableIndex + 1]) {
|
155
|
+
const { offset: currentOffset } = cellItemInfoMap.get(transformValue[drawableIndex]);
|
156
|
+
const canDrawerNext = maxContainerWidth - currentOffset > minWidth;
|
157
|
+
drawableIndex = canDrawerNext ? drawableIndex + 1 : drawableIndex;
|
158
|
+
// 上面过程是 没有 +数字 的情况下最大能放几个;
|
159
|
+
const number = transformValue.length - (drawableIndex + 1);
|
160
|
+
if (number > 0) {
|
161
|
+
// 说明有 +数字,重新计算
|
162
|
+
const circleWidth = getTextWidth(ctx, `+{number}`, fontStyle) + 2 * AI_TABLE_CELL_PADDING;
|
163
|
+
const max = maxContainerWidth - AI_TABLE_CELL_MULTI_PADDING_LEFT - circleWidth;
|
164
|
+
// 如果当前已经超出了,看是否能容下当前的,不能就减去 1;
|
165
|
+
const currentItemHasOver = currentOffset > max;
|
166
|
+
if (currentItemHasOver) {
|
167
|
+
const lastOffset = drawableIndex === 0 ? 0 : cellItemInfoMap.get(transformValue[drawableIndex - 1]);
|
168
|
+
drawableIndex = max - lastOffset > minWidth ? drawableIndex : drawableIndex - 1;
|
169
|
+
}
|
170
|
+
else {
|
171
|
+
// 还有剩余空间, 看是否能多渲染一个
|
172
|
+
drawableIndex = max - currentOffset > minWidth ? drawableIndex + 1 : drawableIndex;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
}
|
176
|
+
const circleText = `+${transformValue.length - (drawableIndex + 1)}`;
|
177
|
+
const circleWidth = transformValue.length - (drawableIndex + 1) > 0 ? getTextWidth(ctx, circleText, fontStyle) + 2 * AI_TABLE_CELL_PADDING : 0;
|
178
|
+
// 剩余空间
|
179
|
+
let remainSpace = maxContainerWidth - circleWidth - (circleWidth > 0 ? AI_TABLE_CELL_MULTI_PADDING_LEFT : 0);
|
180
|
+
for (let index = 0; index < transformValue.length; index++) {
|
181
|
+
const optionId = transformValue[index];
|
182
|
+
const bgConfig = {
|
183
|
+
x: currentX,
|
184
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_HEIGHT) / 2,
|
185
|
+
height: AI_TABLE_OPTION_ITEM_HEIGHT,
|
186
|
+
radius: AI_TABLE_PIECE_RADIUS,
|
187
|
+
fill: Colors.gray100,
|
188
|
+
width: 0
|
189
|
+
};
|
190
|
+
const commonItem = (optionStyle, shape) => {
|
191
|
+
const baseWidth = isDotOrPiece
|
192
|
+
? AI_TABLE_CELL_MULTI_DOT_RADIUS * 2 + AI_TABLE_CELL_MULTI_PADDING_LEFT + AI_TABLE_CELL_PADDING * 2
|
193
|
+
: AI_TABLE_CELL_PADDING * 2;
|
194
|
+
if (remainSpace < minWidth) {
|
195
|
+
return;
|
196
|
+
}
|
197
|
+
const { textWidth, item } = cellItemInfoMap.get(optionId);
|
198
|
+
const completeWidth = baseWidth + textWidth;
|
199
|
+
if (index !== transformValue.length - 1) {
|
200
|
+
remainSpace -= AI_TABLE_CELL_MULTI_PADDING_LEFT;
|
201
|
+
}
|
202
|
+
const bgWidth = remainSpace > completeWidth ? completeWidth : remainSpace;
|
203
|
+
bgConfig.width = bgWidth;
|
204
|
+
if (isDotOrPiece) {
|
205
|
+
this.rect(bgConfig);
|
206
|
+
if (shape === 'rect') {
|
207
|
+
this.rect({
|
208
|
+
x: bgConfig.x + AI_TABLE_CELL_PADDING,
|
209
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_CELL_MULTI_DOT_RADIUS * 2) / 2,
|
210
|
+
width: AI_TABLE_CELL_MULTI_DOT_RADIUS * 2,
|
211
|
+
height: AI_TABLE_CELL_MULTI_DOT_RADIUS * 2,
|
212
|
+
radius: AI_TABLE_PIECE_RADIUS,
|
213
|
+
fill: item?.bg_color ?? item?.color ?? Colors.primary
|
214
|
+
});
|
215
|
+
}
|
216
|
+
else if (shape === 'arc') {
|
217
|
+
this.arc({
|
218
|
+
x: bgConfig.x + AI_TABLE_CELL_PADDING,
|
219
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_CELL_MULTI_DOT_RADIUS * 2) / 2 + AI_TABLE_CELL_MULTI_DOT_RADIUS,
|
220
|
+
radius: AI_TABLE_CELL_MULTI_DOT_RADIUS,
|
221
|
+
fill: item?.bg_color ?? item?.color ?? Colors.primary
|
222
|
+
});
|
223
|
+
}
|
224
|
+
this.text({
|
225
|
+
x: bgConfig.x + AI_TABLE_CELL_PADDING + AI_TABLE_CELL_MULTI_DOT_RADIUS * 2 + AI_TABLE_CELL_MULTI_PADDING_LEFT,
|
226
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_FONT_SIZE) / 2,
|
227
|
+
text: this.textEllipsis({
|
228
|
+
text: item.text,
|
229
|
+
maxWidth: bgWidth - baseWidth,
|
230
|
+
fontSize: AI_TABLE_OPTION_ITEM_FONT_SIZE
|
231
|
+
}).text,
|
232
|
+
fillStyle: Colors.gray700,
|
233
|
+
fontSize: AI_TABLE_OPTION_ITEM_FONT_SIZE
|
234
|
+
});
|
235
|
+
}
|
236
|
+
else if (optionStyle === AITableSelectOptionStyle.tag) {
|
237
|
+
this.tag({
|
238
|
+
x: bgConfig.x,
|
239
|
+
y: bgConfig.y,
|
240
|
+
width: bgConfig.width,
|
241
|
+
text: this.textEllipsis({
|
242
|
+
text: item.text,
|
243
|
+
maxWidth: bgWidth - baseWidth,
|
244
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE
|
245
|
+
}).text,
|
246
|
+
radius: AI_TABLE_OPTION_ITEM_RADIUS,
|
247
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE,
|
248
|
+
height: bgConfig.height,
|
249
|
+
color: Colors.white,
|
250
|
+
padding: AI_TABLE_CELL_PADDING,
|
251
|
+
background: item?.bg_color ?? item?.color ?? Colors.primary
|
252
|
+
});
|
253
|
+
}
|
254
|
+
else {
|
255
|
+
this.rect(bgConfig);
|
256
|
+
this.text({
|
257
|
+
x: bgConfig.x + AI_TABLE_CELL_PADDING,
|
258
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_TAG_FONT_SIZE) / 2,
|
259
|
+
text: this.textEllipsis({
|
260
|
+
text: item.text,
|
261
|
+
maxWidth: bgWidth - baseWidth,
|
262
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE
|
263
|
+
}).text,
|
264
|
+
fillStyle: Colors.gray700,
|
265
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE
|
266
|
+
});
|
267
|
+
}
|
268
|
+
const currentWidth = bgConfig.width;
|
269
|
+
remainSpace -= currentWidth;
|
270
|
+
currentX += currentWidth + AI_TABLE_CELL_MULTI_PADDING_LEFT;
|
271
|
+
};
|
272
|
+
switch (optionStyle) {
|
273
|
+
case AITableSelectOptionStyle.dot:
|
274
|
+
commonItem(AITableSelectOptionStyle.dot, 'arc');
|
275
|
+
break;
|
276
|
+
case AITableSelectOptionStyle.piece:
|
277
|
+
commonItem(AITableSelectOptionStyle.piece, 'rect');
|
278
|
+
break;
|
279
|
+
case AITableSelectOptionStyle.tag:
|
280
|
+
commonItem(AITableSelectOptionStyle.tag, '');
|
281
|
+
break;
|
282
|
+
default:
|
283
|
+
commonItem(AITableSelectOptionStyle.text, '');
|
284
|
+
break;
|
285
|
+
}
|
286
|
+
}
|
287
|
+
if (circleWidth > 0) {
|
288
|
+
if (optionStyle === AITableSelectOptionStyle.tag) {
|
289
|
+
this.tag({
|
290
|
+
x: currentX,
|
291
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_HEIGHT) / 2,
|
292
|
+
width: circleWidth,
|
293
|
+
height: AI_TABLE_OPTION_ITEM_HEIGHT,
|
294
|
+
text: circleText,
|
295
|
+
background: Colors.gray100,
|
296
|
+
color: Colors.gray700,
|
297
|
+
radius: AI_TABLE_OPTION_ITEM_RADIUS,
|
298
|
+
padding: AI_TABLE_CELL_PADDING,
|
299
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE
|
300
|
+
});
|
301
|
+
}
|
302
|
+
else {
|
303
|
+
this.rect({
|
304
|
+
x: currentX,
|
305
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_HEIGHT) / 2,
|
306
|
+
width: circleWidth,
|
307
|
+
height: AI_TABLE_OPTION_ITEM_HEIGHT,
|
308
|
+
fill: Colors.gray100,
|
309
|
+
radius: AI_TABLE_PIECE_RADIUS
|
310
|
+
});
|
311
|
+
this.text({
|
312
|
+
x: currentX + AI_TABLE_CELL_PADDING,
|
313
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_TAG_FONT_SIZE) / 2,
|
314
|
+
text: circleText,
|
315
|
+
fillStyle: Colors.gray700,
|
316
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE
|
317
|
+
});
|
318
|
+
}
|
319
|
+
}
|
320
|
+
}
|
321
|
+
renderSingleSelectCell(render, ctx) {
|
322
|
+
const { x, y, transformValue, field, columnWidth, isActive } = render;
|
323
|
+
if (transformValue == null || transformValue === '') {
|
324
|
+
return;
|
325
|
+
}
|
326
|
+
const isOperating = isActive;
|
327
|
+
const item = field.settings.options?.find((option) => option._id === transformValue[0]);
|
328
|
+
const itemName = item?.text || '';
|
329
|
+
const getTextEllipsis = (maxTextWidth, fontSize = AI_TABLE_COMMON_FONT_SIZE) => {
|
330
|
+
maxTextWidth -= isOperating ? AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE - AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE_OFFSET : 0;
|
331
|
+
return this.textEllipsis({
|
332
|
+
text: itemName,
|
333
|
+
maxWidth: columnWidth && maxTextWidth,
|
334
|
+
fontSize: fontSize
|
335
|
+
});
|
336
|
+
};
|
337
|
+
if (ctx) {
|
338
|
+
ctx.save();
|
339
|
+
ctx.globalAlpha = 1;
|
340
|
+
const colors = AITable.getColors();
|
341
|
+
const optionStyle = field.settings.option_style;
|
342
|
+
let background = item?.bg_color ?? item?.color ?? colors.primary;
|
343
|
+
const dotMaxTextWidth = columnWidth - 2 * AI_TABLE_CELL_PADDING - AI_TABLE_PIECE_WIDTH - AI_TABLE_TEXT_GAP;
|
344
|
+
const borderWidth = 1;
|
345
|
+
switch (optionStyle) {
|
346
|
+
case AITableSelectOptionStyle.dot:
|
347
|
+
// 这里的 AI_TABLE_OFFSET 偏移不确定是为啥(包括 piece 的),只是为了保持和编辑组件中的对齐
|
348
|
+
this.arc({
|
349
|
+
x: x + AI_TABLE_CELL_PADDING + AI_TABLE_DOT_RADIUS,
|
350
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_PIECE_WIDTH) / 2 + AI_TABLE_DOT_RADIUS - AI_TABLE_OFFSET,
|
351
|
+
radius: AI_TABLE_DOT_RADIUS,
|
352
|
+
fill: background
|
353
|
+
});
|
354
|
+
this.text({
|
355
|
+
x: x + AI_TABLE_PIECE_WIDTH + AI_TABLE_TEXT_GAP + AI_TABLE_CELL_PADDING,
|
356
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_FONT_SIZE) / 2,
|
357
|
+
text: getTextEllipsis(dotMaxTextWidth).text,
|
358
|
+
fillStyle: colors.gray800
|
359
|
+
});
|
360
|
+
break;
|
361
|
+
case AITableSelectOptionStyle.piece:
|
362
|
+
this.rect({
|
363
|
+
x: x + AI_TABLE_CELL_PADDING,
|
364
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_PIECE_WIDTH) / 2 - AI_TABLE_OFFSET,
|
365
|
+
width: AI_TABLE_PIECE_WIDTH,
|
366
|
+
height: AI_TABLE_PIECE_WIDTH,
|
367
|
+
radius: AI_TABLE_PIECE_RADIUS,
|
368
|
+
fill: background
|
369
|
+
});
|
370
|
+
this.text({
|
371
|
+
x: x + AI_TABLE_PIECE_WIDTH + AI_TABLE_TEXT_GAP + AI_TABLE_CELL_PADDING,
|
372
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_FONT_SIZE) / 2,
|
373
|
+
text: getTextEllipsis(dotMaxTextWidth).text,
|
374
|
+
fillStyle: colors.gray800
|
375
|
+
});
|
376
|
+
break;
|
377
|
+
case AITableSelectOptionStyle.tag:
|
378
|
+
const maxTextWidth = columnWidth - 2 * (AI_TABLE_CELL_PADDING + AI_TABLE_TAG_PADDING);
|
379
|
+
const { textWidth, text } = getTextEllipsis(maxTextWidth, AI_TABLE_TAG_FONT_SIZE);
|
380
|
+
const width = Math.max(textWidth + 2 * AI_TABLE_TAG_PADDING, AI_TABLE_CELL_MULTI_ITEM_MIN_WIDTH);
|
381
|
+
this.tag({
|
382
|
+
x: x + AI_TABLE_CELL_PADDING,
|
383
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_HEIGHT) / 2,
|
384
|
+
width,
|
385
|
+
height: AI_TABLE_OPTION_ITEM_HEIGHT,
|
386
|
+
text,
|
387
|
+
background,
|
388
|
+
color: colors.white,
|
389
|
+
radius: AI_TABLE_OPTION_ITEM_RADIUS,
|
390
|
+
padding: AI_TABLE_OPTION_ITEM_PADDING,
|
391
|
+
fontSize: AI_TABLE_TAG_FONT_SIZE,
|
392
|
+
stroke: background
|
393
|
+
});
|
394
|
+
break;
|
395
|
+
default:
|
396
|
+
const textMaxTextWidth = columnWidth - 2 * AI_TABLE_CELL_PADDING;
|
397
|
+
this.text({
|
398
|
+
x: x + AI_TABLE_CELL_PADDING,
|
399
|
+
y: y + (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_OPTION_ITEM_FONT_SIZE) / 2,
|
400
|
+
text: getTextEllipsis(textMaxTextWidth).text,
|
401
|
+
fillStyle: colors.gray800
|
402
|
+
});
|
403
|
+
break;
|
404
|
+
}
|
405
|
+
ctx.restore();
|
406
|
+
}
|
407
|
+
}
|
408
|
+
renderCellDate(render, ctx) {
|
409
|
+
const { x, y, transformValue, columnWidth, style } = render;
|
410
|
+
const colors = AITable.getColors();
|
411
|
+
let cellText = transformValue;
|
412
|
+
if (cellText == null || !_.isString(cellText)) {
|
413
|
+
return;
|
414
|
+
}
|
415
|
+
const textMaxWidth = columnWidth - 2 * AI_TABLE_CELL_PADDING;
|
416
|
+
const { text } = this.textEllipsis({ text: cellText, maxWidth: columnWidth && textMaxWidth });
|
417
|
+
if (ctx) {
|
418
|
+
const color = style?.color || colors.gray800;
|
419
|
+
this.text({
|
420
|
+
x: x + AI_TABLE_CELL_PADDING,
|
421
|
+
y: y + AI_TABLE_ROW_BLANK_HEIGHT / 2,
|
422
|
+
text,
|
423
|
+
fillStyle: color,
|
424
|
+
fontWeight: style?.fontWeight,
|
425
|
+
verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE
|
426
|
+
});
|
427
|
+
}
|
428
|
+
}
|
429
|
+
renderCellRate(render, ctx) {
|
430
|
+
const { x, y, transformValue: _cellValue } = render;
|
431
|
+
const max = 5;
|
432
|
+
const cellValue = _cellValue || 0;
|
433
|
+
const size = AI_TABLE_CELL_EMOJI_SIZE;
|
434
|
+
return [...Array(max).keys()].map((item, index) => {
|
435
|
+
const value = index + 1;
|
436
|
+
const checked = value <= cellValue;
|
437
|
+
const iconX = index * size + AI_TABLE_CELL_PADDING + index * AI_TABLE_CELL_EMOJI_PADDING;
|
438
|
+
const iconY = (AI_TABLE_ROW_BLANK_HEIGHT - size) / 2;
|
439
|
+
if (ctx && checked) {
|
440
|
+
this.path({
|
441
|
+
x: x + iconX,
|
442
|
+
y: y + iconY,
|
443
|
+
size: 22,
|
444
|
+
data: StarFill,
|
445
|
+
fill: this.colors.waring,
|
446
|
+
scaleX: 1.14,
|
447
|
+
scaleY: 1.14
|
448
|
+
});
|
449
|
+
}
|
450
|
+
});
|
451
|
+
}
|
452
|
+
renderCellProgress(render, ctx) {
|
453
|
+
const { x, y, transformValue, columnWidth, style } = render;
|
454
|
+
const colors = AITable.getColors();
|
455
|
+
const cellText = transformValue;
|
456
|
+
if (cellText == null || !_.isNumber(cellText)) {
|
457
|
+
return;
|
458
|
+
}
|
459
|
+
const width = columnWidth - 2 * AI_TABLE_CELL_PADDING - AI_TABLE_PROGRESS_TEXT_Width;
|
460
|
+
const height = AI_TABLE_PROGRESS_BAR_HEIGHT;
|
461
|
+
const textHeight = AI_TABLE_COMMON_FONT_SIZE;
|
462
|
+
const offsetX = AI_TABLE_CELL_PADDING;
|
463
|
+
const offsetY = (AI_TABLE_ROW_BLANK_HEIGHT - AI_TABLE_PROGRESS_BAR_HEIGHT) / 2;
|
464
|
+
const textOffsetY = (AI_TABLE_ROW_BLANK_HEIGHT - textHeight) / 2;
|
465
|
+
// 绘制背景
|
466
|
+
this.rect({
|
467
|
+
x: x + offsetX,
|
468
|
+
y: y + offsetY,
|
469
|
+
width,
|
470
|
+
height,
|
471
|
+
radius: AI_TABLE_PROGRESS_BAR_RADIUS,
|
472
|
+
fill: colors.gray200
|
473
|
+
});
|
474
|
+
// 计算并绘制进度
|
475
|
+
const progressWidth = (transformValue / 100) * width;
|
476
|
+
this.rect({
|
477
|
+
x: x + offsetX,
|
478
|
+
y: y + offsetY,
|
479
|
+
width: progressWidth,
|
480
|
+
height,
|
481
|
+
radius: AI_TABLE_PROGRESS_BAR_RADIUS,
|
482
|
+
fill: colors.success
|
483
|
+
});
|
484
|
+
this.text({
|
485
|
+
x: x + offsetX + width + AI_TABLE_TEXT_GAP,
|
486
|
+
y: y + textOffsetY,
|
487
|
+
text: `${transformValue}%`,
|
488
|
+
fillStyle: colors.gray800
|
489
|
+
});
|
490
|
+
}
|
491
|
+
renderCellMember(render, ctx) {
|
492
|
+
const { references, x, y, field, transformValue: _cellValue, rowHeight, columnWidth, isActive } = render;
|
493
|
+
const cellValue = _cellValue;
|
494
|
+
if (!cellValue?.length || !references) {
|
495
|
+
return;
|
496
|
+
}
|
497
|
+
const settings = field.settings;
|
498
|
+
const avatarSize = AI_TABLE_MEMBER_AVATAR_SIZE;
|
499
|
+
const itemHeight = AI_TABLE_CELL_MEMBER_ITEM_HEIGHT;
|
500
|
+
const isOperating = isActive;
|
501
|
+
const isMulti = settings?.is_multiple;
|
502
|
+
let currentX = AI_TABLE_CELL_PADDING;
|
503
|
+
let currentY = (AI_TABLE_ROW_BLANK_HEIGHT - avatarSize) / 2;
|
504
|
+
const itemOtherWidth = avatarSize + AI_TABLE_MEMBER_ITEM_PADDING_RIGHT + AI_TABLE_MEMBER_ITEM_AVATAR_MARGIN_RIGHT;
|
505
|
+
const maxHeight = isActive ? 130 - AI_TABLE_CELL_MULTI_PADDING_TOP : rowHeight - AI_TABLE_CELL_MULTI_PADDING_TOP;
|
506
|
+
const maxTextWidth = isOperating
|
507
|
+
? columnWidth - 2 * AI_TABLE_CELL_PADDING - itemOtherWidth - AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE - 12
|
508
|
+
: columnWidth - 2 * AI_TABLE_CELL_PADDING - itemOtherWidth;
|
509
|
+
const listCount = cellValue.length;
|
510
|
+
let isOverflow = false;
|
511
|
+
for (let index = 0; index < listCount; index++) {
|
512
|
+
const userInfo = references?.members[cellValue[index]];
|
513
|
+
if (!userInfo)
|
514
|
+
continue;
|
515
|
+
const { uid, display_name, avatar } = userInfo;
|
516
|
+
const type = AITableMemberType.member;
|
517
|
+
const itemWidth = AITableAvatarSize.size24 + (isMulti ? AI_TABLE_CELL_MEMBER_ITEM_PADDING : 0);
|
518
|
+
currentX = AI_TABLE_CELL_PADDING + index * itemWidth;
|
519
|
+
let realMaxTextWidth = maxTextWidth < 0 ? 0 : maxTextWidth;
|
520
|
+
if (index === 0 && isOperating) {
|
521
|
+
const operatingMaxWidth = maxTextWidth - (AI_TABLE_CELL_ADD_ITEM_BUTTON_SIZE + 4);
|
522
|
+
// item No space to display, then perform a line feed
|
523
|
+
if (operatingMaxWidth <= 20) {
|
524
|
+
currentX = AI_TABLE_CELL_PADDING;
|
525
|
+
currentY += AI_TABLE_OPTION_ITEM_HEIGHT + AI_TABLE_CELL_MULTI_ITEM_MARGIN_TOP;
|
526
|
+
}
|
527
|
+
else {
|
528
|
+
realMaxTextWidth = operatingMaxWidth;
|
529
|
+
}
|
530
|
+
}
|
531
|
+
let isMore = currentX + itemWidth > columnWidth - 2 * AI_TABLE_CELL_PADDING;
|
532
|
+
if (columnWidth != null) {
|
533
|
+
// 在非活动状态下,当超出列宽时,不会渲染后续内容
|
534
|
+
if (!isActive && currentX >= columnWidth - 2 * AI_TABLE_CELL_PADDING) {
|
535
|
+
break;
|
536
|
+
}
|
537
|
+
// 如果不是非活动状态的最后一行,则换行渲染溢出内容
|
538
|
+
if (!isActive && currentX > columnWidth - 2 * AI_TABLE_CELL_PADDING) {
|
539
|
+
currentX = AI_TABLE_CELL_PADDING;
|
540
|
+
}
|
541
|
+
if (isActive && currentX + itemWidth > columnWidth - AI_TABLE_CELL_PADDING) {
|
542
|
+
currentX = AI_TABLE_CELL_PADDING;
|
543
|
+
currentY += itemHeight;
|
544
|
+
}
|
545
|
+
if (isActive && currentY >= maxHeight) {
|
546
|
+
isOverflow = true;
|
547
|
+
}
|
548
|
+
}
|
549
|
+
if (ctx && !isActive) {
|
550
|
+
this.avatar({
|
551
|
+
x: x + currentX,
|
552
|
+
y: y + currentY,
|
553
|
+
url: avatar,
|
554
|
+
id: uid,
|
555
|
+
title: getAvatarShortName(display_name),
|
556
|
+
bgColor: getAvatarBgColor(display_name),
|
557
|
+
type: AITableAvatarType.member,
|
558
|
+
size: AITableAvatarSize.size24
|
559
|
+
});
|
560
|
+
if (isMore) {
|
561
|
+
ctx.save();
|
562
|
+
ctx.globalAlpha = 0.3;
|
563
|
+
this.rect({
|
564
|
+
x: x + currentX,
|
565
|
+
y: y + currentY,
|
566
|
+
width: AITableAvatarSize.size24,
|
567
|
+
height: AITableAvatarSize.size24,
|
568
|
+
radius: 24,
|
569
|
+
fill: this.colors.black
|
570
|
+
});
|
571
|
+
ctx.restore();
|
572
|
+
this.text({
|
573
|
+
x: x + currentX + FONT_SIZE_SM / 2,
|
574
|
+
y: y + AI_TABLE_ROW_BLANK_HEIGHT / 2,
|
575
|
+
fillStyle: this.colors.white,
|
576
|
+
fontSize: FONT_SIZE_SM,
|
577
|
+
text: `+${listCount - index - 1}`,
|
578
|
+
verticalAlign: DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE
|
579
|
+
});
|
580
|
+
}
|
581
|
+
}
|
582
|
+
}
|
583
|
+
}
|
584
|
+
}
|
585
|
+
export const cellDrawer = new CellDrawer();
|
586
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1kcmF3ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9ncmlkL3NyYy9yZW5kZXJlci9kcmF3ZXJzL2NlbGwtZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQ0gsa0NBQWtDLEVBQ2xDLHFDQUFxQyxFQUNyQyw0Q0FBNEMsRUFDNUMsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLGlDQUFpQyxFQUNqQyw4QkFBOEIsRUFDOUIsbUNBQW1DLEVBQ25DLGtDQUFrQyxFQUNsQyxnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQix3Q0FBd0MsRUFDeEMsa0NBQWtDLEVBQ2xDLHVCQUF1QixFQUN2QixlQUFlLEVBQ2YsOEJBQThCLEVBQzlCLDJCQUEyQixFQUMzQiw0QkFBNEIsRUFDNUIsMkJBQTJCLEVBQzNCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsNEJBQTRCLEVBQzVCLDRCQUE0QixFQUM1Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQix1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2Qix3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLFlBQVksRUFDWixRQUFRLEVBQ1gsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsT0FBTyxFQUFnQixnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBa0MsTUFBTSxZQUFZLENBQUM7QUFDL0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGlC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Q0FBQztvQkFDWCxHQUFHLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDTixDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVE7d0JBQ2YsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRO3dCQUNmLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO3dCQUMvQixNQUFNLEVBQUUsaUJBQWlCLENBQUMsTUFBTTt3QkFDaEMsTUFBTSxFQUFFLEVBQUU7d0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSztxQkFDMUIsQ0FBQyxDQUFDO29CQUNILEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDO3dCQUNOLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxHQUFHLFlBQVksR0FBRyxDQUFDO3dCQUNsQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHlCQUF5QixHQUFHLENBQUM7d0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7d0JBQzVCLFFBQVEsRUFBRSxZQUFZO3dCQUN0QixJQUFJLEVBQUUsSUFBSSxTQUFTLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRTt3QkFDakMsYUFBYSxFQUFFLGtDQUFrQztxQkFDcEQsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7Q0FDSjtBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gICAgQUlfVEFCTEVfQ0VMTF9BRERfSVRFTV9CVVRUT05fU0laRSxcbiAgICBBSV9UQUJMRV9DRUxMX0RFTEVURV9JVEVNX0JVVFRPTl9TSVpFLFxuICAgIEFJX1RBQkxFX0NFTExfREVMRVRFX0lURU1fQlVUVE9OX1NJWkVfT0ZGU0VULFxuICAgIEFJX1RBQkxFX0NFTExfRU1PSklfUEFERElORyxcbiAgICBBSV9UQUJMRV9DRUxMX0VNT0pJX1NJWkUsXG4gICAgQUlfVEFCTEVfQ0VMTF9NQVhfUk9XX0NPVU5ULFxuICAgIEFJX1RBQkxFX0NFTExfTUVNQkVSX0lURU1fSEVJR0hULFxuICAgIEFJX1RBQkxFX0NFTExfTUVNQkVSX0lURU1fUEFERElORyxcbiAgICBBSV9UQUJMRV9DRUxMX01VTFRJX0RPVF9SQURJVVMsXG4gICAgQUlfVEFCTEVfQ0VMTF9NVUxUSV9JVEVNX01BUkdJTl9UT1AsXG4gICAgQUlfVEFCTEVfQ0VMTF9NVUxUSV9JVEVNX01JTl9XSURUSCxcbiAgICBBSV9UQUJMRV9DRUxMX01VTFRJX1BBRERJTkdfTEVGVCxcbiAgICBBSV9UQUJMRV9DRUxMX01VTFRJX1BBRERJTkdfVE9QLFxuICAgIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICBBSV9UQUJMRV9DT01NT05fRk9OVF9TSVpFLFxuICAgIEFJX1RBQkxFX0RPVF9SQURJVVMsXG4gICAgQUlfVEFCTEVfTUVNQkVSX0FWQVRBUl9TSVpFLFxuICAgIEFJX1RBQkxFX01FTUJFUl9JVEVNX0FWQVRBUl9NQVJHSU5fUklHSFQsXG4gICAgQUlfVEFCTEVfTUVNQkVSX0lURU1fUEFERElOR19SSUdIVCxcbiAgICBBSV9UQUJMRV9NSU5fVEVYVF9XSURUSCxcbiAgICBBSV9UQUJMRV9PRkZTRVQsXG4gICAgQUlfVEFCTEVfT1BUSU9OX0lURU1fRk9OVF9TSVpFLFxuICAgIEFJX1RBQkxFX09QVElPTl9JVEVNX0hFSUdIVCxcbiAgICBBSV9UQUJMRV9PUFRJT05fSVRFTV9QQURESU5HLFxuICAgIEFJX1RBQkxFX09QVElPTl9JVEVNX1JBRElVUyxcbiAgICBBSV9UQUJMRV9QSUVDRV9SQURJVVMsXG4gICAgQUlfVEFCTEVfUElFQ0VfV0lEVEgsXG4gICAgQUlfVEFCTEVfUFJPR1JFU1NfQkFSX0hFSUdIVCxcbiAgICBBSV9UQUJMRV9QUk9HUkVTU19CQVJfUkFESVVTLFxuICAgIEFJX1RBQkxFX1BST0dSRVNTX1RFWFRfV2lkdGgsXG4gICAgQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCxcbiAgICBBSV9UQUJMRV9UQUdfRk9OVF9TSVpFLFxuICAgIEFJX1RBQkxFX1RBR19QQURESU5HLFxuICAgIEFJX1RBQkxFX1RFWFRfR0FQLFxuICAgIENvbG9ycyxcbiAgICBERUZBVUxUX0ZPTlRfRkFNSUxZLFxuICAgIERFRkFVTFRfRk9OVF9TSVpFLFxuICAgIERFRkFVTFRfRk9OVF9XRUlHSFQsXG4gICAgREVGQVVMVF9URVhUX0FMSUdOX0xFRlQsXG4gICAgREVGQVVMVF9URVhUX0FMSUdOX1JJR0hULFxuICAgIERFRkFVTFRfVEVYVF9ERUNPUkFUSU9OLFxuICAgIERFRkFVTFRfVEVYVF9MSU5FX0hFSUdIVCxcbiAgICBERUZBVUxUX1RFWFRfVkVSVElDQUxfQUxJR05fTUlERExFLFxuICAgIEZPTlRfU0laRV9TTSxcbiAgICBTdGFyRmlsbFxufSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQUlUYWJsZSwgQUlUYWJsZUZpZWxkLCBBSVRhYmxlRmllbGRUeXBlLCBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUsIE1lbWJlclNldHRpbmdzLCBSYXRlRmllbGRWYWx1ZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgQUlUYWJsZUF2YXRhclNpemUsIEFJVGFibGVBdmF0YXJUeXBlLCBBSVRhYmxlTWVtYmVyVHlwZSwgQUlUYWJsZVJlbmRlciwgQUlUYWJsZVNlbGVjdEZpZWxkIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0QXZhdGFyQmdDb2xvciwgZ2V0QXZhdGFyU2hvcnROYW1lLCBnZXRUZXh0V2lkdGggfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBEcmF3ZXIgfSBmcm9tICcuL2RyYXdlcic7XG5cbi8qKlxuICog5aSE55CG5ZKM5riy5p+T6KGo5qC85Y2V5YWD5qC855qE5YaF5a65XG4gKi9cbmV4cG9ydCBjbGFzcyBDZWxsRHJhd2VyIGV4dGVuZHMgRHJhd2VyIHtcbiAgICAvLyDmoLflvI/liJ3lp4vljJZcbiAgICBwdWJsaWMgaW5pdFN0eWxlKGZpZWxkOiBBSVRhYmxlRmllbGQsIHN0eWxlUHJvcHM6IHsgZm9udFdlaWdodDogYW55IH0pOiB2b2lkIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHsgdHlwZTogZmllbGRUeXBlIH0gPSBmaWVsZDtcbiAgICAgICAgY29uc3QgeyBmb250V2VpZ2h0ID0gREVGQVVMVF9GT05UX1dFSUdIVCB9ID0gc3R5bGVQcm9wcztcblxuICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBBSVRhYmxlRmllbGRUeXBlLnRleHQ6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUuZGF0ZTpcbiAgICAgICAgICAgIGNhc2UgQUlUYWJsZUZpZWxkVHlwZS5jcmVhdGVkQXQ6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUudXBkYXRlZEF0OlxuICAgICAgICAgICAgY2FzZSBBSVRhYmxlRmllbGRUeXBlLnJhdGU6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUucHJvZ3Jlc3M6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUubWVtYmVyOlxuICAgICAgICAgICAgY2FzZSBBSVRhYmxlRmllbGRUeXBlLmNyZWF0ZWRCeTpcbiAgICAgICAgICAgIGNhc2UgQUlUYWJsZUZpZWxkVHlwZS51cGRhdGVkQnk6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0U3R5bGUoeyBmb250U2l6ZTogREVGQVVMVF9GT05UX1NJWkUsIGZvbnRXZWlnaHQgfSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g5Y2V5YWD5qC85riy5p+TXG4gICAgcHVibGljIHJlbmRlckNlbGwocmVuZGVyOiBBSVRhYmxlUmVuZGVyLCBjdHg/OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBmaWVsZCB9ID0gcmVuZGVyO1xuICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBmaWVsZC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUudGV4dDpcbiAgICAgICAgICAgIGNhc2UgQUlUYWJsZUZpZWxkVHlwZS5udW1iZXI6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUubGluazpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDZWxsVGV4dChyZW5kZXIsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUuc2VsZWN0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNlbGxTZWxlY3QocmVuZGVyLCBjdHgpO1xuICAgICAgICAgICAgY2FzZSBBSVRhYmxlRmllbGRUeXBlLmRhdGU6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUuY3JlYXRlZEF0OlxuICAgICAgICAgICAgY2FzZSBBSVRhYmxlRmllbGRUeXBlLnVwZGF0ZWRBdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDZWxsRGF0ZShyZW5kZXIsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUucmF0ZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDZWxsUmF0ZShyZW5kZXIsIGN0eCk7XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUucHJvZ3Jlc3M6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ2VsbFByb2dyZXNzKHJlbmRlciwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgQUlUYWJsZUZpZWxkVHlwZS5tZW1iZXI6XG4gICAgICAgICAgICBjYXNlIEFJVGFibGVGaWVsZFR5cGUuY3JlYXRlZEJ5OlxuICAgICAgICAgICAgY2FzZSBBSVRhYmxlRmllbGRUeXBlLnVwZGF0ZWRCeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDZWxsTWVtYmVyKHJlbmRlciwgY3R4KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckNlbGxUZXh0KHJlbmRlcjogQUlUYWJsZVJlbmRlciwgY3R4PzogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgdHJhbnNmb3JtVmFsdWUsIGZpZWxkLCBjb2x1bW5XaWR0aCwgc3R5bGUgfSA9IHJlbmRlcjtcbiAgICAgICAgY29uc3QgZmllbGRUeXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgbGV0IHJlbmRlclRleHQ6IHN0cmluZyB8IG51bGwgPSBmaWVsZFR5cGUgPT09IEFJVGFibGVGaWVsZFR5cGUubGluayA/IHRyYW5zZm9ybVZhbHVlLnRleHQgOiB0cmFuc2Zvcm1WYWx1ZTtcbiAgICAgICAgaWYgKHJlbmRlclRleHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2luZ2xlTGluZSA9ICFjb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaXNUZXh0RmllbGQgPSBmaWVsZFR5cGUgPT09IEFJVGFibGVGaWVsZFR5cGUudGV4dDtcbiAgICAgICAgY29uc3QgaXNOdW1iZXJGaWVsZCA9IGZpZWxkVHlwZSA9PT0gQUlUYWJsZUZpZWxkVHlwZS5udW1iZXI7XG5cbiAgICAgICAgaWYgKGlzVGV4dEZpZWxkICYmIGlzU2luZ2xlTGluZSkge1xuICAgICAgICAgICAgcmVuZGVyVGV4dCA9IHJlbmRlclRleHQucmVwbGFjZSgvXFxyfFxcbi9nLCAnICcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sb3IgPSBzdHlsZT8uY29sb3IgfHwgdGhpcy5jb2xvcnMuZ3JheTgwMDtcbiAgICAgICAgY29uc3QgdGV4dEFsaWduID0gc3R5bGU/LnRleHRBbGlnbiB8fCBERUZBVUxUX1RFWFRfQUxJR05fTEVGVDtcbiAgICAgICAgY29uc3QgZm9udFdlaWdodCA9IHN0eWxlPy5mb250V2VpZ2h0O1xuICAgICAgICBjb25zdCB0ZXh0TWF4V2lkdGggPSBjb2x1bW5XaWR0aCAtIDIgKiBBSV9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IHJlbmRlclggPSB0ZXh0QWxpZ24gPT09IERFRkFVTFRfVEVYVF9BTElHTl9SSUdIVCA/IHggKyBjb2x1bW5XaWR0aCAtIEFJX1RBQkxFX0NFTExfUEFERElORyA6IHggKyBBSV9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IHJlbmRlclkgPSB5ICsgQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAvIDI7XG4gICAgICAgIGNvbnN0IHRleHREZWNvcmF0aW9uID0gREVGQVVMVF9URVhUX0RFQ09SQVRJT047XG5cbiAgICAgICAgaWYgKGlzTnVtYmVyRmllbGQpIHtcbiAgICAgICAgICAgIHJlbmRlclRleHQgPSBTdHJpbmcocmVuZGVyVGV4dCk7XG4gICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IHRoaXMudGV4dEVsbGlwc2lzKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiByZW5kZXJUZXh0LFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBjb2x1bW5XaWR0aCAmJiB0ZXh0TWF4V2lkdGgsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICAgICAgbGV0IHB1cmVUZXh0ID0gdGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICB4OiByZW5kZXJYLFxuICAgICAgICAgICAgICAgICAgICB5OiByZW5kZXJZLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBwdXJlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IGNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBmb250V2VpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwVGV4dCh7XG4gICAgICAgICAgICAgICAgeDogcmVuZGVyWCxcbiAgICAgICAgICAgICAgICB5OiByZW5kZXJZLFxuICAgICAgICAgICAgICAgIHRleHQ6IHJlbmRlclRleHQsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IHRleHRNYXhXaWR0aCxcbiAgICAgICAgICAgICAgICBtYXhSb3c6IEFJX1RBQkxFX0NFTExfTUFYX1JPV19DT1VOVCxcbiAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBERUZBVUxUX1RFWFRfTElORV9IRUlHSFQsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVEVYVF9WRVJUSUNBTF9BTElHTl9NSURETEUsXG4gICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBmaWVsZFR5cGUgPT09IEFJVGFibGVGaWVsZFR5cGUubGluayA/IENvbG9ycy5wcmltYXJ5IDogY29sb3IsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCxcbiAgICAgICAgICAgICAgICB0ZXh0RGVjb3JhdGlvbixcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGUsXG4gICAgICAgICAgICAgICAgbmVlZERyYXc6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJDZWxsU2VsZWN0KHJlbmRlcjogQUlUYWJsZVJlbmRlciwgY3R4PzogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgZmllbGQgfSA9IHJlbmRlcjtcbiAgICAgICAgaWYgKChmaWVsZCBhcyBBSVRhYmxlU2VsZWN0RmllbGQpLnNldHRpbmdzPy5pc19tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDZWxsTXVsdGlTZWxlY3QocmVuZGVyLCBjdHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJTaW5nbGVTZWxlY3RDZWxsKHJlbmRlciwgY3R4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ2VsbE11bHRpU2VsZWN0KHJlbmRlcjogQUlUYWJsZVJlbmRlciwgY3R4PzogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgZmllbGQsIHRyYW5zZm9ybVZhbHVlLCBjb2x1bW5XaWR0aCB9ID0gcmVuZGVyO1xuICAgICAgICBpZiAoIXRyYW5zZm9ybVZhbHVlPy5sZW5ndGggfHwgIUFycmF5LmlzQXJyYXkodHJhbnNmb3JtVmFsdWUpKSByZXR1cm47XG4gICAgICAgIGxldCBjdXJyZW50WCA9IHggKyBBSV9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgICAgIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gY29sdW1uV2lkdGggLSAyICogQUlfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgICAgICBjb25zdCBvcHRpb25TdHlsZSA9IChmaWVsZCBhcyBBSVRhYmxlU2VsZWN0RmllbGQpLnNldHRpbmdzLm9wdGlvbl9zdHlsZTtcbiAgICAgICAgY29uc3QgZm9udFN0eWxlID0gYCR7REVGQVVMVF9GT05UX1dFSUdIVH0gJHtBSV9UQUJMRV9PUFRJT05fSVRFTV9GT05UX1NJWkV9cHggJHtERUZBVUxUX0ZPTlRfRkFNSUxZfWA7XG4gICAgICAgIGNvbnN0IGlzRG90T3JQaWVjZSA9IG9wdGlvblN0eWxlID09PSBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUuZG90IHx8IG9wdGlvblN0eWxlID09PSBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUucGllY2U7XG5cbiAgICAgICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgICAgICBjb25zdCBjZWxsSXRlbUluZm9NYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBkcmF3YWJsZUluZGV4ID0gMDtcbiAgICAgICAgdHJhbnNmb3JtVmFsdWUuZm9yRWFjaCgob3B0aW9uSWQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gKGZpZWxkIGFzIEFJVGFibGVTZWxlY3RGaWVsZCkuc2V0dGluZ3Mub3B0aW9ucz8uZmluZCgob3B0aW9uKSA9PiBvcHRpb24uX2lkID09PSBvcHRpb25JZCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0V2lkdGggPSBnZXRUZXh0V2lkdGgoY3R4LCBpdGVtPy50ZXh0IGFzIHN0cmluZywgZm9udFN0eWxlKTtcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gdGV4dFdpZHRoICsgMiAqIEFJX1RBQkxFX0NFTExfUEFERElORztcbiAgICAgICAgICAgIGlmIChpbmRleCA8IHRyYW5zZm9ybVZhbHVlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFdpZHRoICs9IEFJX1RBQkxFX0NFTExfTVVMVElfUEFERElOR19MRUZUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRG90T3JQaWVjZSkge1xuICAgICAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gQUlfVEFCTEVfQ0VMTF9NVUxUSV9ET1RfUkFESVVTICogMiArIEFJX1RBQkxFX0NFTExfTVVMVElfUEFERElOR19MRUZUO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRvdGFsV2lkdGggPCBtYXhDb250YWluZXJXaWR0aCB8fCB0b3RhbFdpZHRoID09PSBtYXhDb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGRyYXdhYmxlSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNlbGxJdGVtSW5mb01hcC5zZXQob3B0aW9uSWQsIHsgdGV4dFdpZHRoLCBpdGVtLCBvZmZzZXQ6IHRvdGFsV2lkdGggfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGJhc2VXaWR0aCA9IEFJX1RBQkxFX01JTl9URVhUX1dJRFRIICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HICogMjtcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSBpc0RvdE9yUGllY2UgPyBiYXNlV2lkdGggKyBBSV9UQUJMRV9DRUxMX01VTFRJX0RPVF9SQURJVVMgKiAyICsgQUlfVEFCTEVfQ0VMTF9NVUxUSV9QQURESU5HX0xFRlQgOiBiYXNlV2lkdGg7XG5cbiAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlW2RyYXdhYmxlSW5kZXggKyAxXSkge1xuICAgICAgICAgICAgY29uc3QgeyBvZmZzZXQ6IGN1cnJlbnRPZmZzZXQgfSA9IGNlbGxJdGVtSW5mb01hcC5nZXQodHJhbnNmb3JtVmFsdWVbZHJhd2FibGVJbmRleF0pO1xuICAgICAgICAgICAgY29uc3QgY2FuRHJhd2VyTmV4dCA9IG1heENvbnRhaW5lcldpZHRoIC0gY3VycmVudE9mZnNldCA+IG1pbldpZHRoO1xuICAgICAgICAgICAgZHJhd2FibGVJbmRleCA9IGNhbkRyYXdlck5leHQgPyBkcmF3YWJsZUluZGV4ICsgMSA6IGRyYXdhYmxlSW5kZXg7XG4gICAgICAgICAgICAvLyDkuIrpnaLov4fnqIvmmK8gIOayoeaciSAr5pWw5a2XICDnmoTmg4XlhrXkuIvmnIDlpKfog73mlL7lh6DkuKrvvJtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlciA9IHRyYW5zZm9ybVZhbHVlLmxlbmd0aCAtIChkcmF3YWJsZUluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIGlmIChudW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8g6K+05piO5pyJICvmlbDlrZfvvIzph43mlrDorqHnrpdcbiAgICAgICAgICAgICAgICBjb25zdCBjaXJjbGVXaWR0aCA9IGdldFRleHRXaWR0aChjdHgsIGAre251bWJlcn1gLCBmb250U3R5bGUpICsgMiAqIEFJX1RBQkxFX0NFTExfUEFERElORztcbiAgICAgICAgICAgICAgICBjb25zdCBtYXggPSBtYXhDb250YWluZXJXaWR0aCAtIEFJX1RBQkxFX0NFTExfTVVMVElfUEFERElOR19MRUZUIC0gY2lyY2xlV2lkdGg7XG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5b2T5YmN5bey57uP6LaF5Ye65LqG77yM55yL5piv5ZCm6IO95a655LiL5b2T5YmN55qE77yM5LiN6IO95bCx5YeP5Y67ICAx77ybXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEl0ZW1IYXNPdmVyID0gY3VycmVudE9mZnNldCA+IG1heDtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEl0ZW1IYXNPdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RPZmZzZXQgPSBkcmF3YWJsZUluZGV4ID09PSAwID8gMCA6IGNlbGxJdGVtSW5mb01hcC5nZXQodHJhbnNmb3JtVmFsdWVbZHJhd2FibGVJbmRleCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgZHJhd2FibGVJbmRleCA9IG1heCAtIGxhc3RPZmZzZXQgPiBtaW5XaWR0aCA/IGRyYXdhYmxlSW5kZXggOiBkcmF3YWJsZUluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyDov5jmnInliankvZnnqbrpl7QsIOeci+aYr+WQpuiDveWkmua4suafk+S4gOS4qlxuICAgICAgICAgICAgICAgICAgICBkcmF3YWJsZUluZGV4ID0gbWF4IC0gY3VycmVudE9mZnNldCA+IG1pbldpZHRoID8gZHJhd2FibGVJbmRleCArIDEgOiBkcmF3YWJsZUluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcmNsZVRleHQgPSBgKyR7dHJhbnNmb3JtVmFsdWUubGVuZ3RoIC0gKGRyYXdhYmxlSW5kZXggKyAxKX1gO1xuICAgICAgICBjb25zdCBjaXJjbGVXaWR0aCA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1WYWx1ZS5sZW5ndGggLSAoZHJhd2FibGVJbmRleCArIDEpID4gMCA/IGdldFRleHRXaWR0aChjdHgsIGNpcmNsZVRleHQsIGZvbnRTdHlsZSkgKyAyICogQUlfVEFCTEVfQ0VMTF9QQURESU5HIDogMDtcbiAgICAgICAgLy8g5Ymp5L2Z56m66Ze0XG4gICAgICAgIGxldCByZW1haW5TcGFjZSA9IG1heENvbnRhaW5lcldpZHRoIC0gY2lyY2xlV2lkdGggLSAoY2lyY2xlV2lkdGggPiAwID8gQUlfVEFCTEVfQ0VMTF9NVUxUSV9QQURESU5HX0xFRlQgOiAwKTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdHJhbnNmb3JtVmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25JZCA9IHRyYW5zZm9ybVZhbHVlW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGJnQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHg6IGN1cnJlbnRYLFxuICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX09QVElPTl9JVEVNX0hFSUdIVCkgLyAyLFxuICAgICAgICAgICAgICAgIGhlaWdodDogQUlfVEFCTEVfT1BUSU9OX0lURU1fSEVJR0hULFxuICAgICAgICAgICAgICAgIHJhZGl1czogQUlfVEFCTEVfUElFQ0VfUkFESVVTLFxuICAgICAgICAgICAgICAgIGZpbGw6IENvbG9ycy5ncmF5MTAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAwXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjb21tb25JdGVtID0gKG9wdGlvblN0eWxlOiBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUsIHNoYXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlV2lkdGggPSBpc0RvdE9yUGllY2VcbiAgICAgICAgICAgICAgICAgICAgPyBBSV9UQUJMRV9DRUxMX01VTFRJX0RPVF9SQURJVVMgKiAyICsgQUlfVEFCTEVfQ0VMTF9NVUxUSV9QQURESU5HX0xFRlQgKyBBSV9UQUJMRV9DRUxMX1BBRERJTkcgKiAyXG4gICAgICAgICAgICAgICAgICAgIDogQUlfVEFCTEVfQ0VMTF9QQURESU5HICogMjtcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluU3BhY2UgPCBtaW5XaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgdGV4dFdpZHRoLCBpdGVtIH0gPSBjZWxsSXRlbUluZm9NYXAuZ2V0KG9wdGlvbklkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZVdpZHRoID0gYmFzZVdpZHRoICsgdGV4dFdpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdHJhbnNmb3JtVmFsdWUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZW1haW5TcGFjZSAtPSBBSV9UQUJMRV9DRUxMX01VTFRJX1BBRERJTkdfTEVGVDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYmdXaWR0aCA9IHJlbWFpblNwYWNlID4gY29tcGxldGVXaWR0aCA/IGNvbXBsZXRlV2lkdGggOiByZW1haW5TcGFjZTtcbiAgICAgICAgICAgICAgICBiZ0NvbmZpZy53aWR0aCA9IGJnV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGlzRG90T3JQaWVjZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QoYmdDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGUgPT09ICdyZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBiZ0NvbmZpZy54ICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX0NFTExfTVVMVElfRE9UX1JBRElVUyAqIDIpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogQUlfVEFCTEVfQ0VMTF9NVUxUSV9ET1RfUkFESVVTICogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IEFJX1RBQkxFX0NFTExfTVVMVElfRE9UX1JBRElVUyAqIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBBSV9UQUJMRV9QSUVDRV9SQURJVVMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogaXRlbT8uYmdfY29sb3IgPz8gaXRlbT8uY29sb3IgPz8gQ29sb3JzLnByaW1hcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNoYXBlID09PSAnYXJjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGJnQ29uZmlnLnggKyBBSV9UQUJMRV9DRUxMX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogeSArIChBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC0gQUlfVEFCTEVfQ0VMTF9NVUxUSV9ET1RfUkFESVVTICogMikgLyAyICsgQUlfVEFCTEVfQ0VMTF9NVUxUSV9ET1RfUkFESVVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogQUlfVEFCTEVfQ0VMTF9NVUxUSV9ET1RfUkFESVVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IGl0ZW0/LmJnX2NvbG9yID8/IGl0ZW0/LmNvbG9yID8/IENvbG9ycy5wcmltYXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBiZ0NvbmZpZy54ICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HICsgQUlfVEFCTEVfQ0VMTF9NVUxUSV9ET1RfUkFESVVTICogMiArIEFJX1RBQkxFX0NFTExfTVVMVElfUEFERElOR19MRUZULFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogeSArIChBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC0gQUlfVEFCTEVfT1BUSU9OX0lURU1fRk9OVF9TSVpFKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnRleHRFbGxpcHNpcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogaXRlbS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBiZ1dpZHRoIC0gYmFzZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBBSV9UQUJMRV9PUFRJT05fSVRFTV9GT05UX1NJWkVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IENvbG9ycy5ncmF5NzAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IEFJX1RBQkxFX09QVElPTl9JVEVNX0ZPTlRfU0laRVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvblN0eWxlID09PSBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IGJnQ29uZmlnLngsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBiZ0NvbmZpZy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGJnQ29uZmlnLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy50ZXh0RWxsaXBzaXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW0udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogYmdXaWR0aCAtIGJhc2VXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogQUlfVEFCTEVfVEFHX0ZPTlRfU0laRVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogQUlfVEFCTEVfT1BUSU9OX0lURU1fUkFESVVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IEFJX1RBQkxFX1RBR19GT05UX1NJWkUsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGJnQ29uZmlnLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBDb2xvcnMud2hpdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBBSV9UQUJMRV9DRUxMX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBpdGVtPy5iZ19jb2xvciA/PyBpdGVtPy5jb2xvciA/PyBDb2xvcnMucHJpbWFyeVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QoYmdDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogYmdDb25maWcueCArIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX1RBR19GT05UX1NJWkUpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMudGV4dEVsbGlwc2lzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IGJnV2lkdGggLSBiYXNlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IEFJX1RBQkxFX1RBR19GT05UX1NJWkVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IENvbG9ycy5ncmF5NzAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IEFJX1RBQkxFX1RBR19GT05UX1NJWkVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGJnQ29uZmlnLndpZHRoO1xuICAgICAgICAgICAgICAgIHJlbWFpblNwYWNlIC09IGN1cnJlbnRXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyZW50WCArPSBjdXJyZW50V2lkdGggKyBBSV9UQUJMRV9DRUxMX01VTFRJX1BBRERJTkdfTEVGVDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uU3R5bGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEFJVGFibGVTZWxlY3RPcHRpb25TdHlsZS5kb3Q6XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbkl0ZW0oQUlUYWJsZVNlbGVjdE9wdGlvblN0eWxlLmRvdCwgJ2FyYycpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEFJVGFibGVTZWxlY3RPcHRpb25TdHlsZS5waWVjZTpcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uSXRlbShBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUucGllY2UsICdyZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQUlUYWJsZVNlbGVjdE9wdGlvblN0eWxlLnRhZzpcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uSXRlbShBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUudGFnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbkl0ZW0oQUlUYWJsZVNlbGVjdE9wdGlvblN0eWxlLnRleHQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2lyY2xlV2lkdGggPiAwKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uU3R5bGUgPT09IEFJVGFibGVTZWxlY3RPcHRpb25TdHlsZS50YWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZyh7XG4gICAgICAgICAgICAgICAgICAgIHg6IGN1cnJlbnRYLFxuICAgICAgICAgICAgICAgICAgICB5OiB5ICsgKEFJX1RBQkxFX1JPV19CTEFOS19IRUlHSFQgLSBBSV9UQUJMRV9PUFRJT05fSVRFTV9IRUlHSFQpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNpcmNsZVdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IEFJX1RBQkxFX09QVElPTl9JVEVNX0hFSUdIVCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY2lyY2xlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQ29sb3JzLmdyYXkxMDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBDb2xvcnMuZ3JheTcwMCxcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBBSV9UQUJMRV9PUFRJT05fSVRFTV9SQURJVVMsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IEFJX1RBQkxFX1RBR19GT05UX1NJWkVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX09QVElPTl9JVEVNX0hFSUdIVCkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogY2lyY2xlV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogQUlfVEFCTEVfT1BUSU9OX0lURU1fSEVJR0hULFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBDb2xvcnMuZ3JheTEwMCxcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBBSV9UQUJMRV9QSUVDRV9SQURJVVNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICB4OiBjdXJyZW50WCArIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgeTogeSArIChBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC0gQUlfVEFCTEVfVEFHX0ZPTlRfU0laRSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjaXJjbGVUZXh0LFxuICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IENvbG9ycy5ncmF5NzAwLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogQUlfVEFCTEVfVEFHX0ZPTlRfU0laRVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJTaW5nbGVTZWxlY3RDZWxsKHJlbmRlcjogQUlUYWJsZVJlbmRlciwgY3R4PzogYW55KSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgdHJhbnNmb3JtVmFsdWUsIGZpZWxkLCBjb2x1bW5XaWR0aCwgaXNBY3RpdmUgfSA9IHJlbmRlcjtcbiAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlID09IG51bGwgfHwgdHJhbnNmb3JtVmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNPcGVyYXRpbmcgPSBpc0FjdGl2ZTtcbiAgICAgICAgY29uc3QgaXRlbSA9IChmaWVsZCBhcyBBSVRhYmxlU2VsZWN0RmllbGQpLnNldHRpbmdzLm9wdGlvbnM/LmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLl9pZCA9PT0gdHJhbnNmb3JtVmFsdWVbMF0pO1xuICAgICAgICBjb25zdCBpdGVtTmFtZSA9IGl0ZW0/LnRleHQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGdldFRleHRFbGxpcHNpcyA9IChtYXhUZXh0V2lkdGg6IG51bWJlciwgZm9udFNpemU6IG51bWJlciA9IEFJX1RBQkxFX0NPTU1PTl9GT05UX1NJWkUpID0+IHtcbiAgICAgICAgICAgIG1heFRleHRXaWR0aCAtPSBpc09wZXJhdGluZyA/IEFJX1RBQkxFX0NFTExfREVMRVRFX0lURU1fQlVUVE9OX1NJWkUgLSBBSV9UQUJMRV9DRUxMX0RFTEVURV9JVEVNX0JVVFRPTl9TSVpFX09GRlNFVCA6IDA7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0RWxsaXBzaXMoe1xuICAgICAgICAgICAgICAgIHRleHQ6IGl0ZW1OYW1lLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBjb2x1bW5XaWR0aCAmJiBtYXhUZXh0V2lkdGgsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgICAgICAgICBjb25zdCBjb2xvcnMgPSBBSVRhYmxlLmdldENvbG9ycygpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uU3R5bGUgPSAoZmllbGQgYXMgQUlUYWJsZVNlbGVjdEZpZWxkKS5zZXR0aW5ncy5vcHRpb25fc3R5bGU7XG4gICAgICAgICAgICBsZXQgYmFja2dyb3VuZCA9IGl0ZW0/LmJnX2NvbG9yID8/IGl0ZW0/LmNvbG9yID8/IGNvbG9ycy5wcmltYXJ5O1xuICAgICAgICAgICAgY29uc3QgZG90TWF4VGV4dFdpZHRoID0gY29sdW1uV2lkdGggLSAyICogQUlfVEFCTEVfQ0VMTF9QQURESU5HIC0gQUlfVEFCTEVfUElFQ0VfV0lEVEggLSBBSV9UQUJMRV9URVhUX0dBUDtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gMTtcbiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uU3R5bGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEFJVGFibGVTZWxlY3RPcHRpb25TdHlsZS5kb3Q6XG4gICAgICAgICAgICAgICAgICAgIC8vIOi/memHjOeahCBBSV9UQUJMRV9PRkZTRVQg5YGP56e75LiN56Gu5a6a5piv5Li65ZWl77yI5YyF5ousIHBpZWNlIOeahO+8ie+8jOWPquaYr+S4uuS6huS/neaMgeWSjOe8lui+kee7hOS7tuS4reeahOWvuem9kFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFyYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HICsgQUlfVEFCTEVfRE9UX1JBRElVUyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX1BJRUNFX1dJRFRIKSAvIDIgKyBBSV9UQUJMRV9ET1RfUkFESVVTIC0gQUlfVEFCTEVfT0ZGU0VULFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiBBSV9UQUJMRV9ET1RfUkFESVVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHggKyBBSV9UQUJMRV9QSUVDRV9XSURUSCArIEFJX1RBQkxFX1RFWFRfR0FQICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogeSArIChBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC0gQUlfVEFCTEVfT1BUSU9OX0lURU1fRk9OVF9TSVpFKSAvIDIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBnZXRUZXh0RWxsaXBzaXMoZG90TWF4VGV4dFdpZHRoKS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBjb2xvcnMuZ3JheTgwMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUucGllY2U6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogeSArIChBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC0gQUlfVEFCTEVfUElFQ0VfV0lEVEgpIC8gMiAtIEFJX1RBQkxFX09GRlNFVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBBSV9UQUJMRV9QSUVDRV9XSURUSCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogQUlfVEFCTEVfUElFQ0VfV0lEVEgsXG4gICAgICAgICAgICAgICAgICAgICAgICByYWRpdXM6IEFJX1RBQkxFX1BJRUNFX1JBRElVUyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB4ICsgQUlfVEFCTEVfUElFQ0VfV0lEVEggKyBBSV9UQUJMRV9URVhUX0dBUCArIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX09QVElPTl9JVEVNX0ZPTlRfU0laRSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZ2V0VGV4dEVsbGlwc2lzKGRvdE1heFRleHRXaWR0aCkudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogY29sb3JzLmdyYXk4MDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBBSVRhYmxlU2VsZWN0T3B0aW9uU3R5bGUudGFnOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhUZXh0V2lkdGggPSBjb2x1bW5XaWR0aCAtIDIgKiAoQUlfVEFCTEVfQ0VMTF9QQURESU5HICsgQUlfVEFCTEVfVEFHX1BBRERJTkcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRleHRXaWR0aCwgdGV4dCB9ID0gZ2V0VGV4dEVsbGlwc2lzKG1heFRleHRXaWR0aCwgQUlfVEFCTEVfVEFHX0ZPTlRfU0laRSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgodGV4dFdpZHRoICsgMiAqIEFJX1RBQkxFX1RBR19QQURESU5HLCBBSV9UQUJMRV9DRUxMX01VTFRJX0lURU1fTUlOX1dJRFRIKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX09QVElPTl9JVEVNX0hFSUdIVCkgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IEFJX1RBQkxFX09QVElPTl9JVEVNX0hFSUdIVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGNvbG9ycy53aGl0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogQUlfVEFCTEVfT1BUSU9OX0lURU1fUkFESVVTLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogQUlfVEFCTEVfT1BUSU9OX0lURU1fUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBBSV9UQUJMRV9UQUdfRk9OVF9TSVpFLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0TWF4VGV4dFdpZHRoID0gY29sdW1uV2lkdGggLSAyICogQUlfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIEFJX1RBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIEFJX1RBQkxFX09QVElPTl9JVEVNX0ZPTlRfU0laRSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZ2V0VGV4dEVsbGlwc2lzKHRleHRNYXhUZXh0V2lkdGgpLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGU6IGNvbG9ycy5ncmF5ODAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ2VsbERhdGUocmVuZGVyOiBBSVRhYmxlUmVuZGVyLCBjdHg/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB0cmFuc2Zvcm1WYWx1ZSwgY29sdW1uV2lkdGgsIHN0eWxlIH0gPSByZW5kZXI7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IEFJVGFibGUuZ2V0Q29sb3JzKCk7XG4gICAgICAgIGxldCBjZWxsVGV4dCA9IHRyYW5zZm9ybVZhbHVlO1xuXG4gICAgICAgIGlmIChjZWxsVGV4dCA9PSBudWxsIHx8ICFfLmlzU3RyaW5nKGNlbGxUZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dE1heFdpZHRoID0gY29sdW1uV2lkdGggLSAyICogQUlfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgICAgICBjb25zdCB7IHRleHQgfSA9IHRoaXMudGV4dEVsbGlwc2lzKHsgdGV4dDogY2VsbFRleHQsIG1heFdpZHRoOiBjb2x1bW5XaWR0aCAmJiB0ZXh0TWF4V2lkdGggfSk7XG4gICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gc3R5bGU/LmNvbG9yIHx8IGNvbG9ycy5ncmF5ODAwO1xuICAgICAgICAgICAgdGhpcy50ZXh0KHtcbiAgICAgICAgICAgICAgICB4OiB4ICsgQUlfVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgICAgICAgICAgICAgIHk6IHkgKyBBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC8gMixcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogY29sb3IsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogc3R5bGU/LmZvbnRXZWlnaHQsXG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckNlbGxSYXRlKHJlbmRlcjogQUlUYWJsZVJlbmRlciwgY3R4PzogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgeSwgdHJhbnNmb3JtVmFsdWU6IF9jZWxsVmFsdWUgfSA9IHJlbmRlcjtcbiAgICAgICAgY29uc3QgbWF4ID0gNTtcbiAgICAgICAgY29uc3QgY2VsbFZhbHVlID0gKF9jZWxsVmFsdWUgYXMgUmF0ZUZpZWxkVmFsdWUpIHx8IDA7XG4gICAgICAgIGNvbnN0IHNpemUgPSBBSV9UQUJMRV9DRUxMX0VNT0pJX1NJWkU7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5BcnJheShtYXgpLmtleXMoKV0ubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbmRleCArIDE7XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdmFsdWUgPD0gY2VsbFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgaWNvblggPSBpbmRleCAqIHNpemUgKyBBSV9UQUJMRV9DRUxMX1BBRERJTkcgKyBpbmRleCAqIEFJX1RBQkxFX0NFTExfRU1PSklfUEFERElORztcbiAgICAgICAgICAgIGNvbnN0IGljb25ZID0gKEFJX1RBQkxFX1JPV19CTEFOS19IRUlHSFQgLSBzaXplKSAvIDI7XG5cbiAgICAgICAgICAgIGlmIChjdHggJiYgY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF0aCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IHggKyBpY29uWCxcbiAgICAgICAgICAgICAgICAgICAgeTogeSArIGljb25ZLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAyMixcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogU3RhckZpbGwsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6IHRoaXMuY29sb3JzLndhcmluZyxcbiAgICAgICAgICAgICAgICAgICAgc2NhbGVYOiAxLjE0LFxuICAgICAgICAgICAgICAgICAgICBzY2FsZVk6IDEuMTRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJDZWxsUHJvZ3Jlc3MocmVuZGVyOiBBSVRhYmxlUmVuZGVyLCBjdHg/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB0cmFuc2Zvcm1WYWx1ZSwgY29sdW1uV2lkdGgsIHN0eWxlIH0gPSByZW5kZXI7XG4gICAgICAgIGNvbnN0IGNvbG9ycyA9IEFJVGFibGUuZ2V0Q29sb3JzKCk7XG4gICAgICAgIGNvbnN0IGNlbGxUZXh0ID0gdHJhbnNmb3JtVmFsdWU7XG5cbiAgICAgICAgaWYgKGNlbGxUZXh0ID09IG51bGwgfHwgIV8uaXNOdW1iZXIoY2VsbFRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aWR0aCA9IGNvbHVtbldpZHRoIC0gMiAqIEFJX1RBQkxFX0NFTExfUEFERElORyAtIEFJX1RBQkxFX1BST0dSRVNTX1RFWFRfV2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IEFJX1RBQkxFX1BST0dSRVNTX0JBUl9IRUlHSFQ7XG4gICAgICAgIGNvbnN0IHRleHRIZWlnaHQgPSBBSV9UQUJMRV9DT01NT05fRk9OVF9TSVpFO1xuICAgICAgICBjb25zdCBvZmZzZXRYID0gQUlfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gKEFJX1RBQkxFX1JPV19CTEFOS19IRUlHSFQgLSBBSV9UQUJMRV9QUk9HUkVTU19CQVJfSEVJR0hUKSAvIDI7XG4gICAgICAgIGNvbnN0IHRleHRPZmZzZXRZID0gKEFJX1RBQkxFX1JPV19CTEFOS19IRUlHSFQgLSB0ZXh0SGVpZ2h0KSAvIDI7XG5cbiAgICAgICAgLy8g57uY5Yi26IOM5pmvXG4gICAgICAgIHRoaXMucmVjdCh7XG4gICAgICAgICAgICB4OiB4ICsgb2Zmc2V0WCxcbiAgICAgICAgICAgIHk6IHkgKyBvZmZzZXRZLFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICByYWRpdXM6IEFJX1RBQkxFX1BST0dSRVNTX0JBUl9SQURJVVMsXG4gICAgICAgICAgICBmaWxsOiBjb2xvcnMuZ3JheTIwMFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDorqHnrpflubbnu5jliLbov5vluqZcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3NXaWR0aCA9ICh0cmFuc2Zvcm1WYWx1ZSAvIDEwMCkgKiB3aWR0aDtcbiAgICAgICAgdGhpcy5yZWN0KHtcbiAgICAgICAgICAgIHg6IHggKyBvZmZzZXRYLFxuICAgICAgICAgICAgeTogeSArIG9mZnNldFksXG4gICAgICAgICAgICB3aWR0aDogcHJvZ3Jlc3NXaWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHJhZGl1czogQUlfVEFCTEVfUFJPR1JFU1NfQkFSX1JBRElVUyxcbiAgICAgICAgICAgIGZpbGw6IGNvbG9ycy5zdWNjZXNzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGV4dCh7XG4gICAgICAgICAgICB4OiB4ICsgb2Zmc2V0WCArIHdpZHRoICsgQUlfVEFCTEVfVEVYVF9HQVAsXG4gICAgICAgICAgICB5OiB5ICsgdGV4dE9mZnNldFksXG4gICAgICAgICAgICB0ZXh0OiBgJHt0cmFuc2Zvcm1WYWx1ZX0lYCxcbiAgICAgICAgICAgIGZpbGxTdHlsZTogY29sb3JzLmdyYXk4MDBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJDZWxsTWVtYmVyKHJlbmRlcjogQUlUYWJsZVJlbmRlciwgY3R4PzogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsgcmVmZXJlbmNlcywgeCwgeSwgZmllbGQsIHRyYW5zZm9ybVZhbHVlOiBfY2VsbFZhbHVlLCByb3dIZWlnaHQsIGNvbHVtbldpZHRoLCBpc0FjdGl2ZSB9ID0gcmVuZGVyO1xuICAgICAgICBjb25zdCBjZWxsVmFsdWUgPSBfY2VsbFZhbHVlO1xuXG4gICAgICAgIGlmICghY2VsbFZhbHVlPy5sZW5ndGggfHwgIXJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGZpZWxkLnNldHRpbmdzIGFzIE1lbWJlclNldHRpbmdzO1xuICAgICAgICBjb25zdCBhdmF0YXJTaXplID0gQUlfVEFCTEVfTUVNQkVSX0FWQVRBUl9TSVpFO1xuICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gQUlfVEFCTEVfQ0VMTF9NRU1CRVJfSVRFTV9IRUlHSFQ7XG4gICAgICAgIGNvbnN0IGlzT3BlcmF0aW5nID0gaXNBY3RpdmU7XG4gICAgICAgIGNvbnN0IGlzTXVsdGkgPSBzZXR0aW5ncz8uaXNfbXVsdGlwbGU7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRYID0gQUlfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgICAgICBsZXQgY3VycmVudFkgPSAoQUlfVEFCTEVfUk9XX0JMQU5LX0hFSUdIVCAtIGF2YXRhclNpemUpIC8gMjtcbiAgICAgICAgY29uc3QgaXRlbU90aGVyV2lkdGggPSBhdmF0YXJTaXplICsgQUlfVEFCTEVfTUVNQkVSX0lURU1fUEFERElOR19SSUdIVCArIEFJX1RBQkxFX01FTUJFUl9JVEVNX0FWQVRBUl9NQVJHSU5fUklHSFQ7XG4gICAgICAgIGNvbnN0IG1heEhlaWdodCA9IGlzQWN0aXZlID8gMTMwIC0gQUlfVEFCTEVfQ0VMTF9NVUxUSV9QQURESU5HX1RPUCA6IHJvd0hlaWdodCAtIEFJX1RBQkxFX0NFTExfTVVMVElfUEFERElOR19UT1A7XG4gICAgICAgIGNvbnN0IG1heFRleHRXaWR0aCA9IGlzT3BlcmF0aW5nXG4gICAgICAgICAgICA/IGNvbHVtbldpZHRoIC0gMiAqIEFJX1RBQkxFX0NFTExfUEFERElORyAtIGl0ZW1PdGhlcldpZHRoIC0gQUlfVEFCTEVfQ0VMTF9ERUxFVEVfSVRFTV9CVVRUT05fU0laRSAtIDEyXG4gICAgICAgICAgICA6IGNvbHVtbldpZHRoIC0gMiAqIEFJX1RBQkxFX0NFTExfUEFERElORyAtIGl0ZW1PdGhlcldpZHRoO1xuXG4gICAgICAgIGNvbnN0IGxpc3RDb3VudCA9IGNlbGxWYWx1ZS5sZW5ndGg7XG4gICAgICAgIGxldCBpc092ZXJmbG93ID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpc3RDb3VudDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgdXNlckluZm8gPSByZWZlcmVuY2VzPy5tZW1iZXJzW2NlbGxWYWx1ZVtpbmRleF1dO1xuICAgICAgICAgICAgaWYgKCF1c2VySW5mbykgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgdWlkLCBkaXNwbGF5X25hbWUsIGF2YXRhciB9ID0gdXNlckluZm87XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gQUlUYWJsZU1lbWJlclR5cGUubWVtYmVyO1xuICAgICAgICAgICAgY29uc3QgaXRlbVdpZHRoID0gQUlUYWJsZUF2YXRhclNpemUuc2l6ZTI0ICsgKGlzTXVsdGkgPyBBSV9UQUJMRV9DRUxMX01FTUJFUl9JVEVNX1BBRERJTkcgOiAwKTtcblxuICAgICAgICAgICAgY3VycmVudFggPSBBSV9UQUJMRV9DRUxMX1BBRERJTkcgKyBpbmRleCAqIGl0ZW1XaWR0aDtcblxuICAgICAgICAgICAgbGV0IHJlYWxNYXhUZXh0V2lkdGggPSBtYXhUZXh0V2lkdGggPCAwID8gMCA6IG1heFRleHRXaWR0aDtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBpc09wZXJhdGluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGluZ01heFdpZHRoID0gbWF4VGV4dFdpZHRoIC0gKEFJX1RBQkxFX0NFTExfQUREX0lURU1fQlVUVE9OX1NJWkUgKyA0KTtcbiAgICAgICAgICAgICAgICAvLyBpdGVtIE5vIHNwYWNlIHRvIGRpc3BsYXksIHRoZW4gcGVyZm9ybSBhIGxpbmUgZmVlZFxuICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpbmdNYXhXaWR0aCA8PSAyMCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50WCA9IEFJX1RBQkxFX0NFTExfUEFERElORztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFkgKz0gQUlfVEFCTEVfT1BUSU9OX0lURU1fSEVJR0hUICsgQUlfVEFCTEVfQ0VMTF9NVUxUSV9JVEVNX01BUkdJTl9UT1A7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhbE1heFRleHRXaWR0aCA9IG9wZXJhdGluZ01heFdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGlzTW9yZSA9IGN1cnJlbnRYICsgaXRlbVdpZHRoID4gY29sdW1uV2lkdGggLSAyICogQUlfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgICAgICAgICAgaWYgKGNvbHVtbldpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyDlnKjpnZ7mtLvliqjnirbmgIHkuIvvvIzlvZPotoXlh7rliJflrr3ml7bvvIzkuI3kvJrmuLLmn5PlkI7nu63lhoXlrrlcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWN0aXZlICYmIGN1cnJlbnRYID49IGNvbHVtbldpZHRoIC0gMiAqIEFJX1RBQkxFX0NFTExfUEFERElORykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5LiN5piv6Z2e5rS75Yqo54q25oCB55qE5pyA5ZCO5LiA6KGM77yM5YiZ5o2i6KGM5riy5p+T5rqi5Ye65YaF5a65XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FjdGl2ZSAmJiBjdXJyZW50WCA+IGNvbHVtbldpZHRoIC0gMiAqIEFJX1RBQkxFX0NFTExfUEFERElORykge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50WCA9IEFJX1RBQkxFX0NFTExfUEFERElORztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlICYmIGN1cnJlbnRYICsgaXRlbVdpZHRoID4gY29sdW1uV2lkdGggLSBBSV9UQUJMRV9DRUxMX1BBRERJTkcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFggPSBBSV9UQUJMRV9DRUxMX1BBRERJTkc7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRZICs9IGl0ZW1IZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSAmJiBjdXJyZW50WSA+PSBtYXhIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3R4ICYmICFpc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXZhdGFyKHtcbiAgICAgICAgICAgICAgICAgICAgeDogeCArIGN1cnJlbnRYLFxuICAgICAgICAgICAgICAgICAgICB5OiB5ICsgY3VycmVudFksXG4gICAgICAgICAgICAgICAgICAgIHVybDogYXZhdGFyISxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHVpZCEsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRBdmF0YXJTaG9ydE5hbWUoZGlzcGxheV9uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogZ2V0QXZhdGFyQmdDb2xvcihkaXNwbGF5X25hbWUhKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogQUlUYWJsZUF2YXRhclR5cGUubWVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBBSVRhYmxlQXZhdGFyU2l6ZS5zaXplMjRcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChpc01vcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMC4zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIGN1cnJlbnRYLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogeSArIGN1cnJlbnRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IEFJVGFibGVBdmF0YXJTaXplLnNpemUyNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogQUlUYWJsZUF2YXRhclNpemUuc2l6ZTI0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzOiAyNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IHRoaXMuY29sb3JzLmJsYWNrXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgeDogeCArIGN1cnJlbnRYICsgRk9OVF9TSVpFX1NNIC8gMixcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHkgKyBBSV9UQUJMRV9ST1dfQkxBTktfSEVJR0hUIC8gMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogdGhpcy5jb2xvcnMud2hpdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogRk9OVF9TSVpFX1NNLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogYCske2xpc3RDb3VudCAtIGluZGV4IC0gMX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogREVGQVVMVF9URVhUX1ZFUlRJQ0FMX0FMSUdOX01JRERMRVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBjZWxsRHJhd2VyID0gbmV3IENlbGxEcmF3ZXIoKTtcbiJdfQ==
|