UNPKG

@blackbaud/angular-tree-component

Version:

A simple yet powerful tree component for Angular 14+

150 lines 28.2 kB
import { KEYS } from '../constants/keys'; export const TREE_ACTIONS = { TOGGLE_ACTIVE: (tree, node, $event) => node && node.toggleActivated(), TOGGLE_ACTIVE_MULTI: (tree, node, $event) => node && node.toggleActivated(true), TOGGLE_SELECTED: (tree, node, $event) => node && node.toggleSelected(), ACTIVATE: (tree, node, $event) => node.setIsActive(true), DEACTIVATE: (tree, node, $event) => node.setIsActive(false), SELECT: (tree, node, $event) => node.setIsSelected(true), DESELECT: (tree, node, $event) => node.setIsSelected(false), FOCUS: (tree, node, $event) => node.focus(), TOGGLE_EXPANDED: (tree, node, $event) => node.hasChildren && node.toggleExpanded(), EXPAND: (tree, node, $event) => node.expand(), COLLAPSE: (tree, node, $event) => node.collapse(), DRILL_DOWN: (tree, node, $event) => tree.focusDrillDown(), DRILL_UP: (tree, node, $event) => tree.focusDrillUp(), NEXT_NODE: (tree, node, $event) => tree.focusNextNode(), PREVIOUS_NODE: (tree, node, $event) => tree.focusPreviousNode(), MOVE_NODE: (tree, node, $event, { from, to }) => { // default action assumes from = node, to = {parent, index} if ($event.ctrlKey) { tree.copyNode(from, to); } else { tree.moveNode(from, to); } } }; const defaultActionMapping = { mouse: { click: TREE_ACTIONS.TOGGLE_ACTIVE, dblClick: null, contextMenu: null, expanderClick: TREE_ACTIONS.TOGGLE_EXPANDED, checkboxClick: TREE_ACTIONS.TOGGLE_SELECTED, drop: TREE_ACTIONS.MOVE_NODE }, keys: { [KEYS.RIGHT]: TREE_ACTIONS.DRILL_DOWN, [KEYS.LEFT]: TREE_ACTIONS.DRILL_UP, [KEYS.DOWN]: TREE_ACTIONS.NEXT_NODE, [KEYS.UP]: TREE_ACTIONS.PREVIOUS_NODE, [KEYS.SPACE]: TREE_ACTIONS.TOGGLE_ACTIVE, [KEYS.ENTER]: TREE_ACTIONS.TOGGLE_ACTIVE } }; export class TreeOptions { constructor(options = {}) { this.options = options; this.actionMapping = { mouse: { click: this.options?.actionMapping?.mouse?.click ?? defaultActionMapping.mouse.click, dblClick: this.options?.actionMapping?.mouse?.dblClick ?? defaultActionMapping.mouse.dblClick, contextMenu: this.options?.actionMapping?.mouse?.contextMenu ?? defaultActionMapping.mouse.contextMenu, expanderClick: this.options?.actionMapping?.mouse?.expanderClick ?? defaultActionMapping.mouse.expanderClick, checkboxClick: this.options?.actionMapping?.mouse?.checkboxClick ?? defaultActionMapping.mouse.checkboxClick, drop: this.options?.actionMapping?.mouse?.drop ?? defaultActionMapping.mouse.drop, dragStart: this.options?.actionMapping?.mouse?.dragStart ?? undefined, drag: this.options?.actionMapping?.mouse?.drag ?? undefined, dragEnd: this.options?.actionMapping?.mouse?.dragEnd ?? undefined, dragOver: this.options?.actionMapping?.mouse?.dragOver ?? undefined, dragLeave: this.options?.actionMapping?.mouse?.dragLeave ?? undefined, dragEnter: this.options?.actionMapping?.mouse?.dragEnter ?? undefined, mouseOver: this.options?.actionMapping?.mouse?.mouseOver ?? undefined, mouseOut: this.options?.actionMapping?.mouse?.mouseOut ?? undefined, }, keys: { [KEYS.RIGHT]: TREE_ACTIONS.DRILL_DOWN, [KEYS.LEFT]: TREE_ACTIONS.DRILL_UP, [KEYS.DOWN]: TREE_ACTIONS.NEXT_NODE, [KEYS.UP]: TREE_ACTIONS.PREVIOUS_NODE, [KEYS.SPACE]: TREE_ACTIONS.TOGGLE_ACTIVE, [KEYS.ENTER]: TREE_ACTIONS.TOGGLE_ACTIVE } }; if (this.options?.actionMapping?.keys) { this.actionMapping.keys = { ...this.actionMapping.keys, ...this.options.actionMapping.keys }; } if (options.rtl) { this.actionMapping.keys[KEYS.RIGHT] = options.actionMapping?.keys[KEYS.RIGHT] || TREE_ACTIONS.DRILL_UP; this.actionMapping.keys[KEYS.LEFT] = options.actionMapping?.keys[KEYS.LEFT] || TREE_ACTIONS.DRILL_DOWN; } } get hasChildrenField() { return this.options.hasChildrenField || 'hasChildren'; } get childrenField() { return this.options.childrenField || 'children'; } get displayField() { return this.options.displayField || 'name'; } get idField() { return this.options.idField || 'id'; } get isExpandedField() { return this.options.isExpandedField || 'isExpanded'; } get getChildren() { return this.options.getChildren; } get levelPadding() { return this.options.levelPadding || 0; } get useVirtualScroll() { return this.options.useVirtualScroll; } get animateExpand() { return this.options.animateExpand; } get animateSpeed() { return this.options.animateSpeed || 1; } get animateAcceleration() { return this.options.animateAcceleration || 1.2; } get scrollOnActivate() { return this.options.scrollOnActivate === undefined ? true : this.options.scrollOnActivate; } get rtl() { return !!this.options.rtl; } get rootId() { return this.options.rootId; } get useCheckbox() { return this.options.useCheckbox; } get useTriState() { return this.options.useTriState === undefined ? true : this.options.useTriState; } get scrollContainer() { return this.options.scrollContainer; } get allowDragoverStyling() { return this.options.allowDragoverStyling === undefined ? true : this.options.allowDragoverStyling; } getNodeClone(node) { if (this.options.getNodeClone) { return this.options.getNodeClone(node); } // remove id from clone // keeping ie11 compatibility const nodeClone = Object.assign({}, node.data); if (nodeClone.id) { delete nodeClone.id; } return nodeClone; } allowDrop(element, to, $event) { if (this.options.allowDrop instanceof Function) { return this.options.allowDrop(element, to, $event); } else { return this.options.allowDrop === undefined ? true : this.options.allowDrop; } } allowDrag(node) { if (this.options.allowDrag instanceof Function) { return this.options.allowDrag(node); } else { return this.options.allowDrag; } } nodeClass(node) { return this.options.nodeClass ? this.options.nodeClass(node) : ''; } nodeHeight(node) { if (node.data.virtual) { return 0; } let nodeHeight = this.options.nodeHeight || 22; if (typeof nodeHeight === 'function') { nodeHeight = nodeHeight(node); } // account for drop slots: return nodeHeight + (node.index === 0 ? 2 : 1) * this.dropSlotHeight; } get dropSlotHeight() { return typeof this.options.dropSlotHeight === 'number' ? this.options.dropSlotHeight : 2; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1vcHRpb25zLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10cmVlLWNvbXBvbmVudC9zcmMvbGliL21vZGVscy90cmVlLW9wdGlvbnMubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT3pDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixhQUFhLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7SUFDL0YsbUJBQW1CLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO0lBQ3pHLGVBQWUsRUFBRSxDQUFDLElBQWUsRUFBRSxJQUFjLEVBQUUsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtJQUNoRyxRQUFRLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDbEYsVUFBVSxFQUFFLENBQUMsSUFBZSxFQUFFLElBQWMsRUFBRSxNQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ3JGLE1BQU0sRUFBRSxDQUFDLElBQWUsRUFBRSxJQUFjLEVBQUUsTUFBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUNsRixRQUFRLEVBQUUsQ0FBQyxJQUFlLEVBQUUsSUFBYyxFQUFFLE1BQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENB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U0FDL0I7UUFFRCwwQkFBMEI7UUFDMUIsT0FBTyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJy4vdHJlZS1ub2RlLm1vZGVsJztcbmltcG9ydCB7IFRyZWVNb2RlbCB9IGZyb20gJy4vdHJlZS5tb2RlbCc7XG5pbXBvcnQgeyBLRVlTIH0gZnJvbSAnLi4vY29uc3RhbnRzL2tleXMnO1xuaW1wb3J0IHsgSVRyZWVPcHRpb25zIH0gZnJvbSAnLi4vZGVmcy9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElBY3Rpb25IYW5kbGVyIHtcbiAgKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55LCAuLi5yZXN0KTtcbn1cblxuZXhwb3J0IGNvbnN0IFRSRUVfQUNUSU9OUyA9IHtcbiAgVE9HR0xFX0FDVElWRTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlICYmIG5vZGUudG9nZ2xlQWN0aXZhdGVkKCksXG4gIFRPR0dMRV9BQ1RJVkVfTVVMVEk6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZSAmJiBub2RlLnRvZ2dsZUFjdGl2YXRlZCh0cnVlKSxcbiAgVE9HR0xFX1NFTEVDVEVEOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUgJiYgbm9kZS50b2dnbGVTZWxlY3RlZCgpLFxuICBBQ1RJVkFURTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLnNldElzQWN0aXZlKHRydWUpLFxuICBERUFDVElWQVRFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuc2V0SXNBY3RpdmUoZmFsc2UpLFxuICBTRUxFQ1Q6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gbm9kZS5zZXRJc1NlbGVjdGVkKHRydWUpLFxuICBERVNFTEVDVDogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLnNldElzU2VsZWN0ZWQoZmFsc2UpLFxuICBGT0NVUzogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLmZvY3VzKCksXG4gIFRPR0dMRV9FWFBBTkRFRDogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiBub2RlLmhhc0NoaWxkcmVuICYmIG5vZGUudG9nZ2xlRXhwYW5kZWQoKSxcbiAgRVhQQU5EOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuZXhwYW5kKCksXG4gIENPTExBUFNFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IG5vZGUuY29sbGFwc2UoKSxcbiAgRFJJTExfRE9XTjogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiB0cmVlLmZvY3VzRHJpbGxEb3duKCksXG4gIERSSUxMX1VQOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnkpID0+IHRyZWUuZm9jdXNEcmlsbFVwKCksXG4gIE5FWFRfTk9ERTogKHRyZWU6IFRyZWVNb2RlbCwgbm9kZTogVHJlZU5vZGUsICRldmVudDogYW55KSA9PiAgdHJlZS5mb2N1c05leHROb2RlKCksXG4gIFBSRVZJT1VTX05PREU6ICh0cmVlOiBUcmVlTW9kZWwsIG5vZGU6IFRyZWVOb2RlLCAkZXZlbnQ6IGFueSkgPT4gIHRyZWUuZm9jdXNQcmV2aW91c05vZGUoKSxcbiAgTU9WRV9OT0RFOiAodHJlZTogVHJlZU1vZGVsLCBub2RlOiBUcmVlTm9kZSwgJGV2ZW50OiBhbnksIHtmcm9tICwgdG99OiB7ZnJvbTogYW55LCB0bzogYW55fSkgPT4ge1xuICAgIC8vIGRlZmF1bHQgYWN0aW9uIGFzc3VtZXMgZnJvbSA9IG5vZGUsIHRvID0ge3BhcmVudCwgaW5kZXh9XG4gICAgaWYgKCRldmVudC5jdHJsS2V5KSB7XG4gICAgICB0cmVlLmNvcHlOb2RlKGZyb20sIHRvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZS5tb3ZlTm9kZShmcm9tLCB0byk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBkZWZhdWx0QWN0aW9uTWFwcGluZzogSUFjdGlvbk1hcHBpbmcgPSB7XG4gIG1vdXNlOiB7XG4gICAgY2xpY2s6IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFLFxuICAgIGRibENsaWNrOiBudWxsLFxuICAgIGNvbnRleHRNZW51OiBudWxsLFxuICAgIGV4cGFuZGVyQ2xpY2s6IFRSRUVfQUNUSU9OUy5UT0dHTEVfRVhQQU5ERUQsXG4gICAgY2hlY2tib3hDbGljazogVFJFRV9BQ1RJT05TLlRPR0dMRV9TRUxFQ1RFRCxcbiAgICBkcm9wOiBUUkVFX0FDVElPTlMuTU9WRV9OT0RFXG4gIH0sXG4gIGtleXM6IHtcbiAgICBbS0VZUy5SSUdIVF06IFRSRUVfQUNUSU9OUy5EUklMTF9ET1dOLFxuICAgIFtLRVlTLkxFRlRdOiBUUkVFX0FDVElPTlMuRFJJTExfVVAsXG4gICAgW0tFWVMuRE9XTl06IFRSRUVfQUNUSU9OUy5ORVhUX05PREUsXG4gICAgW0tFWVMuVVBdOiBUUkVFX0FDVElPTlMuUFJFVklPVVNfTk9ERSxcbiAgICBbS0VZUy5TUEFDRV06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFLFxuICAgIFtLRVlTLkVOVEVSXTogVFJFRV9BQ1RJT05TLlRPR0dMRV9BQ1RJVkVcbiAgfVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aW9uTWFwcGluZyB7XG4gIG1vdXNlPzoge1xuICAgIGNsaWNrPzogSUFjdGlvbkhhbmRsZXIsXG4gICAgZGJsQ2xpY2s/OiBJQWN0aW9uSGFuZGxlcixcbiAgICBjb250ZXh0TWVudT86IElBY3Rpb25IYW5kbGVyLFxuICAgIGV4cGFuZGVyQ2xpY2s/OiBJQWN0aW9uSGFuZGxlcixcbiAgICBjaGVja2JveENsaWNrPzogSUFjdGlvbkhhbmRsZXIsXG4gICAgZHJhZ1N0YXJ0PzogSUFjdGlvbkhhbmRsZXIsXG4gICAgZHJhZz86IElBY3Rpb25IYW5kbGVyLFxuICAgIGRyYWdFbmQ/OiBJQWN0aW9uSGFuZGxlcixcbiAgICBkcmFnT3Zlcj86IElBY3Rpb25IYW5kbGVyLFxuICAgIGRyYWdMZWF2ZT86IElBY3Rpb25IYW5kbGVyLFxuICAgIGRyYWdFbnRlcj86IElBY3Rpb25IYW5kbGVyLFxuICAgIGRyb3A/OiBJQWN0aW9uSGFuZGxlcixcbiAgICBtb3VzZU92ZXI/OiBJQWN0aW9uSGFuZGxlcixcbiAgICBtb3VzZU91dD86IElBY3Rpb25IYW5kbGVyXG4gIH07XG4gIGtleXM/OiB7XG4gICAgW2tleTogbnVtYmVyXTogSUFjdGlvbkhhbmRsZXJcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRyZWVPcHRpb25zIHtcbiAgZ2V0IGhhc0NoaWxkcmVuRmllbGQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5oYXNDaGlsZHJlbkZpZWxkIHx8ICdoYXNDaGlsZHJlbic7IH1cbiAgZ2V0IGNoaWxkcmVuRmllbGQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGlsZHJlbkZpZWxkIHx8ICdjaGlsZHJlbic7IH1cbiAgZ2V0IGRpc3BsYXlGaWVsZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmRpc3BsYXlGaWVsZCB8fCAnbmFtZSc7IH1cbiAgZ2V0IGlkRmllbGQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5pZEZpZWxkIHx8ICdpZCc7IH1cbiAgZ2V0IGlzRXhwYW5kZWRGaWVsZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcHRpb25zLmlzRXhwYW5kZWRGaWVsZCB8fCAnaXNFeHBhbmRlZCc7IH1cbiAgZ2V0IGdldENoaWxkcmVuKCk6IGFueSB7IHJldHVybiB0aGlzLm9wdGlvbnMuZ2V0Q2hpbGRyZW47IH1cbiAgZ2V0IGxldmVsUGFkZGluZygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5vcHRpb25zLmxldmVsUGFkZGluZyB8fCAwOyB9XG4gIGdldCB1c2VWaXJ0dWFsU2Nyb2xsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLnVzZVZpcnR1YWxTY3JvbGw7IH1cbiAgZ2V0IGFuaW1hdGVFeHBhbmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm9wdGlvbnMuYW5pbWF0ZUV4cGFuZDsgfVxuICBnZXQgYW5pbWF0ZVNwZWVkKCk6IG51bWJlciB7IHJldHVybiB0aGlzLm9wdGlvbnMuYW5pbWF0ZVNwZWVkIHx8IDE7IH1cbiAgZ2V0IGFuaW1hdGVBY2NlbGVyYXRpb24oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5hbmltYXRlQWNjZWxlcmF0aW9uIHx8IDEuMjsgfVxuICBnZXQgc2Nyb2xsT25BY3RpdmF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3B0aW9ucy5zY3JvbGxPbkFjdGl2YXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5vcHRpb25zLnNjcm9sbE9uQWN0aXZhdGU7IH1cbiAgZ2V0IHJ0bCgpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5vcHRpb25zLnJ0bDsgfVxuICBnZXQgcm9vdElkKCk6IGFueSB7cmV0dXJuIHRoaXMub3B0aW9ucy5yb290SWQ7IH1cbiAgZ2V0IHVzZUNoZWNrYm94KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLnVzZUNoZWNrYm94OyB9XG4gIGdldCB1c2VUcmlTdGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMub3B0aW9ucy51c2VUcmlTdGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMub3B0aW9ucy51c2VUcmlTdGF0ZTsgfVxuICBnZXQgc2Nyb2xsQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMub3B0aW9ucy5zY3JvbGxDb250YWluZXI7IH1cbiAgZ2V0IGFsbG93RHJhZ292ZXJTdHlsaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJhZ292ZXJTdHlsaW5nID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5vcHRpb25zLmFsbG93RHJhZ292ZXJTdHlsaW5nOyB9XG4gIGFjdGlvbk1hcHBpbmc6IElBY3Rpb25NYXBwaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3B0aW9uczogSVRyZWVPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmFjdGlvbk1hcHBpbmcgPSB7XG4gICAgICBtb3VzZToge1xuICAgICAgICBjbGljazogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uY2xpY2sgPz8gZGVmYXVsdEFjdGlvbk1hcHBpbmcubW91c2UuY2xpY2ssXG4gICAgICAgIGRibENsaWNrOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5kYmxDbGljayA/PyBkZWZhdWx0QWN0aW9uTWFwcGluZy5tb3VzZS5kYmxDbGljayxcbiAgICAgICAgY29udGV4dE1lbnU6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmNvbnRleHRNZW51ID8/IGRlZmF1bHRBY3Rpb25NYXBwaW5nLm1vdXNlLmNvbnRleHRNZW51LFxuICAgICAgICBleHBhbmRlckNsaWNrOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5leHBhbmRlckNsaWNrID8/IGRlZmF1bHRBY3Rpb25NYXBwaW5nLm1vdXNlLmV4cGFuZGVyQ2xpY2ssXG4gICAgICAgIGNoZWNrYm94Q2xpY2s6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmNoZWNrYm94Q2xpY2sgPz8gZGVmYXVsdEFjdGlvbk1hcHBpbmcubW91c2UuY2hlY2tib3hDbGljayxcbiAgICAgICAgZHJvcDogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8uZHJvcCA/PyBkZWZhdWx0QWN0aW9uTWFwcGluZy5tb3VzZS5kcm9wLFxuICAgICAgICBkcmFnU3RhcnQ6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdTdGFydCA/PyB1bmRlZmluZWQsXG4gICAgICAgIGRyYWc6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWcgPz8gdW5kZWZpbmVkLFxuICAgICAgICBkcmFnRW5kOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5kcmFnRW5kID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZHJhZ092ZXI6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdPdmVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZHJhZ0xlYXZlOiB0aGlzLm9wdGlvbnM/LmFjdGlvbk1hcHBpbmc/Lm1vdXNlPy5kcmFnTGVhdmUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBkcmFnRW50ZXI6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/LmRyYWdFbnRlciA/PyB1bmRlZmluZWQsXG4gICAgICAgIG1vdXNlT3ZlcjogdGhpcy5vcHRpb25zPy5hY3Rpb25NYXBwaW5nPy5tb3VzZT8ubW91c2VPdmVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgbW91c2VPdXQ6IHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ubW91c2U/Lm1vdXNlT3V0ID8/IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBrZXlzOiB7XG4gICAgICAgIFtLRVlTLlJJR0hUXTogVFJFRV9BQ1RJT05TLkRSSUxMX0RPV04sXG4gICAgICAgIFtLRVlTLkxFRlRdOiBUUkVFX0FDVElPTlMuRFJJTExfVVAsXG4gICAgICAgIFtLRVlTLkRPV05dOiBUUkVFX0FDVElPTlMuTkVYVF9OT0RFLFxuICAgICAgICBbS0VZUy5VUF06IFRSRUVfQUNUSU9OUy5QUkVWSU9VU19OT0RFLFxuICAgICAgICBbS0VZUy5TUEFDRV06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFLFxuICAgICAgICBbS0VZUy5FTlRFUl06IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYWN0aW9uTWFwcGluZz8ua2V5cykge1xuICAgICAgdGhpcy5hY3Rpb25NYXBwaW5nLmtleXMgPSB7XG4gICAgICAgIC4uLnRoaXMuYWN0aW9uTWFwcGluZy5rZXlzLFxuICAgICAgICAuLi50aGlzLm9wdGlvbnMuYWN0aW9uTWFwcGluZy5rZXlzXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucnRsKSB7XG4gICAgICB0aGlzLmFjdGlvbk1hcHBpbmcua2V5c1tLRVlTLlJJR0hUXSA9IDxJQWN0aW9uSGFuZGxlcj5vcHRpb25zLmFjdGlvbk1hcHBpbmc/LmtleXNbS0VZUy5SSUdIVF0gfHwgVFJFRV9BQ1RJT05TLkRSSUxMX1VQO1xuICAgICAgdGhpcy5hY3Rpb25NYXBwaW5nLmtleXNbS0VZUy5MRUZUXSA9IDxJQWN0aW9uSGFuZGxlcj5vcHRpb25zLmFjdGlvbk1hcHBpbmc/LmtleXNbS0VZUy5MRUZUXSB8fCBUUkVFX0FDVElPTlMuRFJJTExfRE9XTjtcbiAgICB9XG4gIH1cblxuICBnZXROb2RlQ2xvbmUobm9kZTogVHJlZU5vZGUpOiBhbnkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZ2V0Tm9kZUNsb25lKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmdldE5vZGVDbG9uZShub2RlKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgaWQgZnJvbSBjbG9uZVxuICAgIC8vIGtlZXBpbmcgaWUxMSBjb21wYXRpYmlsaXR5XG4gICAgY29uc3Qgbm9kZUNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgbm9kZS5kYXRhKTtcbiAgICBpZiAobm9kZUNsb25lLmlkKSB7XG4gICAgICBkZWxldGUgbm9kZUNsb25lLmlkO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZUNsb25lO1xuICB9XG5cbiAgYWxsb3dEcm9wKGVsZW1lbnQsIHRvLCAkZXZlbnQ/KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AoZWxlbWVudCwgdG8sICRldmVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hbGxvd0Ryb3AgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLm9wdGlvbnMuYWxsb3dEcm9wO1xuICAgIH1cbiAgfVxuXG4gIGFsbG93RHJhZyhub2RlOiBUcmVlTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEcmFnIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYWxsb3dEcmFnKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFsbG93RHJhZztcbiAgICB9XG4gIH1cblxuICBub2RlQ2xhc3Mobm9kZTogVHJlZU5vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubm9kZUNsYXNzID8gdGhpcy5vcHRpb25zLm5vZGVDbGFzcyhub2RlKSA6ICcnO1xuICB9XG5cbiAgbm9kZUhlaWdodChub2RlOiBUcmVlTm9kZSk6IG51bWJlciB7XG4gICAgaWYgKG5vZGUuZGF0YS52aXJ0dWFsKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgbm9kZUhlaWdodCA9IHRoaXMub3B0aW9ucy5ub2RlSGVpZ2h0IHx8IDIyO1xuXG4gICAgaWYgKHR5cGVvZiBub2RlSGVpZ2h0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBub2RlSGVpZ2h0ID0gbm9kZUhlaWdodChub2RlKTtcbiAgICB9XG5cbiAgICAvLyBhY2NvdW50IGZvciBkcm9wIHNsb3RzOlxuICAgIHJldHVybiBub2RlSGVpZ2h0ICsgKG5vZGUuaW5kZXggPT09IDAgPyAgMiA6IDEpICogdGhpcy5kcm9wU2xvdEhlaWdodDtcbiAgfVxuXG4gIGdldCBkcm9wU2xvdEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5vcHRpb25zLmRyb3BTbG90SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHRoaXMub3B0aW9ucy5kcm9wU2xvdEhlaWdodCA6IDI7XG4gIH1cbn1cbiJdfQ==