verben-workflow-ui 0.5.47 → 0.5.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1036,11 +1036,11 @@ export class DesignerCanvasComponent {
1036
1036
  });
1037
1037
  }
1038
1038
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerCanvasComponent, deps: [{ token: i1.WorkflowDesignerState }, { token: i2.WorkflowDataService }], target: i0.ɵɵFactoryTarget.Component });
1039
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: { selectedTool: "selectedTool" }, outputs: { clickedPosition: "clickedPosition", subflowSelected: "subflowSelected", showStageDialog: "showStageDialog", stagePropertiesUpdated: "stagePropertiesUpdated", actionPropertiesUpdated: "actionPropertiesUpdated" }, host: { listeners: { "window:mouseup": "onWindowMouseUp($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <clipPath [attr.id]=\"'swimlane-clip-' + swimlane.order\">\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" height=\"263\" />\n </clipPath>\n }\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- <g\n [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\"\n [attr.clip-path]=\"'url(#swimlane-clip-' + swimlane.order + ')'\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n </g> -->\n\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container - remove stroke to make it purely background -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\"\n stroke=\"none\"\n ></rect>\n\n <!-- Vertical swimlane label on the left -->\n <g class=\"swimlane-label\">\n <!-- Purple background for the label -->\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"43\"\n height=\"215\"\n rx=\"10.5\"\n fill=\"white\"\n stroke=\"#D36CFF\"\n ></rect>\n\n <!-- Plus button at the top -->\n <g\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"12.5\"\n y=\"10\"\n width=\"18\"\n height=\"18\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n ></rect>\n\n <path\n d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n fill=\"#0000FF\"\n class=\"plus-icon\"\n style=\"cursor: pointer\"\n ></path>\n </g>\n\n <!-- Swimlane label -->\n <text\n x=\"22\"\n y=\"106\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 100)\"\n >\n {{\n swimlane.label.length > 12\n ? swimlane.label.substring(0, 10) + \"...\"\n : swimlane.label\n }}\n </text>\n\n <!-- Tag count indicator at the bottom -->\n <rect\n x=\"11.5\"\n y=\"187\"\n width=\"21\"\n height=\"19\"\n rx=\"9.5\"\n fill=\"#9E9E9E\"\n ></rect>\n <text\n x=\"24\"\n y=\"206\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"black\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 200)\"\n >\n {{ swimlane.tags.length }}\n </text>\n </g>\n </g>\n\n }\n\n <!-- Nodes -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n class=\"node-element\"\n [attr.transform]=\"\n 'translate(' + node.x + ',' + (node.y - swimlane.order * 263) + ')'\n \"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Exit point indicator (circle and arrow) -->\n @if (node.stageData?.IsExitPoint) {\n <!-- Arrow from node to circle -->\n <path\n [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n <!-- Circle -->\n <circle\n [attr.cx]=\"node.width + 50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n ></circle>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n (showShieldDialog)=\"onShowShieldDialog($event)\"\n (showEscalationDialog)=\"onShowEscalationDialog($event)\"\n (showFormDialog)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n \"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n\n <!-- Decision node condition indicator icon -->\n <svg:g\n (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\"\n class=\"decision-condition-icon\"\n [attr.transform]=\"\n 'translate(' +\n (node.width / 2 - 10) +\n ',' +\n (node.height / 2 - 10) +\n ')'\n \"\n >\n <svg:rect\n x=\"-5\"\n y=\"-5\"\n width=\"30\"\n height=\"30\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n fill=\"#D36CFF\"\n />\n </svg:g>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"10\"\n fill=\"#000000\"\n >\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n } }\n\n <!-- Connections -->\n @for (connection of state.connections; track connection.id) {\n <g class=\"connection-element\">\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n\n <!-- Connection Label -->\n @if (connection.sourceNodeId && connection.targetNodeId) {\n <foreignObject\n [attr.x]=\"getLabelPosition(connection).x\"\n [attr.y]=\"getLabelPosition(connection).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible; pointer-events: all;\"\n [attr.transform]=\"'translate(-75, -10)'\"\n >\n <wf-label-editor\n [label]=\"connection.label || 'New Action'\"\n [x]=\"0\"\n [y]=\"0\"\n [isConnection]=\"true\"\n (labelChange)=\"saveConnectionLabel(connection, $event)\"\n (openDialog)=\"onShowActionDialog(connection)\"\n />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <lib-conditions-popup\n [visible]=\"showDecisionConditionDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [newConnectionId]=\"activeConnectionId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n (saved)=\"onDecisionConditionSaved($event)\"\n ></lib-conditions-popup>\n\n <!-- <lib-decision-popup\n [visible]=\"showConditionsDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n ></lib-decision-popup> -->\n\n <lib-stage-dialog\n [visible]=\"showStageDialogLocal\"\n [stageData]=\"activeStageData || {}\"\n (closed)=\"onStageDialogClosed()\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n\n <lib-action-dialog\n [visible]=\"showActionDialogLocal\"\n [actionData]=\"activeActionData\"\n (closed)=\"onActionDialogClosed()\"\n (saved)=\"onActionDialogSaved($event)\"\n ></lib-action-dialog>\n\n <lib-escalation-dialog\n [visible]=\"showEscalationDialogLocal\"\n [type]=\"activeEscalationType()!\"\n [stageCode]=\"activeStageCode() || ''\"\n [workflowCode]=\"state.workflow?.Code || ''\"\n (closed)=\"onEscalationDialogClosed()\"\n ></lib-escalation-dialog>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}.decision-condition-icon{cursor:pointer}.decision-condition-icon:hover path{fill:#c084fc}.swimlane-label{z-index:10;cursor:default}.plus-icon:hover{fill:#d36cff}.swimlane-container{pointer-events:none}.swimlane-container>*{pointer-events:auto}.node-element{z-index:10}.connection-element{z-index:5}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i5.LabelEditorComponent, selector: "wf-label-editor", inputs: ["label", "x", "y", "isConnection", "isSwimlane"], outputs: ["labelChange", "openDialog"] }, { kind: "component", type: i6.StageNodeComponent, selector: "svg:g[lib-stage-node]", inputs: ["node", "isStartNode", "stageData"], outputs: ["stagePropertiesUpdated", "parallelExecutionToggled", "showShieldDialog", "showEscalationDialog", "showFormDialog"] }, { kind: "component", type: i7.StageDialogComponent, selector: "lib-stage-dialog", inputs: ["visible", "stageData"], outputs: ["closed", "saved"] }, { kind: "component", type: i8.ConditionsPopupComponent, selector: "lib-conditions-popup", inputs: ["visible", "decisionNodeId", "newConnectionId", "popupX", "popupY"], outputs: ["closed", "saved"] }, { kind: "component", type: i9.EscalationDialogComponent, selector: "lib-escalation-dialog", inputs: ["visible", "workflowCode", "stageCode", "type"], outputs: ["closed", "created"] }, { kind: "component", type: i10.ActionDialogComponent, selector: "lib-action-dialog", inputs: ["visible", "actionData"], outputs: ["closed", "saved"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }] });
1039
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DesignerCanvasComponent, selector: "lib-designer-canvas", inputs: { selectedTool: "selectedTool" }, outputs: { clickedPosition: "clickedPosition", subflowSelected: "subflowSelected", showStageDialog: "showStageDialog", stagePropertiesUpdated: "stagePropertiesUpdated", actionPropertiesUpdated: "actionPropertiesUpdated" }, host: { listeners: { "window:mouseup": "onWindowMouseUp($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"canvas-container\">\n <svg #canvas [attr.width]=\"canvasWidth\" [attr.height]=\"canvasHeight\" class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\">\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern id=\"grid\" [attr.width]=\"gridSize\" [attr.height]=\"gridSize\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"0.5\" />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker id=\"arrowhead\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle id=\"connection-point-template\" r=\"5\" fill=\"#D36CFF\" stroke=\"#FFFFFF\" stroke-width=\"1\" />\n\n <!-- Dashed line style for connection preview -->\n <pattern id=\"dashed-line\" width=\"10\" height=\"10\" patternUnits=\"userSpaceOnUse\">\n <line x1=\"0\" y1=\"5\" x2=\"10\" y2=\"5\" stroke=\"#D36CFF\" stroke-width=\"2\" stroke-dasharray=\"5,5\" />\n </pattern>\n\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <clipPath [attr.id]=\"'swimlane-clip-' + swimlane.order\">\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" height=\"263\" />\n </clipPath>\n }\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text x=\"50%\" y=\"50%\" font-family=\"sans-serif\" font-size=\"16\" fill=\"#94a3b8\" text-anchor=\"middle\">\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- <g\n [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\"\n [attr.clip-path]=\"'url(#swimlane-clip-' + swimlane.order + ')'\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n </g> -->\n\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container - remove stroke to make it purely background -->\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" [attr.height]=\"263\"\n [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\" stroke=\"none\"></rect>\n\n <!-- Vertical swimlane label on the left -->\n <g class=\"swimlane-label\">\n <!-- Purple background for the label -->\n <rect x=\"0.5\" y=\"0.5\" width=\"43\" height=\"215\" rx=\"10.5\" fill=\"white\" stroke=\"#D36CFF\"></rect>\n\n <!-- Plus button at the top -->\n <g (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \">\n <rect x=\"12.5\" y=\"10\" width=\"18\" height=\"18\" fill=\"transparent\" style=\"cursor: pointer\"></rect>\n\n <path d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n fill=\"#0000FF\" class=\"plus-icon\" style=\"cursor: pointer\"></path>\n </g>\n\n <!-- Swimlane label -->\n <text x=\"22\" y=\"106\" font-family=\"sans-serif\" font-size=\"14\" fill=\"#333333\" text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 100)\">\n {{\n swimlane.label.length > 12\n ? swimlane.label.substring(0, 10) + \"...\"\n : swimlane.label\n }}\n </text>\n\n <!-- Tag count indicator at the bottom -->\n <rect x=\"11.5\" y=\"187\" width=\"21\" height=\"19\" rx=\"9.5\" fill=\"#9E9E9E\"></rect>\n <text x=\"24\" y=\"206\" font-family=\"sans-serif\" font-size=\"12\" fill=\"black\" text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 200)\">\n {{ swimlane.tags.length }}\n </text>\n </g>\n </g>\n\n }\n\n <!-- Nodes -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g class=\"node-element\" [attr.transform]=\"\n 'translate(' + node.x + ',' + (node.y - swimlane.order * 263) + ')'\n \" (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\" (mouseleave)=\"hideConnectionPoints(node.id)\">\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle cx=\"-50\" cy=\"50\" r=\"30\" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></circle>\n <!-- Form icon for start node -->\n <svg:g (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \" class=\"stage-icon\" transform=\"translate(-45, 42)\" style=\"cursor: pointer; pointer-events: all\">\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect x=\"-2\" y=\"-2\" width=\"24\" height=\"24\" fill=\"transparent\" style=\"cursor: pointer\" />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\" transform=\"scale(0.7)\" />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path d=\"M -20 50 L 0 50\" stroke=\"#D36CFF\" stroke-width=\"1\" marker-end=\"url(#arrowhead)\"></path>\n }\n\n <!-- Exit point indicator (circle and arrow) -->\n @if (node.stageData?.IsExitPoint) {\n <!-- Arrow from node to circle -->\n <path [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\" stroke=\"#D36CFF\" stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"></path>\n <!-- Circle -->\n <circle [attr.cx]=\"node.width + 50\" cy=\"50\" r=\"30\" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"2\"></circle>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g lib-stage-node [node]=\"node\" [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\" (showShieldDialog)=\"onShowShieldDialog($event)\"\n (showEscalationDialog)=\"onShowEscalationDialog($event)\" (showFormDialog)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n \"></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></path>\n\n <!-- Decision node condition indicator icon -->\n <svg:g (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\" class=\"decision-condition-icon\"\n [attr.transform]=\"\n 'translate(' +\n (node.width / 2 - 10) +\n ',' +\n (node.height / 2 - 10) +\n ')'\n \">\n <svg:rect x=\"-5\" y=\"-5\" width=\"30\" height=\"30\" fill=\"transparent\" style=\"cursor: pointer\" />\n <svg:path d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n fill=\"#D36CFF\" />\n </svg:g>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\" fill=\"none\" stroke=\"#D36CFF\" stroke-linejoin=\"round\" />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\" stroke=\"#D36CFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"sans-serif\" font-size=\"14\"\n fill=\"#D36CFF\">\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></path>\n <text [attr.x]=\"node.width / 2\" [attr.y]=\"node.height / 2\" text-anchor=\"middle\" alignment-baseline=\"middle\"\n font-family=\"sans-serif\" font-size=\"10\" fill=\"#000000\">\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use [attr.href]=\"'#connection-point-template'\" [attr.x]=\"point.x\" [attr.y]=\"point.y\" [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\" />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect [attr.x]=\"node.x - 10\" [attr.y]=\"node.y - 10\" [attr.width]=\"node.width + 20\" [attr.height]=\"node.height + 20\"\n fill=\"transparent\" (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\" style=\"pointer-events: none\" />\n } }\n\n <!-- Connections -->\n @for (connection of state.connections; track connection.id) {\n <g class=\"connection-element\">\n <path [attr.d]=\"getConnectionPathForSavedConnection(connection)\" stroke=\"#D36CFF\" stroke-width=\"2\" fill=\"none\"\n marker-end=\"url(#arrowhead)\"></path>\n\n <!-- Connection Label -->\n @if (connection.sourceNodeId && connection.targetNodeId) {\n <foreignObject [attr.x]=\"getLabelPosition(connection).x\" [attr.y]=\"getLabelPosition(connection).y\" width=\"150\"\n height=\"40\" style=\"overflow: visible; pointer-events: all;\" [attr.transform]=\"'translate(-75, -10)'\">\n <wf-label-editor [label]=\"connection.label || 'New Action'\" [x]=\"0\" [y]=\"0\" [isConnection]=\"true\"\n (labelChange)=\"saveConnectionLabel(connection, $event)\" (openDialog)=\"onShowActionDialog(connection)\" />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path [attr.d]=\"getConnectionPath()\" stroke=\"#D36CFF\" stroke-width=\"2\" stroke-dasharray=\"5,5\" fill=\"none\"></path>\n </g>\n }\n </svg>\n\n <div *ngIf=\"popupVisible\" [style.position]=\"'absolute'\" [style.left.px]=\"popupX\" [style.top.px]=\"popupY\">\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md\" dropdown-content>\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\">\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\">\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div *ngIf=\"showStartNodeFormPopup\" [style.position]=\"'absolute'\" [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\">\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\" dropdown-content\n style=\"background-color: white; z-index: 1000\">\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-3\">\n <button\n class=\"w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\">\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n [ngClass]=\"{ 'bg-blue-50 !border-blue-500 !border-2 font-semibold': form?.Code === activeNodeForFormSelection?.stageData?.formId}\"\n (click)=\"selectStartNodeForm(form)\">\n {{ form.Name }}\n </button>\n </div>\n <div *ngIf=\"startNodeFormsList.length === 0\" class=\"text-center py-2 text-gray-500\">\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div *ngIf=\"showSubflowPopup\" [style.position]=\"'absolute'\" [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\">\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\" dropdown-content\n style=\"background-color: white; z-index: 1000\">\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\">\n {{ workflow.Name }}\n </button>\n </div>\n <div *ngIf=\"workflowsList.length === 0\" class=\"text-center py-2 text-gray-500\">\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <lib-conditions-popup [visible]=\"showDecisionConditionDialog\" [decisionNodeId]=\"activeDecisionNodeId\"\n [newConnectionId]=\"activeConnectionId\" [popupX]=\"decisionConditionPopupX\" [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\" (saved)=\"onDecisionConditionSaved($event)\"></lib-conditions-popup>\n\n <!-- <lib-decision-popup\n [visible]=\"showConditionsDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n ></lib-decision-popup> -->\n\n <lib-stage-dialog [visible]=\"showStageDialogLocal\" [stageData]=\"activeStageData || {}\"\n (closed)=\"onStageDialogClosed()\" (saved)=\"onStageDialogSaved($event)\"></lib-stage-dialog>\n\n <lib-action-dialog [visible]=\"showActionDialogLocal\" [actionData]=\"activeActionData\" (closed)=\"onActionDialogClosed()\"\n (saved)=\"onActionDialogSaved($event)\"></lib-action-dialog>\n\n <lib-escalation-dialog [visible]=\"showEscalationDialogLocal\" [type]=\"activeEscalationType()!\"\n [stageCode]=\"activeStageCode() || ''\" [workflowCode]=\"state.workflow?.Code || ''\"\n (closed)=\"onEscalationDialogClosed()\"></lib-escalation-dialog>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}.decision-condition-icon{cursor:pointer}.decision-condition-icon:hover path{fill:#c084fc}.swimlane-label{z-index:10;cursor:default}.plus-icon:hover{fill:#d36cff}.swimlane-container{pointer-events:none}.swimlane-container>*{pointer-events:auto}.node-element{z-index:10}.connection-element{z-index:5}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i5.LabelEditorComponent, selector: "wf-label-editor", inputs: ["label", "x", "y", "isConnection", "isSwimlane"], outputs: ["labelChange", "openDialog"] }, { kind: "component", type: i6.StageNodeComponent, selector: "svg:g[lib-stage-node]", inputs: ["node", "isStartNode", "stageData"], outputs: ["stagePropertiesUpdated", "parallelExecutionToggled", "showShieldDialog", "showEscalationDialog", "showFormDialog"] }, { kind: "component", type: i7.StageDialogComponent, selector: "lib-stage-dialog", inputs: ["visible", "stageData"], outputs: ["closed", "saved"] }, { kind: "component", type: i8.ConditionsPopupComponent, selector: "lib-conditions-popup", inputs: ["visible", "decisionNodeId", "newConnectionId", "popupX", "popupY"], outputs: ["closed", "saved"] }, { kind: "component", type: i9.EscalationDialogComponent, selector: "lib-escalation-dialog", inputs: ["visible", "workflowCode", "stageCode", "type"], outputs: ["closed", "created"] }, { kind: "component", type: i10.ActionDialogComponent, selector: "lib-action-dialog", inputs: ["visible", "actionData"], outputs: ["closed", "saved"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }] });
1040
1040
  }
1041
1041
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DesignerCanvasComponent, decorators: [{
1042
1042
  type: Component,
1043
- args: [{ selector: 'lib-designer-canvas', template: "<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <clipPath [attr.id]=\"'swimlane-clip-' + swimlane.order\">\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" height=\"263\" />\n </clipPath>\n }\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- <g\n [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\"\n [attr.clip-path]=\"'url(#swimlane-clip-' + swimlane.order + ')'\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n </g> -->\n\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container - remove stroke to make it purely background -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\"\n stroke=\"none\"\n ></rect>\n\n <!-- Vertical swimlane label on the left -->\n <g class=\"swimlane-label\">\n <!-- Purple background for the label -->\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"43\"\n height=\"215\"\n rx=\"10.5\"\n fill=\"white\"\n stroke=\"#D36CFF\"\n ></rect>\n\n <!-- Plus button at the top -->\n <g\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"12.5\"\n y=\"10\"\n width=\"18\"\n height=\"18\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n ></rect>\n\n <path\n d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n fill=\"#0000FF\"\n class=\"plus-icon\"\n style=\"cursor: pointer\"\n ></path>\n </g>\n\n <!-- Swimlane label -->\n <text\n x=\"22\"\n y=\"106\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 100)\"\n >\n {{\n swimlane.label.length > 12\n ? swimlane.label.substring(0, 10) + \"...\"\n : swimlane.label\n }}\n </text>\n\n <!-- Tag count indicator at the bottom -->\n <rect\n x=\"11.5\"\n y=\"187\"\n width=\"21\"\n height=\"19\"\n rx=\"9.5\"\n fill=\"#9E9E9E\"\n ></rect>\n <text\n x=\"24\"\n y=\"206\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"black\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 200)\"\n >\n {{ swimlane.tags.length }}\n </text>\n </g>\n </g>\n\n }\n\n <!-- Nodes -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n class=\"node-element\"\n [attr.transform]=\"\n 'translate(' + node.x + ',' + (node.y - swimlane.order * 263) + ')'\n \"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Exit point indicator (circle and arrow) -->\n @if (node.stageData?.IsExitPoint) {\n <!-- Arrow from node to circle -->\n <path\n [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n <!-- Circle -->\n <circle\n [attr.cx]=\"node.width + 50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n ></circle>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n (showShieldDialog)=\"onShowShieldDialog($event)\"\n (showEscalationDialog)=\"onShowEscalationDialog($event)\"\n (showFormDialog)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n \"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n\n <!-- Decision node condition indicator icon -->\n <svg:g\n (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\"\n class=\"decision-condition-icon\"\n [attr.transform]=\"\n 'translate(' +\n (node.width / 2 - 10) +\n ',' +\n (node.height / 2 - 10) +\n ')'\n \"\n >\n <svg:rect\n x=\"-5\"\n y=\"-5\"\n width=\"30\"\n height=\"30\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n fill=\"#D36CFF\"\n />\n </svg:g>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"10\"\n fill=\"#000000\"\n >\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n } }\n\n <!-- Connections -->\n @for (connection of state.connections; track connection.id) {\n <g class=\"connection-element\">\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n\n <!-- Connection Label -->\n @if (connection.sourceNodeId && connection.targetNodeId) {\n <foreignObject\n [attr.x]=\"getLabelPosition(connection).x\"\n [attr.y]=\"getLabelPosition(connection).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible; pointer-events: all;\"\n [attr.transform]=\"'translate(-75, -10)'\"\n >\n <wf-label-editor\n [label]=\"connection.label || 'New Action'\"\n [x]=\"0\"\n [y]=\"0\"\n [isConnection]=\"true\"\n (labelChange)=\"saveConnectionLabel(connection, $event)\"\n (openDialog)=\"onShowActionDialog(connection)\"\n />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <lib-conditions-popup\n [visible]=\"showDecisionConditionDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [newConnectionId]=\"activeConnectionId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n (saved)=\"onDecisionConditionSaved($event)\"\n ></lib-conditions-popup>\n\n <!-- <lib-decision-popup\n [visible]=\"showConditionsDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n ></lib-decision-popup> -->\n\n <lib-stage-dialog\n [visible]=\"showStageDialogLocal\"\n [stageData]=\"activeStageData || {}\"\n (closed)=\"onStageDialogClosed()\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n\n <lib-action-dialog\n [visible]=\"showActionDialogLocal\"\n [actionData]=\"activeActionData\"\n (closed)=\"onActionDialogClosed()\"\n (saved)=\"onActionDialogSaved($event)\"\n ></lib-action-dialog>\n\n <lib-escalation-dialog\n [visible]=\"showEscalationDialogLocal\"\n [type]=\"activeEscalationType()!\"\n [stageCode]=\"activeStageCode() || ''\"\n [workflowCode]=\"state.workflow?.Code || ''\"\n (closed)=\"onEscalationDialogClosed()\"\n ></lib-escalation-dialog>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}.decision-condition-icon{cursor:pointer}.decision-condition-icon:hover path{fill:#c084fc}.swimlane-label{z-index:10;cursor:default}.plus-icon:hover{fill:#d36cff}.swimlane-container{pointer-events:none}.swimlane-container>*{pointer-events:auto}.node-element{z-index:10}.connection-element{z-index:5}\n"] }]
1043
+ args: [{ selector: 'lib-designer-canvas', template: "<div class=\"canvas-container\">\n <svg #canvas [attr.width]=\"canvasWidth\" [attr.height]=\"canvasHeight\" class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\">\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern id=\"grid\" [attr.width]=\"gridSize\" [attr.height]=\"gridSize\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"0.5\" />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker id=\"arrowhead\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle id=\"connection-point-template\" r=\"5\" fill=\"#D36CFF\" stroke=\"#FFFFFF\" stroke-width=\"1\" />\n\n <!-- Dashed line style for connection preview -->\n <pattern id=\"dashed-line\" width=\"10\" height=\"10\" patternUnits=\"userSpaceOnUse\">\n <line x1=\"0\" y1=\"5\" x2=\"10\" y2=\"5\" stroke=\"#D36CFF\" stroke-width=\"2\" stroke-dasharray=\"5,5\" />\n </pattern>\n\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <clipPath [attr.id]=\"'swimlane-clip-' + swimlane.order\">\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" height=\"263\" />\n </clipPath>\n }\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text x=\"50%\" y=\"50%\" font-family=\"sans-serif\" font-size=\"16\" fill=\"#94a3b8\" text-anchor=\"middle\">\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- <g\n [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\"\n [attr.clip-path]=\"'url(#swimlane-clip-' + swimlane.order + ')'\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n </g> -->\n\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container - remove stroke to make it purely background -->\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" [attr.height]=\"263\"\n [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\" stroke=\"none\"></rect>\n\n <!-- Vertical swimlane label on the left -->\n <g class=\"swimlane-label\">\n <!-- Purple background for the label -->\n <rect x=\"0.5\" y=\"0.5\" width=\"43\" height=\"215\" rx=\"10.5\" fill=\"white\" stroke=\"#D36CFF\"></rect>\n\n <!-- Plus button at the top -->\n <g (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \">\n <rect x=\"12.5\" y=\"10\" width=\"18\" height=\"18\" fill=\"transparent\" style=\"cursor: pointer\"></rect>\n\n <path d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n fill=\"#0000FF\" class=\"plus-icon\" style=\"cursor: pointer\"></path>\n </g>\n\n <!-- Swimlane label -->\n <text x=\"22\" y=\"106\" font-family=\"sans-serif\" font-size=\"14\" fill=\"#333333\" text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 100)\">\n {{\n swimlane.label.length > 12\n ? swimlane.label.substring(0, 10) + \"...\"\n : swimlane.label\n }}\n </text>\n\n <!-- Tag count indicator at the bottom -->\n <rect x=\"11.5\" y=\"187\" width=\"21\" height=\"19\" rx=\"9.5\" fill=\"#9E9E9E\"></rect>\n <text x=\"24\" y=\"206\" font-family=\"sans-serif\" font-size=\"12\" fill=\"black\" text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 200)\">\n {{ swimlane.tags.length }}\n </text>\n </g>\n </g>\n\n }\n\n <!-- Nodes -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g class=\"node-element\" [attr.transform]=\"\n 'translate(' + node.x + ',' + (node.y - swimlane.order * 263) + ')'\n \" (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\" (mouseleave)=\"hideConnectionPoints(node.id)\">\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle cx=\"-50\" cy=\"50\" r=\"30\" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></circle>\n <!-- Form icon for start node -->\n <svg:g (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \" class=\"stage-icon\" transform=\"translate(-45, 42)\" style=\"cursor: pointer; pointer-events: all\">\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect x=\"-2\" y=\"-2\" width=\"24\" height=\"24\" fill=\"transparent\" style=\"cursor: pointer\" />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\" transform=\"scale(0.7)\" />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path d=\"M -20 50 L 0 50\" stroke=\"#D36CFF\" stroke-width=\"1\" marker-end=\"url(#arrowhead)\"></path>\n }\n\n <!-- Exit point indicator (circle and arrow) -->\n @if (node.stageData?.IsExitPoint) {\n <!-- Arrow from node to circle -->\n <path [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\" stroke=\"#D36CFF\" stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"></path>\n <!-- Circle -->\n <circle [attr.cx]=\"node.width + 50\" cy=\"50\" r=\"30\" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"2\"></circle>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g lib-stage-node [node]=\"node\" [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\" (showShieldDialog)=\"onShowShieldDialog($event)\"\n (showEscalationDialog)=\"onShowEscalationDialog($event)\" (showFormDialog)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n \"></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></path>\n\n <!-- Decision node condition indicator icon -->\n <svg:g (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\" class=\"decision-condition-icon\"\n [attr.transform]=\"\n 'translate(' +\n (node.width / 2 - 10) +\n ',' +\n (node.height / 2 - 10) +\n ')'\n \">\n <svg:rect x=\"-5\" y=\"-5\" width=\"30\" height=\"30\" fill=\"transparent\" style=\"cursor: pointer\" />\n <svg:path d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n fill=\"#D36CFF\" />\n </svg:g>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\" fill=\"none\" stroke=\"#D36CFF\" stroke-linejoin=\"round\" />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\" stroke=\"#D36CFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"sans-serif\" font-size=\"14\"\n fill=\"#D36CFF\">\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></path>\n <text [attr.x]=\"node.width / 2\" [attr.y]=\"node.height / 2\" text-anchor=\"middle\" alignment-baseline=\"middle\"\n font-family=\"sans-serif\" font-size=\"10\" fill=\"#000000\">\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use [attr.href]=\"'#connection-point-template'\" [attr.x]=\"point.x\" [attr.y]=\"point.y\" [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\" />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect [attr.x]=\"node.x - 10\" [attr.y]=\"node.y - 10\" [attr.width]=\"node.width + 20\" [attr.height]=\"node.height + 20\"\n fill=\"transparent\" (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\" style=\"pointer-events: none\" />\n } }\n\n <!-- Connections -->\n @for (connection of state.connections; track connection.id) {\n <g class=\"connection-element\">\n <path [attr.d]=\"getConnectionPathForSavedConnection(connection)\" stroke=\"#D36CFF\" stroke-width=\"2\" fill=\"none\"\n marker-end=\"url(#arrowhead)\"></path>\n\n <!-- Connection Label -->\n @if (connection.sourceNodeId && connection.targetNodeId) {\n <foreignObject [attr.x]=\"getLabelPosition(connection).x\" [attr.y]=\"getLabelPosition(connection).y\" width=\"150\"\n height=\"40\" style=\"overflow: visible; pointer-events: all;\" [attr.transform]=\"'translate(-75, -10)'\">\n <wf-label-editor [label]=\"connection.label || 'New Action'\" [x]=\"0\" [y]=\"0\" [isConnection]=\"true\"\n (labelChange)=\"saveConnectionLabel(connection, $event)\" (openDialog)=\"onShowActionDialog(connection)\" />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path [attr.d]=\"getConnectionPath()\" stroke=\"#D36CFF\" stroke-width=\"2\" stroke-dasharray=\"5,5\" fill=\"none\"></path>\n </g>\n }\n </svg>\n\n <div *ngIf=\"popupVisible\" [style.position]=\"'absolute'\" [style.left.px]=\"popupX\" [style.top.px]=\"popupY\">\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md\" dropdown-content>\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\">\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\">\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div *ngIf=\"showStartNodeFormPopup\" [style.position]=\"'absolute'\" [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\">\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\" dropdown-content\n style=\"background-color: white; z-index: 1000\">\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-3\">\n <button\n class=\"w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\">\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n [ngClass]=\"{ 'bg-blue-50 !border-blue-500 !border-2 font-semibold': form?.Code === activeNodeForFormSelection?.stageData?.formId}\"\n (click)=\"selectStartNodeForm(form)\">\n {{ form.Name }}\n </button>\n </div>\n <div *ngIf=\"startNodeFormsList.length === 0\" class=\"text-center py-2 text-gray-500\">\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div *ngIf=\"showSubflowPopup\" [style.position]=\"'absolute'\" [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\">\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\" dropdown-content\n style=\"background-color: white; z-index: 1000\">\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\">\n {{ workflow.Name }}\n </button>\n </div>\n <div *ngIf=\"workflowsList.length === 0\" class=\"text-center py-2 text-gray-500\">\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <lib-conditions-popup [visible]=\"showDecisionConditionDialog\" [decisionNodeId]=\"activeDecisionNodeId\"\n [newConnectionId]=\"activeConnectionId\" [popupX]=\"decisionConditionPopupX\" [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\" (saved)=\"onDecisionConditionSaved($event)\"></lib-conditions-popup>\n\n <!-- <lib-decision-popup\n [visible]=\"showConditionsDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n ></lib-decision-popup> -->\n\n <lib-stage-dialog [visible]=\"showStageDialogLocal\" [stageData]=\"activeStageData || {}\"\n (closed)=\"onStageDialogClosed()\" (saved)=\"onStageDialogSaved($event)\"></lib-stage-dialog>\n\n <lib-action-dialog [visible]=\"showActionDialogLocal\" [actionData]=\"activeActionData\" (closed)=\"onActionDialogClosed()\"\n (saved)=\"onActionDialogSaved($event)\"></lib-action-dialog>\n\n <lib-escalation-dialog [visible]=\"showEscalationDialogLocal\" [type]=\"activeEscalationType()!\"\n [stageCode]=\"activeStageCode() || ''\" [workflowCode]=\"state.workflow?.Code || ''\"\n (closed)=\"onEscalationDialogClosed()\"></lib-escalation-dialog>\n</div>\n", styles: [".canvas-container{flex:1;overflow:auto;background-color:#fff}.designer-canvas{min-width:100%;min-height:100%;cursor:default}.designer-canvas:focus{outline:none}.edit-swimlane-button{cursor:pointer}.edit-swimlane-button:hover rect{fill:#ddd6fe}.decision-condition-icon{cursor:pointer}.decision-condition-icon:hover path{fill:#c084fc}.swimlane-label{z-index:10;cursor:default}.plus-icon:hover{fill:#d36cff}.swimlane-container{pointer-events:none}.swimlane-container>*{pointer-events:auto}.node-element{z-index:10}.connection-element{z-index:5}\n"] }]
1044
1044
  }], ctorParameters: () => [{ type: i1.WorkflowDesignerState }, { type: i2.WorkflowDataService }], propDecorators: { selectedTool: [{
1045
1045
  type: Input
1046
1046
  }], clickedPosition: [{
@@ -1060,4 +1060,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1060
1060
  type: HostListener,
1061
1061
  args: ['window:mouseup', ['$event']]
1062
1062
  }] } });
1063
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL2Rlc2lnbmVyLWNhbnZhcy9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sdUJBQXVCO0lBMkd6QjtJQUNDO0lBM0dELFlBQVksR0FBYSxJQUFJLENBQUM7SUFDN0IsZUFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQy9ELGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9DLG9CQUFvQixHQUNsQixJQUFJLENBQUM7SUFDRyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBS3hDLENBQUM7SUFDSyxzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFHL0MsQ0FBQztJQUNLLHVCQUF1QixHQUFHLElBQUksWUFBWSxFQUdoRCxDQUFDO0lBRUwsK0JBQStCO0lBQ1EsU0FBUyxDQUEwQjtJQUcxRSxlQUFlLENBQUMsS0FBaUI7UUFDL0Isc0VBQXNFO1FBQ3RFLElBQ0UsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RCLENBQUMsSUFBSSxDQUFDLHNCQUFzQjtZQUM1QixDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksdUNBQXVDO1lBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsRUFDakMsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMseURBQXlELENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBRXBCLFlBQVk7SUFDWixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBRWQsY0FBYyxHQUFHLEdBQUcsQ0FBQztJQUNyQiw2QkFBNkIsR0FBa0IsSUFBSSxDQUFDO0lBQ3BELFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNYLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDWCxnQkFBZ0IsR0FBYSxFQUFFLENBQUM7SUFFaEMsc0JBQXNCLEdBQVksS0FBSyxDQUFDO0lBQ3hDLGtCQUFrQixHQUFXLEVBQUUsQ0FBQztJQUNoQyx1QkFBdUIsR0FBWSxLQUFLLENBQUM7SUFDekMsbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBQ2hDLG1CQUFtQixHQUFXLENBQUMsQ0FBQztJQUNoQywwQkFBMEIsR0FBZ0IsSUFBSSxDQUFDO0lBQy9DLFNBQVMsR0FFTCxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFZixnQkFBZ0IsR0FBWSxLQUFLLENBQUM7SUFDbEMsYUFBYSxHQUFlLEVBQUUsQ0FBQztJQUMvQixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsYUFBYSxHQUFXLENBQUMsQ0FBQztJQUMxQixhQUFhLEdBQVcsQ0FBQyxDQUFDO0lBQzFCLHNCQUFzQixHQUlYLElBQUksQ0FBQztJQUVoQix5QkFBeUIsR0FLZCxJQUFJLENBQUM7SUFFaEIsNEJBQTRCLEdBQTJCLElBQUksQ0FBQztJQUM1RCxvQ0FBb0MsR0FBa0IsSUFBSSxDQUFDO0lBRTNELDJCQUEyQixHQUFZLEtBQUssQ0FBQztJQUM3QyxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMsb0JBQW9CLEdBQVcsRUFBRSxDQUFDO0lBQ2xDLGtCQUFrQixHQUFXLEVBQUUsQ0FBQztJQUNoQyx1QkFBdUIsR0FBVyxDQUFDLENBQUM7SUFDcEMsdUJBQXVCLEdBQVcsQ0FBQyxDQUFDO0lBRXBDLDJCQUEyQixHQUFZLEtBQUssQ0FBQztJQUM3Qyx3QkFBd0IsR0FBVyxFQUFFLENBQUM7SUFDdEMsYUFBYSxHQUFrQixJQUFJLENBQUM7SUFDcEMsY0FBYyxHQUFrQixJQUFJLENBQUM7SUFFckMsb0JBQW9CLEdBQVksS0FBSyxDQUFDO0lBQ3RDLHlCQUF5QixHQUFZLEtBQUssQ0FBQztJQUMzQyxvQkFBb0IsR0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNFLGVBQWUsR0FBa0MsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlELGVBQWUsR0FBMkIsRUFBRSxDQUFDO0lBQzdDLGdCQUFnQixHQUFzQixJQUFJLENBQUM7SUFFM0MscUJBQXFCLEdBQVksS0FBSyxDQUFDO0lBRXZDLHNCQUFzQixHQUFrQixJQUFJLENBQUM7SUFFN0MsWUFDUyxLQUE0QixFQUMzQixXQUFnQztRQURqQyxVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUMzQixnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7SUFDdEMsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsK0JBQStCO0lBQy9CLGFBQWEsQ0FBQyxLQUFpQjtRQUM3QixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPO1FBQ1QsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxvQkFBb0IsRUFDcEIsUUFBUSxFQUNSLFlBQVksRUFDWixJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO1FBRUYsaURBQWlEO1FBQ2pELHNFQUFzRTtRQUV0RSxnRkFBZ0Y7UUFDaEYsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDYixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQWU7UUFDaEMsZ0JBQWdCO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztZQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLGNBQTBCO1FBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3pDLGdCQUFnQjtRQUNoQiw4REFBOEQ7UUFDOUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztZQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUd0QjtRQUNDLGdCQUFnQjtRQUNoQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJO2dCQUNoRCxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWE7YUFDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0Msd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsOENBQThDO0lBQzlDLGtCQUFrQixDQUFDLFNBQWlDO1FBQ2xELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLDRCQUE0QjtZQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYix3QkFBd0I7Z0JBQ3hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHO29CQUN4QixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUztvQkFDMUIsR0FBRyxTQUFTO2lCQUNiLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUU1RCwyREFBMkQ7Z0JBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7b0JBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtvQkFDMUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUztpQkFDbkMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQXNCO1FBQ3hDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLDRCQUE0QjtZQUM1Qix1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN4RSxJQUFJLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUMxQyxVQUFVLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztvQkFDdEMsVUFBVSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO29CQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO2dCQUNELE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsTUFBTSxjQUFjLEdBQ2xCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLDZDQUE2QztRQUVqRyx1REFBdUQ7UUFDdkQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDL0MsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQixNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxRCxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNoQixXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ2pFLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELHFFQUFxRTtJQUM3RCxnQkFBZ0IsQ0FBQyxLQUFpQjtRQUN4Qyw0RUFBNEU7UUFDNUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNsRSxPQUFPO1lBQ0wsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFDNUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUc7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsYUFBcUI7UUFDeEQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE1BQU0sQ0FBQztJQUM5QyxDQUFDO0lBRUQsZUFBZSxDQUNiLEtBQWlCLEVBQ2pCLElBQVksRUFDWixhQUFxQjtRQUVyQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUV0RSxPQUFPLENBQ0wsUUFBUSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQztZQUMxQixRQUFRLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUs7WUFDN0MsUUFBUSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQztZQUMxQixRQUFRLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDL0MsQ0FBQztJQUNKLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsd0JBQXdCLENBQ3RCLElBQVksRUFDWixhQUFxQjtRQUVyQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQywyREFBMkQ7UUFFL0UsOERBQThEO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUUvQyxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTztZQUNuQixDQUFDLEVBQUUsU0FBUyxHQUFHLE9BQU87WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxHQUFHLENBQUM7WUFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxHQUFHLENBQUM7U0FDbEMsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFjO1FBQ2pDLElBQ0UsSUFBSSxDQUFDLDZCQUE2QixLQUFLLE1BQU07WUFDN0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEVBQ2xDLENBQUM7WUFDRCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyw2QkFBNkIsS0FBSyxNQUFNLENBQUM7SUFDdkQsQ0FBQztJQUVELG1CQUFtQixDQUNqQixLQUFpQixFQUNqQixLQUFzQixFQUN0QixhQUFxQjtRQUVyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLHNDQUFzQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsSUFDRSxRQUFRO1lBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTztZQUM5QixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQ3BDLENBQUM7WUFDRCwyQ0FBMkM7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQzFELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQzVCLEtBQUssRUFDTCxhQUFhLEVBQ2IsUUFBUSxDQUFDLENBQUMsRUFDVixRQUFRLENBQUMsQ0FBQyxDQUNYLENBQUM7UUFFRiw4REFBOEQ7UUFDOUQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQWlCO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO1lBQUUsT0FBTztRQUUvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUN4RCxRQUFRLENBQUMsQ0FBQyxFQUNWLFFBQVEsQ0FBQyxDQUFDLENBQ1gsQ0FBQztRQUVGLElBQ0UsZUFBZTtZQUNmLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxzQkFBc0IsRUFDeEQsQ0FBQztZQUNELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekQsQ0FBQzthQUFNLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDM0Qsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCxpREFBaUQ7SUFDakQsV0FBVyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQztJQUVGLG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFFdEQsOENBQThDO1lBQzlDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqRSxJQUFJLGFBQWEsSUFBSSxDQUFDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0RSw4Q0FBOEM7Z0JBQzlDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDaEMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUUxRSwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE9BQU87UUFDVCxDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FDeEQsUUFBUSxDQUFDLENBQUMsRUFDVixRQUFRLENBQUMsQ0FBQyxDQUNYLENBQUM7UUFFRixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLHFDQUFxQztZQUNyQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRS9ELDBDQUEwQztZQUMxQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQztZQUNsRSxNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDO1lBRXhELElBQUksV0FBVyxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyRCxzQ0FBc0M7Z0JBQ3RDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2xELHFFQUFxRTtvQkFDckUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNuRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FDNUMsZUFBZSxDQUFDLE1BQU0sQ0FDdkIsQ0FBQztvQkFFRixJQUNFLGNBQWM7d0JBQ2QsY0FBYzt3QkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FDbkIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQ3hCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN6QixFQUNELENBQUM7d0JBQ0Qsd0JBQXdCO3dCQUN4QixNQUFNLFVBQVUsR0FBRzs0QkFDakIsRUFBRSxFQUFFLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFOzRCQUM1RCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU07NEJBQ2hDLFlBQVksRUFBRSxlQUFlLENBQUMsTUFBTTs0QkFDcEMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFOzRCQUM3QixhQUFhLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUN2QyxtQkFBbUIsRUFBRSxtQkFBbUI7NEJBQ3hDLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxhQUFhOzRCQUNsRCxLQUFLLEVBQUUsRUFBRTs0QkFDVCxNQUFNLEVBQUUsSUFBSTt5QkFDYixDQUFDO3dCQUVGLDJCQUEyQjt3QkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO3dCQUVwRSxtQ0FBbUM7d0JBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdkMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsa0NBQWtDLEVBQ2xDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUN6QixJQUFJLEVBQ0osY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQzFCLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0gsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVyRCx1Q0FBdUM7UUFDdkMsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztZQUMxRCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxDQUFDO1lBQ04sZ0RBQWdEO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLDZCQUE2QixDQUMzQixDQUFTLEVBQ1QsQ0FBUyxFQUNULFlBQW9CLEVBQUU7UUFNdEIsb0VBQW9FO1FBQ3BFLEtBQ0UsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUNyQixhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUMzQyxhQUFhLEVBQUUsRUFDZixDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO2dCQUFFLFNBQVM7WUFFOUIsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO29CQUFFLFNBQVM7Z0JBRXJDLDBFQUEwRTtnQkFDMUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFFbkUsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDMUMsc0RBQXNEO29CQUN0RCxNQUFNLE1BQU0sR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsTUFBTSxNQUFNLEdBQUcsYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBRXZDLGdFQUFnRTtvQkFDaEUsSUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxTQUFTO3dCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQ2pDLENBQUM7d0JBQ0QsT0FBTzs0QkFDTCxLQUFLLEVBQUUsS0FBSzs0QkFDWixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7NEJBQ2YsYUFBYSxFQUFFLGFBQWE7eUJBQzdCLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxDQUFTO1FBQ2hDLDZDQUE2QztRQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDbEQsSUFBSSxhQUFhLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXRDLHNDQUFzQztRQUN0QyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWhFLHlEQUF5RDtRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDO0lBQzNDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVoQix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTFELG9EQUFvRDtRQUNwRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBRTVDLGlEQUFpRDtZQUNqRCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25FLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7YUFBTSxDQUFDO1lBQ04sMkNBQTJDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELDREQUE0RDtJQUM1RCw4Q0FBOEM7SUFDOUMsNkNBQTZDO0lBQzdDLDZCQUE2QjtJQUM3QixvRUFBb0U7SUFDcEUsMEVBQTBFO0lBQzFFLG9DQUFvQztJQUNwQyxRQUFRO0lBQ1IsTUFBTTtJQUNOLElBQUk7SUFFSixvQkFBb0IsQ0FBQyxRQUFnQjtRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFFRCxtREFBbUQ7UUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTyxDQUFDLEtBQUssQ0FDWCwrQkFBK0IsUUFBUSx5QkFBeUIsQ0FDakUsQ0FBQztZQUNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxRQUFRLENBQUM7UUFFckQsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BFLDZDQUE2QztZQUM3QyxJQUFJLENBQUMseUJBQXlCLEdBQUc7Z0JBQy9CLGNBQWMsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RDLGFBQWEsRUFBRSxtQkFBbUI7Z0JBQ2xDLENBQUMsRUFBRSxJQUFJO2dCQUNQLENBQUMsRUFBRSxJQUFJO2FBQ1IsQ0FBQztZQUVGLGdFQUFnRTtZQUNoRSxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7WUFFbEQsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7WUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyw4QkFBOEI7WUFFekUsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDO1lBRXhDLDBCQUEwQjtZQUMxQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3RCxNQUFNLFdBQVcsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN4RCx1Q0FBdUM7UUFDdkMsTUFBTSxlQUFlLEdBQUcsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO1FBQ2xELElBQUksU0FBUyxHQUFHLElBQUksR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDLENBQUMsNENBQTRDO1FBQ3pGLE1BQU0sY0FBYyxHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFFekMsNENBQTRDO1FBRTVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFbEUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLFdBQVcsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEIsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLDZDQUE2QztRQUN4RSxDQUFDO2FBQU0sSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEIsU0FBUyxHQUFHLGNBQWMsR0FBRyxHQUFHLENBQUMsQ0FBQyxnREFBZ0Q7UUFDcEYsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN6QixvREFBb0Q7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ2hDLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsSUFBSSxFQUNKLFNBQVMsRUFDVCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyx5QkFBeUI7YUFDaEQsQ0FBQztZQUVGLElBQ0UsT0FBTztnQkFDUCxPQUFPLENBQUMsZ0JBQWdCO2dCQUN4QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ25DLFdBQVcsRUFDWCxDQUFDO2dCQUNELDZCQUE2QjtnQkFDN0IsTUFBTSxZQUFZLEdBQUc7b0JBQ25CLEtBQUssRUFBRSxNQUFNO29CQUNiLElBQUksRUFBRSxPQUFPO29CQUNiLEdBQUcsRUFBRSxRQUFRO29CQUNiLE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBd0MsQ0FBQztnQkFFM0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FDL0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUMvQixDQUFDO2dCQUVGLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLHdCQUF3QjtvQkFDeEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUMsT0FBTyxDQUFDLEVBQUUsRUFDVixXQUFXLENBQUMsRUFBRSxFQUNkLG1CQUFtQixDQUNwQixDQUFDO29CQUVGLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTztRQUNULENBQUM7YUFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxPQUFPLENBQUMsR0FBRyxDQUNULHNDQUFzQyxFQUN0QyxJQUFJLEVBQ0osSUFBSSxFQUNKLFdBQVcsRUFDWCxtQkFBbUIsQ0FDcEIsQ0FBQztZQUNGLHdFQUF3RTtZQUN4RSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUNoQyxtQkFBbUIsRUFDbkIsUUFBb0IsRUFDcEIsSUFBSSxFQUNKLFNBQVMsQ0FDVixDQUFDO1FBRUYsSUFDRSxPQUFPO1lBQ1AsT0FBTyxDQUFDLGdCQUFnQjtZQUN4QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkMsQ0FBQztZQUNELHFFQUFxRTtZQUNyRSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixrRUFBa0U7Z0JBQ2xFLDZFQUE2RTtnQkFDN0UsSUFBSSxXQUFXLENBQUM7Z0JBRWhCLHdEQUF3RDtnQkFDeEQsTUFBTSxZQUFZLEdBQUc7b0JBQ25CLEtBQUssRUFBRSxNQUFNO29CQUNiLElBQUksRUFBRSxPQUFPO29CQUNiLEdBQUcsRUFBRSxRQUFRO29CQUNiLE1BQU0sRUFBRSxLQUFLO2lCQUNkLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBd0MsQ0FBQztnQkFFM0QsV0FBVyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FDL0IsQ0FBQztnQkFFRixJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQix3QkFBd0I7b0JBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQzVDLE9BQU8sQ0FBQyxFQUFFLEVBQ1YsV0FBVyxDQUFDLEVBQUUsRUFDZCxtQkFBbUIsQ0FDcEIsQ0FBQztvQkFFRixJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdkMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLHdCQUF3QixDQUFDLEtBR3hCO1FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7WUFDekMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQzNDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUVqQyxvREFBb0Q7UUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQzdCLGFBQWEsRUFDYixPQUFPLEVBQ1AsQ0FBQyxFQUNELENBQUMsRUFDRCxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyx5QkFBeUI7U0FDaEQsQ0FBQztRQUVGLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRWpFLElBQ0UsZ0JBQWdCO2dCQUNoQixJQUFJLENBQUMsZ0JBQWdCO2dCQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDaEMsQ0FBQztnQkFDRCwwREFBMEQ7Z0JBQzFELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQztnQkFDM0MsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO2dCQUMvRCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FDakQsQ0FBQztnQkFFRixJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQix1REFBdUQ7b0JBQ3ZELE1BQU0sWUFBWSxHQUFHO3dCQUNuQixLQUFLLEVBQUUsTUFBTTt3QkFDYixNQUFNLEVBQUUsS0FBSzt3QkFDYixJQUFJLEVBQUUsT0FBTzt3QkFDYixHQUFHLEVBQUUsUUFBUTtxQkFDZCxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQXdDLENBQUM7b0JBRTNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQzVDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FDL0IsQ0FBQztvQkFFRixJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNoQixtQ0FBbUM7d0JBQ25DLE1BQU0sVUFBVSxHQUFHOzRCQUNqQixFQUFFLEVBQUUsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUU7NEJBQzVELFlBQVksRUFBRSxZQUFZLENBQUMsRUFBRTs0QkFDN0IsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFOzRCQUNyQixhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUU7NEJBQzdCLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRTs0QkFDN0IsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsYUFBYTs0QkFDbkQsbUJBQW1CLEVBQUUsYUFBYTs0QkFDbEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTOzRCQUMxQixLQUFLLEVBQUUsRUFBRTs0QkFDVCxNQUFNLEVBQUUsSUFBSTt5QkFDYixDQUFDO3dCQUVGLDhCQUE4Qjt3QkFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUN4QyxPQUFPLENBQUMsR0FBRyxDQUNULDZDQUE2QyxFQUM3QyxVQUFVLENBQ1gsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7UUFFbkMsMkJBQTJCO1FBQzNCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUVELDRCQUE0QjtRQUMxQixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLHVDQUF1QztJQUN6QyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFekIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUNoRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQztRQUVsRSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTVCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELG1DQUFtQyxDQUFDLFVBQXNCO1FBQ3hELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzFELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztZQUVELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUM7WUFFaEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUNuRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsYUFBYSxDQUN6QyxDQUFDO1lBRUYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRSxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FDM0IsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLEVBQ0osSUFBSSxFQUNKLFdBQVcsQ0FBQyxJQUFJLENBQ2pCLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFFLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUIsQ0FDZixNQUFjLEVBQ2QsTUFBYyxFQUNkLElBQVksRUFDWixJQUFZLEVBQ1osU0FBOEM7UUFFOUMsNkRBQTZEO1FBQzdELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVkLDJEQUEyRDtRQUMzRCxJQUFJLFNBQVMsS0FBSyxNQUFNLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ2xELGdDQUFnQztZQUNoQyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBRXJDLDJFQUEyRTtZQUMzRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakMsSUFBSSxHQUFHLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDO1lBQy9ELENBQUM7WUFDRCx5RkFBeUY7aUJBQ3BGLENBQUM7Z0JBQ0osSUFBSSxHQUFHLEtBQUssTUFBTSxJQUFJLE1BQU0sTUFBTSxNQUFNLEdBQUcsY0FBYyxHQUFHLENBQzFELE1BQU0sSUFBSSxNQUFNLElBQUksRUFBRSxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0Qsa0RBQWtEO2FBQzdDLElBQUksU0FBUyxLQUFLLEtBQUssSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkQsOEJBQThCO1lBQzlCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUM7WUFFbkMseUVBQXlFO1lBQ3pFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDL0QsQ0FBQztZQUNELHVGQUF1RjtpQkFDbEYsQ0FBQztnQkFDSixJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLE1BQU0sR0FBRyxZQUFZLEdBQUcsQ0FDeEQsTUFBTSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFpQixFQUFFLElBQVU7UUFDOUMsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBRUQsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTix1QkFBdUI7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDakMsQ0FBQztZQUVELHlDQUF5QztZQUN6QyxJQUFJLENBQUMsd0JBQXdCLENBQUM7Z0JBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDZixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxLQUd4QjtRQUNDLGlDQUFpQztRQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFFLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLHdCQUF3QjtnQkFDeEIsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25CLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxHQUFHO3dCQUNwQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUzt3QkFDdEMsR0FBRyxLQUFLLENBQUMsU0FBUztxQkFDbkIsQ0FBQztvQkFDRixPQUFPLENBQUMsR0FBRyxDQUNULGlDQUFpQyxFQUNqQyxDQUFDLEVBQ0QsT0FBTyxFQUNQLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQ3BDLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsVUFBc0I7UUFDeEMsNkVBQTZFO1FBQzdFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzRCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxxQkFBcUIsQ0FBQyxJQUFZO1FBQ2hDLGtFQUFrRTtRQUNsRSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FDeEMsQ0FBQztRQUVGLHVDQUF1QztRQUN2QyxNQUFNLG1CQUFtQixHQUFHLG1CQUFtQjthQUM1QyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN6RCxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsMEJBQTBCLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUNoRCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FDWixLQUFpQixFQUNqQixRQUFzQixFQUN0QixhQUFxQjtRQUVyQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyw2Q0FBNkM7UUFDdEUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFekUsOENBQThDO1FBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO1lBQ3hCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxzQ0FBc0M7WUFDN0MsQ0FBQyxFQUFFLGFBQWE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCw0QkFBNEI7SUFDNUIsNkJBQTZCO0lBRTdCLDhEQUE4RDtJQUM5RCw4Q0FBOEM7SUFDOUMsb0RBQW9EO0lBRXBELHNDQUFzQztJQUN0QywrRUFBK0U7SUFDL0UsSUFBSTtJQUVKLHdCQUF3QixDQUN0QixLQUFpQixFQUNqQixLQUFhLEVBQ2IsS0FBYSxFQUNiLGFBQXFCLEVBQ3JCLElBQVc7UUFFWCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLHFCQUFxQjtRQUNyQixNQUFNLGNBQWMsR0FBRyxhQUFhLEdBQUcsR0FBRyxDQUFDO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLCtCQUErQjtRQUNwRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxHQUFHLGNBQWMsQ0FBQztRQUVsRCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7WUFDcEMsSUFBSSxDQUFDLFdBQVc7aUJBQ2IsUUFBUSxFQUFFO2lCQUNWLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztZQUN2QyxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztZQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQzdELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFpQjtRQUNuQyxJQUFJLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDakUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBRUQseUJBQXlCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxhQUFxQjtRQUNuRSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBRXRELDREQUE0RDtRQUM1RCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLG1DQUFtQztZQUNuQyxJQUFJLENBQUMsNEJBQTRCO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7WUFDeEQsSUFBSSxDQUFDLG9DQUFvQztnQkFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUM7WUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDakQsV0FBVyxFQUFFLElBQUksQ0FBQyw0QkFBNEI7Z0JBQzlDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQ0FBb0M7YUFDL0QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELGlCQUFpQjtRQUNqQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXO2FBQ2IsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFrQjtRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFO1lBQ3RDLFdBQVcsRUFBRSxJQUFJLENBQUMsNEJBQTRCO1lBQzlDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQ0FBb0M7WUFDOUQsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0I7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFFNUQsMERBQTBEO1lBQzFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUM3QixhQUFhLEVBQ2IsU0FBUyxFQUNULENBQUMsRUFDRCxDQUFDLEVBQ0QsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQzNDLENBQUM7WUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTNDLCtEQUErRDtZQUMvRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUV2RCxtREFBbUQ7Z0JBQ25ELElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztvQkFFdEQsc0NBQXNDO29CQUN0QyxNQUFNLFlBQVksR0FBRzt3QkFDbkIsS0FBSyxFQUFFLE1BQU07d0JBQ2IsSUFBSSxFQUFFLE9BQU87d0JBQ2IsR0FBRyxFQUFFLFFBQVE7d0JBQ2IsTUFBTSxFQUFFLEtBQUs7cUJBQ2QsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUF3QyxDQUFDO29CQUUzRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUM1QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQy9CLENBQUM7b0JBRUYsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDaEIsb0JBQW9CO3dCQUNwQixNQUFNLFVBQVUsR0FBRzs0QkFDakIsRUFBRSxFQUFFLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFOzRCQUM1RCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU07NEJBQ2hDLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRTs0QkFDckIsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFOzRCQUM3QixhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUU7NEJBQzdCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQ0FBcUM7NEJBQy9ELG1CQUFtQixFQUFFLGFBQWE7NEJBQ2xDLEtBQUssRUFBRSxFQUFFOzRCQUNULE1BQU0sRUFBRSxJQUFJO3lCQUNiLENBQUM7d0JBRUYsMkRBQTJEO3dCQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDakUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFFRCwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsV0FBVztRQUNYLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxJQUFJLENBQUM7SUFDbkQsQ0FBQztJQUVELDJCQUEyQixDQUN6QixLQUFpQixFQUNqQixJQUFZLEVBQ1osYUFBcUI7UUFFckIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixpQ0FBaUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUUzQiwrQ0FBK0M7UUFDL0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUMvQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUN4QyxDQUFDO1FBRUYsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLHlCQUF5QjtZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELHFDQUFxQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsT0FBTyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxPQUFPLENBQUM7UUFFdkMsbUVBQW1FO1FBQ25FLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUM7UUFFeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRTtZQUNyQyxDQUFDLEVBQUUsT0FBTztZQUNWLENBQUMsRUFBRSxPQUFPO1lBQ1YsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUksQ0FBQywyQkFBMkI7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQixDQUFDLGFBQXFCO1FBQ3hDLDBDQUEwQztRQUMxQyxNQUFNLGNBQWMsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ2pFLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQXNCO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzFELE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN4QixDQUFDO1lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQztZQUVoRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEIsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FDbkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLGFBQWEsQ0FDekMsQ0FBQztZQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hCLENBQUM7WUFFRCx3REFBd0Q7WUFDeEQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNoRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUVyQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQ2xDLG1DQUFtQztvQkFDbkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQyxPQUFPO3dCQUNMLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzt3QkFDL0IsQ0FBQyxFQUFFLElBQUk7cUJBQ1IsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sZ0RBQWdEO29CQUNoRCxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztvQkFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUNsQixPQUFPO3dCQUNMLENBQUMsRUFBRSxJQUFJO3dCQUNQLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO3FCQUN2QixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sb0JBQW9CO2dCQUNwQixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUVuQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7b0JBQ2hDLGlDQUFpQztvQkFDakMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNqQyxPQUFPO3dCQUNMLENBQUMsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLHlEQUF5RDt3QkFDdkUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO3FCQUNoQyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTiw4Q0FBOEM7b0JBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDbEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLE9BQU87d0JBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLHlEQUF5RDt3QkFDeEYsQ0FBQyxFQUFFLElBQUk7cUJBQ1IsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FDWCxrREFBa0QsRUFDbEQsVUFBVSxFQUNWLEtBQUssQ0FDTixDQUFDO1lBQ0YsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsVUFBc0IsRUFBRSxLQUFhO1FBQ3ZELDJDQUEyQztRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzRCxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixPQUFPO29CQUNMLEdBQUcsSUFBSTtvQkFDUCxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQWwzQ1UsdUJBQXVCOzRGQUF2Qix1QkFBdUIsNmZDN0JwQywreHJCQSt0QkE7OzRGRGxzQmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjs0SEFLdEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFNRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBSUcsdUJBQXVCO3NCQUFoQyxNQUFNO2dCQU1nQyxTQUFTO3NCQUEvQyxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR3JDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGQsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVzY2FsYXRpb25UeXBlLCBGb3JtLCBXb3JrZmxvdywgV29ya2Zsb3dBY3Rpb24sIFdvcmtmbG93U3RhZ2UgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9tb2RlbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dEYXRhU2VydmljZSB9IGZyb20gJy4uL3dvcmtmbG93LWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUgfSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci5zdGF0ZSc7XG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBDb25uZWN0aW9uUG9pbnQsXG4gIE5vZGUsXG4gIFN3aW1sYW5lSXRlbSxcbiAgVG9vbFR5cGUsXG4gIE5vZGUgYXMgV0ZOb2RlLFxufSBmcm9tICcuLi93b3JrZmxvdy1kZXNpZ25lci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kZXNpZ25lci1jYW52YXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBzZWxlY3RlZFRvb2w6IFRvb2xUeXBlID0gbnVsbDtcbiAgQE91dHB1dCgpIGNsaWNrZWRQb3NpdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCkgc3ViZmxvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwZW5kaW5nU3RhZ2VQb3NpdGlvbjogeyBzd2ltbGFuZUluZGV4OiBudW1iZXI7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsID1cbiAgICBudWxsO1xuICBAT3V0cHV0KCkgc2hvd1N0YWdlRGlhbG9nID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgcG9zaXRpb246IGFueTtcbiAgICBpc0Zyb21Db25uZWN0aW9uOiBib29sZWFuO1xuICAgIGlzRnJvbURlY2lzaW9uPzogYm9vbGVhbjtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgfT4oKTtcbiAgQE91dHB1dCgpIHN0YWdlUHJvcGVydGllc1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBzdGFnZURhdGE6IFBhcnRpYWw8V29ya2Zsb3dTdGFnZT47XG4gIH0+KCk7XG4gIEBPdXRwdXQoKSBhY3Rpb25Qcm9wZXJ0aWVzVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGNvbm5lY3Rpb25JZDogc3RyaW5nO1xuICAgIGFjdGlvbkRhdGE6IFBhcnRpYWw8V29ya2Zsb3dBY3Rpb24+O1xuICB9PigpO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgU1ZHIGVsZW1lbnRcbiAgQFZpZXdDaGlsZCgnY2FudmFzJywgeyBzdGF0aWM6IHRydWUgfSkgY2FudmFzUmVmITogRWxlbWVudFJlZjxTVkdFbGVtZW50PjtcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG9uV2luZG93TW91c2VVcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwb3B1cCBvcGVuIGJ1dCB0aGUgbW91c2UgaXMgcmVsZWFzZWQgb3V0c2lkZSwgY2xlYW4gdXBcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zaG93U3ViZmxvd1BvcHVwICYmXG4gICAgICAhdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwICYmXG4gICAgICAhdGhpcy5wb3B1cFZpc2libGUgJiYgLy8gT25seSBlbmQgZHJhZyBpZiBubyBwb3B1cCBpcyB2aXNpYmxlXG4gICAgICB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKClcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFeHRlcm5hbCBtb3VzZXVwIGRldGVjdGVkIC0gY2xlYW5pbmcgdXAgY29ubmVjdGlvbiBkcmFnJyk7XG4gICAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FudmFzIGRpbWVuc2lvbnNcbiAgY2FudmFzV2lkdGggPSAzMDAwO1xuICBjYW52YXNIZWlnaHQgPSAyMDAwO1xuXG4gIC8vIEdyaWQgc2l6ZVxuICBncmlkU2l6ZSA9IDIwO1xuXG4gIHN3aW1sYW5lSGVpZ2h0ID0gMjYzO1xuICB2aXNpYmxlQ29ubmVjdGlvblBvaW50c05vZGVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHBvcHVwVmlzaWJsZSA9IGZhbHNlO1xuICBwb3B1cFggPSAwO1xuICBwb3B1cFkgPSAwO1xuICBhbGxvd2VkTm9kZVR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHNob3dTdGFydE5vZGVGb3JtUG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3RhcnROb2RlRm9ybXNMaXN0OiBGb3JtW10gPSBbXTtcbiAgaXNMb2FkaW5nU3RhcnROb2RlRm9ybXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3RhcnROb2RlRm9ybVBvcHVwWDogbnVtYmVyID0gMDtcbiAgc3RhcnROb2RlRm9ybVBvcHVwWTogbnVtYmVyID0gMDtcbiAgYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb246IE5vZGUgfCBudWxsID0gbnVsbDtcbiAgbm9kZUZvcm1zOiBXcml0YWJsZVNpZ25hbDxcbiAgICBSZWNvcmQ8c3RyaW5nLCB7IGZvcm1JZDogc3RyaW5nOyBmb3JtTmFtZTogc3RyaW5nIH0+XG4gID4gPSBzaWduYWwoe30pO1xuXG4gIHNob3dTdWJmbG93UG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgd29ya2Zsb3dzTGlzdDogV29ya2Zsb3dbXSA9IFtdO1xuICBpc0xvYWRpbmdXb3JrZmxvd3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3ViZmxvd1BvcHVwWDogbnVtYmVyID0gMDtcbiAgc3ViZmxvd1BvcHVwWTogbnVtYmVyID0gMDtcbiAgcGVuZGluZ1N1YmZsb3dQb3NpdGlvbjoge1xuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbjoge1xuICAgIGRlY2lzaW9uTm9kZUlkOiBzdHJpbmc7XG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcblxuICBwZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50OiBDb25uZWN0aW9uUG9pbnQgfCBudWxsID0gbnVsbDtcbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBzaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0NvbmRpdGlvbnNEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aXZlRGVjaXNpb25Ob2RlSWQ6IHN0cmluZyA9ICcnO1xuICBhY3RpdmVDb25uZWN0aW9uSWQ6IHN0cmluZyA9ICcnO1xuICBkZWNpc2lvbkNvbmRpdGlvblBvcHVwWDogbnVtYmVyID0gMDtcbiAgZGVjaXNpb25Db25kaXRpb25Qb3B1cFk6IG51bWJlciA9IDA7XG5cbiAgaXNDcmVhdGluZ1N0YWdlRnJvbURlY2lzaW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHBlbmRpbmdEZWNpc2lvbkNvbmRpdGlvbjogc3RyaW5nID0gJyc7XG4gIGFjdGl2ZVN0YWdlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBhY3RpdmVBY3Rpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc2hvd1N0YWdlRGlhbG9nTG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBhY3RpdmVFc2NhbGF0aW9uVHlwZTogV3JpdGFibGVTaWduYWw8RXNjYWxhdGlvblR5cGUgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcbiAgYWN0aXZlU3RhZ2VDb2RlOiBXcml0YWJsZVNpZ25hbDxzdHJpbmcgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcbiAgYWN0aXZlU3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+ID0ge307XG4gIGFjdGl2ZUFjdGlvbkRhdGE6IENvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBzaG93QWN0aW9uRGlhbG9nTG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwb3RlbnRpYWxUYXJnZXRQb2ludElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdGU6IFdvcmtmbG93RGVzaWduZXJTdGF0ZSxcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBXb3JrZmxvd0RhdGFTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDYW52YXNTaXplKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgbW91c2UgY2xpY2sgb24gY2FudmFzXG4gIG9uQ2FudmFzQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHByb2Nlc3MgY2FudmFzIGNsaWNrcyBpZiBhIHRvb2wgaXMgc2VsZWN0ZWRcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgY2xpY2sgb2NjdXJyZWRcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICAnQ2FudmFzIGNsaWNrZWQgYXQ6JyxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgJ3dpdGggdG9vbDonLFxuICAgICAgdGhpcy5zZWxlY3RlZFRvb2xcbiAgICApO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBzd2ltbGFuZSBpbmRleCBiYXNlZCBvbiBwb3NpdGlvblxuICAgIC8vIGNvbnN0IHN3aW1sYW5lSW5kZXggPSBNYXRoLmZsb29yKHBvc2l0aW9uLnkgLyB0aGlzLnN3aW1sYW5lSGVpZ2h0KTtcblxuICAgIC8vIE9ubHkgZW1pdCB0aGUgcG9zaXRpb24gaWYgd2UgaGF2ZSBhIHRvb2wgc2VsZWN0ZWQgYW5kIGl0J3MgYSB2YWxpZCBjbGljayBhcmVhXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUb29sKSB7XG4gICAgICB0aGlzLmNsaWNrZWRQb3NpdGlvbi5lbWl0KHtcbiAgICAgICAgeDogcG9zaXRpb24ueCxcbiAgICAgICAgeTogcG9zaXRpb24ueSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2hvd1NoaWVsZERpYWxvZyhzdGFnZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBub2RlXG4gICAgY29uc3Qgbm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChzdGFnZUlkKTtcbiAgICBpZiAobm9kZUluZm8pIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlRGF0YSA9IHsgLi4ubm9kZUluZm8ubm9kZS5zdGFnZURhdGEsIGlkOiBzdGFnZUlkIH07XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmFjdGl2ZVN0YWdlRGF0YSk7XG4gICAgICB0aGlzLnNob3dTdGFnZURpYWxvZ0xvY2FsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBvblNob3dBY3Rpb25EaWFsb2coY29ubmVjdGlvbkluZm86IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIkNPTkVDVElPTlwiLCBjb25uZWN0aW9uSW5mbyk7XG4gICAgLy8gRmluZCB0aGUgbm9kZVxuICAgIC8vIGNvbnN0IGNvbm5lY3Rpb25JbmZvID0gdGhpcy5zdGF0ZS5maW5kQWN0aW9uQnlJZChhY3Rpb25JZCk7XG4gICAgaWYgKGNvbm5lY3Rpb25JbmZvKSB7XG4gICAgICB0aGlzLmFjdGl2ZUFjdGlvbklkID0gY29ubmVjdGlvbkluZm8uaWQ7XG4gICAgICB0aGlzLmFjdGl2ZUFjdGlvbkRhdGEgPSBjb25uZWN0aW9uSW5mbztcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMuYWN0aXZlQWN0aW9uRGF0YSk7XG4gICAgICB0aGlzLnNob3dBY3Rpb25EaWFsb2dMb2NhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgb25TaG93RXNjYWxhdGlvbkRpYWxvZyhldmVudDoge1xuICAgIHN0YWdlSWQ6IHN0cmluZztcbiAgICB0eXBlOiBFc2NhbGF0aW9uVHlwZTtcbiAgfSk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIG5vZGVcbiAgICBjb25zdCBub2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGV2ZW50LnN0YWdlSWQpO1xuICAgIGlmIChub2RlSW5mbykge1xuICAgICAgdGhpcy5hY3RpdmVTdGFnZUlkID0gZXZlbnQuc3RhZ2VJZDtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VEYXRhID0gbm9kZUluZm8ubm9kZS5zdGFnZURhdGEgfHwge1xuICAgICAgICBpZDogdGhpcy5hY3RpdmVTdGFnZUlkLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYWN0aXZlRXNjYWxhdGlvblR5cGUuc2V0KGV2ZW50LnR5cGUpO1xuICAgICAgdGhpcy5hY3RpdmVTdGFnZUNvZGUuc2V0KHRoaXMuYWN0aXZlU3RhZ2VEYXRhPy5Db2RlIHx8ICcnKTtcbiAgICAgIGNvbnNvbGUubG9nKCdBY3RpdmUgU3RhZ2UgRGF0YTonLCB0aGlzLmFjdGl2ZVN0YWdlRGF0YSk7XG4gICAgICBjb25zb2xlLmxvZygnRXNjYWxhdGlvbiBUeXBlOicsIHRoaXMuYWN0aXZlRXNjYWxhdGlvblR5cGUoKSk7XG4gICAgICB0aGlzLnNob3dFc2NhbGF0aW9uRGlhbG9nTG9jYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB0aGlzIG1ldGhvZCB0byBoYW5kbGUgZGlhbG9nIGNsb3N1cmVcbiAgb25TdGFnZURpYWxvZ0Nsb3NlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dTdGFnZURpYWxvZ0xvY2FsID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVTdGFnZUlkID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVN0YWdlRGF0YSA9IHt9O1xuICB9XG5cbiAgb25BY3Rpb25EaWFsb2dDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93QWN0aW9uRGlhbG9nTG9jYWwgPSBmYWxzZTtcbiAgICB0aGlzLmFjdGl2ZUFjdGlvbklkID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZUFjdGlvbkRhdGEgPSBudWxsO1xuICB9XG5cbiAgLy8gQWRkIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBkaWFsb2cgY2xvc3VyZVxuICBvbkVzY2FsYXRpb25EaWFsb2dDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RXNjYWxhdGlvbkRpYWxvZ0xvY2FsID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVTdGFnZUlkID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZUVzY2FsYXRpb25UeXBlLnNldChudWxsKTtcbiAgICB0aGlzLmFjdGl2ZVN0YWdlQ29kZS5zZXQobnVsbCk7XG4gICAgdGhpcy5hY3RpdmVTdGFnZURhdGEgPSB7fTtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc2F2aW5nIHN0YWdlIGRhdGFcbiAgb25TdGFnZURpYWxvZ1NhdmVkKHN0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZVN0YWdlSWQpIHtcbiAgICAgIC8vIEVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RhZ2VcbiAgICAgIGNvbnN0IG5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQodGhpcy5hY3RpdmVTdGFnZUlkKTtcbiAgICAgIGlmIChub2RlSW5mbykge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgICAgbm9kZUluZm8ubm9kZS5zdGFnZURhdGEgPSB7XG4gICAgICAgICAgLi4ubm9kZUluZm8ubm9kZS5zdGFnZURhdGEsXG4gICAgICAgICAgLi4uc3RhZ2VEYXRhLFxuICAgICAgICB9O1xuICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlZCBzdGFnZSBkYXRhOicsIG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhKTtcblxuICAgICAgICAvLyBFbWl0IGV2ZW50IGZvciBwYXJlbnQgY29tcG9uZW50IHRvIGtub3cgYWJvdXQgdGhlIHVwZGF0ZVxuICAgICAgICB0aGlzLnN0YWdlUHJvcGVydGllc1VwZGF0ZWQuZW1pdCh7XG4gICAgICAgICAgbm9kZUlkOiB0aGlzLmFjdGl2ZVN0YWdlSWQsXG4gICAgICAgICAgc3RhZ2VEYXRhOiBub2RlSW5mby5ub2RlLnN0YWdlRGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xuICAgIHRoaXMub25TdGFnZURpYWxvZ0Nsb3NlZCgpO1xuICB9XG5cbiAgb25BY3Rpb25EaWFsb2dTYXZlZChhY3Rpb25EYXRhOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlQWN0aW9uSWQpIHtcbiAgICAgIC8vIEVkaXRpbmcgYW4gZXhpc3Rpbmcgc3RhZ2VcbiAgICAgIC8vIGxldCBjb25uZWN0aW9uSW5mbyA9IHRoaXMuc3RhdGUuZmluZEFjdGlvbkJ5SWQodGhpcy5hY3RpdmVBY3Rpb25JZCk7XG4gICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zID0gdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uLmlkID09PSB0aGlzLmFjdGl2ZUFjdGlvbklkKSB7XG4gICAgICAgICAgY29ubmVjdGlvbi5sYWJlbCA9IGFjdGlvbkRhdGEubGFiZWw7XG4gICAgICAgICAgY29ubmVjdGlvbi5hY3Rpb24gPSBhY3Rpb25EYXRhLmFjdGlvbjtcbiAgICAgICAgICBjb25uZWN0aW9uLnRhcmdldFN0YXR1cyA9IGFjdGlvbkRhdGEudGFyZ2V0U3RhdHVzO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdVcGRhdGVkIGFjdGlvbiBkYXRhOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgZGlhbG9nXG4gICAgdGhpcy5vbkFjdGlvbkRpYWxvZ0Nsb3NlZCgpO1xuICB9XG5cbiAgdXBkYXRlQ2FudmFzU2l6ZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZXF1aXJlZEhlaWdodCA9XG4gICAgICAodGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoICsgMSkgKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzSGVpZ2h0ID0gTWF0aC5tYXgoMjAwMCwgcmVxdWlyZWRIZWlnaHQpOyAvLyBFbnN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvdXIgZGVmYXVsdCBoZWlnaHRcblxuICAgIC8vIFVwZGF0ZSBhbGwgdGhlIHN3aW1sYW5lIGNsaXAgcGF0aHMgd2hlbiBzaXplIGNoYW5nZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUuc3dpbWxhbmVzLmZvckVhY2goKHN3aW1sYW5lLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjbGlwUGF0aElkID0gYHN3aW1sYW5lLWNsaXAtJHtpbmRleH1gO1xuICAgICAgICBjb25zdCBjbGlwUGF0aEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjbGlwUGF0aElkKTtcbiAgICAgICAgaWYgKGNsaXBQYXRoRWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IHJlY3RFbGVtZW50ID0gY2xpcFBhdGhFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3JlY3QnKTtcbiAgICAgICAgICBpZiAocmVjdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJlY3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCB0aGlzLmNhbnZhc1dpZHRoLnRvU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIFNWRyBjYW52YXNcbiAgcHJpdmF0ZSBnZXRNb3VzZVBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHtcbiAgICAvLyBVc2UgY2xpZW50WC9ZIGFuZCBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBmb3IgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgICB5OiBldmVudC5jbGllbnRZIC0gcmVjdC50b3AsXG4gICAgfTtcbiAgfVxuXG4gIHNob3dDb25uZWN0aW9uUG9pbnRzKG5vZGVJZDogc3RyaW5nLCBzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID0gbm9kZUlkO1xuICB9XG5cbiAgaXNNb3VzZU92ZXJOb2RlKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGU6IFdGTm9kZSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnN0IG5vZGVCb3VuZHMgPSB0aGlzLmdldE5vZGVCb3VuZHNXaXRoUGFkZGluZyhub2RlLCBzd2ltbGFuZUluZGV4KTtcblxuICAgIHJldHVybiAoXG4gICAgICBwb3NpdGlvbi54ID49IG5vZGVCb3VuZHMueCAmJlxuICAgICAgcG9zaXRpb24ueCA8PSBub2RlQm91bmRzLnggKyBub2RlQm91bmRzLndpZHRoICYmXG4gICAgICBwb3NpdGlvbi55ID49IG5vZGVCb3VuZHMueSAmJlxuICAgICAgcG9zaXRpb24ueSA8PSBub2RlQm91bmRzLnkgKyBub2RlQm91bmRzLmhlaWdodFxuICAgICk7XG4gIH1cblxuICAvLyBoZWxwZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBub2RlIGJvdW5kcyB3aXRoIHBhZGRpbmdcbiAgZ2V0Tm9kZUJvdW5kc1dpdGhQYWRkaW5nKFxuICAgIG5vZGU6IFdGTm9kZSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgcGFkZGluZyA9IDEwOyAvLyBBZGQgMTBweCBwYWRkaW5nIGFyb3VuZCBub2RlcyBmb3IgZWFzaWVyIGhvdmVyIGRldGVjdGlvblxuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhYnNvbHV0ZSBZIHBvc2l0aW9uIGluY2x1ZGluZyBzd2ltbGFuZSBvZmZzZXRcbiAgICBjb25zdCBhYnNvbHV0ZVkgPSBub2RlLnkgKyBzd2ltbGFuZUluZGV4ICogMjYzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IG5vZGUueCAtIHBhZGRpbmcsXG4gICAgICB5OiBhYnNvbHV0ZVkgLSBwYWRkaW5nLFxuICAgICAgd2lkdGg6IG5vZGUud2lkdGggKyBwYWRkaW5nICogMixcbiAgICAgIGhlaWdodDogbm9kZS5oZWlnaHQgKyBwYWRkaW5nICogMixcbiAgICB9O1xuICB9XG5cbiAgaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQgJiZcbiAgICAgICF0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKClcbiAgICApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzQ29ubmVjdGlvblBvaW50VmlzaWJsZShub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID09PSBub2RlSWQ7XG4gIH1cblxuICBzdGFydENvbm5lY3Rpb25EcmFnKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHBvaW50OiBDb25uZWN0aW9uUG9pbnQsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV4aXQgcG9pbnQgbm9kZVxuICAgIGNvbnN0IG5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQocG9pbnQubm9kZUlkKTtcbiAgICBpZiAoXG4gICAgICBub2RlSW5mbyAmJlxuICAgICAgbm9kZUluZm8ubm9kZS50eXBlID09PSAnc3RhZ2UnICYmXG4gICAgICBub2RlSW5mby5ub2RlLnN0YWdlRGF0YT8uSXNFeGl0UG9pbnRcbiAgICApIHtcbiAgICAgIC8vIERvbid0IGFsbG93IGNvbm5lY3Rpb25zIGZyb20gZXhpdCBwb2ludHNcbiAgICAgIGNvbnNvbGUubG9nKCdDYW5ub3QgY3JlYXRlIGNvbm5lY3Rpb25zIGZyb20gZXhpdCBwb2ludHMnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy5zdGF0ZS5zdGFydENvbm5lY3Rpb25EcmFnKFxuICAgICAgcG9pbnQsXG4gICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnlcbiAgICApO1xuXG4gICAgLy8gQWRkIG1vdXNlIG1vdmUgYW5kIG1vdXNlIHVwIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgaGlnaGxpZ2h0UG90ZW50aWFsVGFyZ2V0cyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSByZXR1cm47XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3QgdGFyZ2V0UG9pbnRJbmZvID0gdGhpcy5maW5kQ29ubmVjdGlvblBvaW50QXRQb3NpdGlvbihcbiAgICAgIHBvc2l0aW9uLngsXG4gICAgICBwb3NpdGlvbi55XG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRhcmdldFBvaW50SW5mbyAmJlxuICAgICAgdGFyZ2V0UG9pbnRJbmZvLnBvaW50LmlkICE9PSB0aGlzLnBvdGVudGlhbFRhcmdldFBvaW50SWRcbiAgICApIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBuZXcgdGFyZ2V0IHBvaW50XG4gICAgICB0aGlzLnBvdGVudGlhbFRhcmdldFBvaW50SWQgPSB0YXJnZXRQb2ludEluZm8ucG9pbnQuaWQ7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0UG9pbnRJbmZvICYmIHRoaXMucG90ZW50aWFsVGFyZ2V0UG9pbnRJZCkge1xuICAgICAgLy8gV2UncmUgbm8gbG9uZ2VyIG92ZXIgYSB0YXJnZXQgcG9pbnRcbiAgICAgIHRoaXMucG90ZW50aWFsVGFyZ2V0UG9pbnRJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGFycm93IGZ1bmN0aW9ucyB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICBvbk1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZUNvbm5lY3Rpb25EcmFnKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgIHRoaXMuaGlnaGxpZ2h0UG90ZW50aWFsVGFyZ2V0cyhldmVudCk7XG4gIH07XG5cbiAgdXBkYXRlQ29ubmVjdGlvbkRyYWcoY3VycmVudFg6IG51bWJlciwgY3VycmVudFk6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQpIHtcbiAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5jdXJyZW50WCA9IGN1cnJlbnRYO1xuICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLmN1cnJlbnRZID0gY3VycmVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB3aGljaCBzd2ltbGFuZSB0aGUgY3Vyc29yIGlzIG92ZXJcbiAgICAgIGNvbnN0IHN3aW1sYW5lSW5kZXggPSBNYXRoLmZsb29yKGN1cnJlbnRZIC8gdGhpcy5zd2ltbGFuZUhlaWdodCk7XG4gICAgICBpZiAoc3dpbWxhbmVJbmRleCA+PSAwICYmIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgc3dpbWxhbmUgaXMgZnVsbHkgdmlzaWJsZVxuICAgICAgICB0aGlzLmVuc3VyZVN3aW1sYW5lSW5WaWV3KHN3aW1sYW5lSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uTW91c2VVcCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc29sZS5sb2coJ01vdXNlIHVwIGF0IHBvc2l0aW9uOicsIHBvc2l0aW9uKTtcbiAgICBjb25zb2xlLmxvZygnSXMgY29ubmVjdGlvbiBkcmFnZ2luZzonLCB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpO1xuXG4gICAgLy8gT25seSBwcm9jZWVkIGlmIHdlIGFyZSBkcmFnZ2luZyBhIGNvbm5lY3Rpb25cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGRyb3BwaW5nIG9udG8gYSBjb25uZWN0aW9uIHBvaW50XG4gICAgY29uc3QgdGFyZ2V0UG9pbnRJbmZvID0gdGhpcy5maW5kQ29ubmVjdGlvblBvaW50QXRQb3NpdGlvbihcbiAgICAgIHBvc2l0aW9uLngsXG4gICAgICBwb3NpdGlvbi55XG4gICAgKTtcblxuICAgIGlmICh0YXJnZXRQb2ludEluZm8pIHtcbiAgICAgIC8vIFdlIGZvdW5kIGEgdGFyZ2V0IGNvbm5lY3Rpb24gcG9pbnRcbiAgICAgIGNvbnNvbGUubG9nKCdGb3VuZCB0YXJnZXQgY29ubmVjdGlvbiBwb2ludDonLCB0YXJnZXRQb2ludEluZm8pO1xuXG4gICAgICAvLyBHZXQgdGhlIHNvdXJjZSBwb2ludCBhbmQgc3dpbWxhbmUgaW5kZXhcbiAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50O1xuICAgICAgY29uc3Qgc291cmNlU3dpbWxhbmVJbmRleCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VTd2ltbGFuZUluZGV4O1xuXG4gICAgICBpZiAoc291cmNlUG9pbnQgJiYgc291cmNlU3dpbWxhbmVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFByZXZlbnQgY29ubmVjdGluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgIGlmIChzb3VyY2VQb2ludC5ub2RlSWQgIT09IHRhcmdldFBvaW50SW5mby5ub2RlSWQpIHtcbiAgICAgICAgICAvLyBHZXQgc291cmNlIGFuZCB0YXJnZXQgbm9kZSB0eXBlcyB0byBjaGVjayBpZiBjb25uZWN0aW9uIGlzIGFsbG93ZWRcbiAgICAgICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHNvdXJjZVBvaW50Lm5vZGVJZCk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChcbiAgICAgICAgICAgIHRhcmdldFBvaW50SW5mby5ub2RlSWRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc291cmNlTm9kZUluZm8gJiZcbiAgICAgICAgICAgIHRhcmdldE5vZGVJbmZvICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNhbkNvbm5lY3QoXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUluZm8ubm9kZS50eXBlXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGlkOiBgY29ubi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YCxcbiAgICAgICAgICAgICAgc291cmNlTm9kZUlkOiBzb3VyY2VQb2ludC5ub2RlSWQsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJZDogdGFyZ2V0UG9pbnRJbmZvLm5vZGVJZCxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50SW5mby5wb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogdGFyZ2V0UG9pbnRJbmZvLnN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIHRvIGNvbm5lY3Rpb25zIGFycmF5XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRlZCBkaXJlY3QgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzOicsIGNvbm5lY3Rpb24pO1xuXG4gICAgICAgICAgICAvLyBOb3RpZnkgYWJvdXQgY29ubmVjdGlvbiBjcmVhdGlvblxuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgJ0Nhbm5vdCBjb25uZWN0IHRoZXNlIG5vZGUgdHlwZXM6JyxcbiAgICAgICAgICAgICAgc291cmNlTm9kZUluZm8/Lm5vZGUudHlwZSxcbiAgICAgICAgICAgICAgJy0+JyxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUluZm8/Lm5vZGUudHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBjb25uZWN0IGEgbm9kZSB0byBpdHNlbGYnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZ1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSBwb3NpdGlvbiBpcyB3aXRoaW4gYW55IHN3aW1sYW5lXG4gICAgY29uc3QgaXNJbnNpZGVTd2ltbGFuZSA9IHRoaXMuaXNQb3NpdGlvbkluc2lkZVN3aW1sYW5lKHBvc2l0aW9uLnkpO1xuICAgIGNvbnNvbGUubG9nKCdJcyBpbnNpZGUgc3dpbWxhbmU6JywgaXNJbnNpZGVTd2ltbGFuZSk7XG5cbiAgICAvLyBPbmx5IHNob3cgcG9wdXAgaWYgd2l0aGluIGEgc3dpbWxhbmVcbiAgICBpZiAoaXNJbnNpZGVTd2ltbGFuZSAmJiB0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdTaG93aW5nIGNvbm5lY3Rpb24gcG9wdXAnKTtcbiAgICAgIHRoaXMuc2hvd0Nvbm5lY3Rpb25Qb3B1cChwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kIHRoZSBjb25uZWN0aW9uIGRyYWcgaWYgb3V0c2lkZSBhIHN3aW1sYW5lXG4gICAgICBjb25zb2xlLmxvZygnRW5kaW5nIGNvbm5lY3Rpb24gZHJhZyB3aXRob3V0IHNob3dpbmcgcG9wdXAnKTtcbiAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICB9XG4gIH07XG5cbiAgZmluZENvbm5lY3Rpb25Qb2ludEF0UG9zaXRpb24oXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB0b2xlcmFuY2U6IG51bWJlciA9IDEwXG4gICk6IHtcbiAgICBwb2ludDogQ29ubmVjdGlvblBvaW50O1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgfSB8IG51bGwge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgc3dpbWxhbmVzIGFuZCBub2RlcyB0byBmaW5kIGNvbm5lY3Rpb24gcG9pbnRzXG4gICAgZm9yIChcbiAgICAgIGxldCBzd2ltbGFuZUluZGV4ID0gMDtcbiAgICAgIHN3aW1sYW5lSW5kZXggPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7XG4gICAgICBzd2ltbGFuZUluZGV4KytcbiAgICApIHtcbiAgICAgIGNvbnN0IHN3aW1sYW5lID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXNbc3dpbWxhbmVJbmRleF07XG5cbiAgICAgIGlmICghc3dpbWxhbmUubm9kZXMpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygc3dpbWxhbmUubm9kZXMpIHtcbiAgICAgICAgaWYgKCFub2RlLmNvbm5lY3Rpb25Qb2ludHMpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgKGluY2x1ZGluZyBzd2ltbGFuZSBvZmZzZXQpXG4gICAgICAgIGNvbnN0IGFic29sdXRlTm9kZVggPSBub2RlLng7XG4gICAgICAgIGNvbnN0IGFic29sdXRlTm9kZVkgPSBub2RlLnkgKyBzd2ltbGFuZUluZGV4ICogdGhpcy5zd2ltbGFuZUhlaWdodDtcblxuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIG5vZGUuY29ubmVjdGlvblBvaW50cykge1xuICAgICAgICAgIC8vIENhbGN1bGF0ZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY29ubmVjdGlvbiBwb2ludFxuICAgICAgICAgIGNvbnN0IHBvaW50WCA9IGFic29sdXRlTm9kZVggKyBwb2ludC54O1xuICAgICAgICAgIGNvbnN0IHBvaW50WSA9IGFic29sdXRlTm9kZVkgKyBwb2ludC55O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIHdpdGhpbiB0b2xlcmFuY2Ugb2YgdGhpcyBwb2ludFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIE1hdGguYWJzKHggLSBwb2ludFgpIDw9IHRvbGVyYW5jZSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoeSAtIHBvaW50WSkgPD0gdG9sZXJhbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwb2ludDogcG9pbnQsXG4gICAgICAgICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgc3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpc1Bvc2l0aW9uSW5zaWRlU3dpbWxhbmUoeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgeSBwb3NpdGlvbiBpcyB3aXRoaW4gYW55IHN3aW1sYW5lXG4gICAgY29uc3Qgc3dpbWxhbmVDb3VudCA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aDtcbiAgICBpZiAoc3dpbWxhbmVDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRWFjaCBzd2ltbGFuZSBoYXMgYSBoZWlnaHQgb2YgMjYzcHhcbiAgICBjb25zdCB0b3RhbFN3aW1sYW5lSGVpZ2h0ID0gc3dpbWxhbmVDb3VudCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICAvLyBDaGVjayBpZiB5IGlzIHdpdGhpbiB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBzd2ltbGFuZXNcbiAgICByZXR1cm4geSA+PSAwICYmIHkgPCB0b3RhbFN3aW1sYW5lSGVpZ2h0O1xuICB9XG5cbiAgc2hvd0Nvbm5lY3Rpb25Qb3B1cCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTaG93aW5nIGNvbm5lY3Rpb24gcG9wdXAgYXQ6JywgeCwgeSk7XG4gICAgdGhpcy5wb3B1cFggPSB4O1xuICAgIHRoaXMucG9wdXBZID0geTtcblxuICAgIC8vIEdldCBhbGxvd2VkIG5vZGUgdHlwZXMgYmFzZWQgb24gdGhlIHNvdXJjZSBub2RlIHR5cGVcbiAgICB0aGlzLmFsbG93ZWROb2RlVHlwZXMgPSB0aGlzLnN0YXRlLmdldEFsbG93ZWRUYXJnZXROb2RlVHlwZXMoKTtcbiAgICBjb25zb2xlLmxvZygnQWxsb3dlZCBub2RlIHR5cGVzOicsIHRoaXMuYWxsb3dlZE5vZGVUeXBlcyk7XG5cbiAgICAvLyBPbmx5IHNob3cgdGhlIHBvcHVwIGlmIHdlIGhhdmUgYWxsb3dlZCBub2RlIHR5cGVzXG4gICAgaWYgKHRoaXMuYWxsb3dlZE5vZGVUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnBvcHVwVmlzaWJsZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZygnUG9wdXAgdmlzaWJpbGl0eSBzZXQgdG8gdHJ1ZScpO1xuXG4gICAgICAvLyBGb3JjZSB0aGUgcG9wdXAgdG8gYmUgdmlzaWJsZSBpbiB0aGUgbmV4dCB0aWNrXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0lzIHBvcHVwIHZpc2libGUgaW4gbmV4dCB0aWNrOicsIHRoaXMucG9wdXBWaXNpYmxlKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBhbGxvd2VkIG5vZGUgdHlwZXMsIGp1c3QgZW5kIHRoZSBkcmFnXG4gICAgICBjb25zb2xlLmxvZygnTm8gYWxsb3dlZCBub2RlIHR5cGVzLCBlbmRpbmcgZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGVDb25uZWN0aW9uUG9wdXAoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0NhbGwgdG8gaGlkZScpO1xuICAgIHRoaXMucG9wdXBWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICB9XG5cbiAgLy8gQWRkIHRoaXMgaGFuZGxlciB0byBjbG9zZSB0aGUgcG9wdXAgd2hlbiBjbGlja2luZyBvdXRzaWRlXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgLy8gb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gIC8vICAgaWYgKHRoaXMucG9wdXBWaXNpYmxlKSB7XG4gIC8vICAgICBjb25zdCBwb3B1cEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd2ZXJiZW4tcG9wLVVwJyk7XG4gIC8vICAgICBpZiAocG9wdXBFbGVtZW50ICYmICFwb3B1cEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gIC8vICAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGNyZWF0ZU5vZGVDb25uZWN0aW9uKG5vZGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvblBhdGhEYXRhKCk7XG4gICAgaWYgKCFwYXRoRGF0YSkge1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIHR5cGUgaXMgYWxsb3dlZCB0byBiZSBjcmVhdGVkXG4gICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdGhpcy5zdGF0ZS5nZXRBbGxvd2VkVGFyZ2V0Tm9kZVR5cGVzKCk7XG4gICAgaWYgKCFhbGxvd2VkVHlwZXMuaW5jbHVkZXMobm9kZVR5cGUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgQ2Fubm90IGNyZWF0ZSBjb25uZWN0aW9uIHRvICR7bm9kZVR5cGV9IGZyb20gY3VycmVudCBub2RlIHR5cGVgXG4gICAgICApO1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBlbmRYLCBlbmRZLCBzb3VyY2VTd2ltbGFuZUluZGV4IH0gPSBwYXRoRGF0YTtcblxuICAgIC8vIEdldCBzb3VyY2Ugbm9kZSBpbmZvXG4gICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQ7XG4gICAgaWYgKCFzb3VyY2VQb2ludCkge1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChzb3VyY2VQb2ludC5ub2RlSWQpO1xuICAgIGlmICghc291cmNlTm9kZUluZm8pIHtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGNvbm5lY3RpbmcgZnJvbSBhIGRlY2lzaW9uIHRvIGEgc3RhZ2UsIHNob3cgY29uZGl0aW9uIHBvcHVwIGZpcnN0XG4gICAgaWYgKHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ2RlY2lzaW9uJyAmJiBub2RlVHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgLy8gU3RvcmUgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHN0YWdlIGNyZWF0aW9uXG4gICAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbkNvbm5lY3Rpb24gPSB7XG4gICAgICAgIGRlY2lzaW9uTm9kZUlkOiBzb3VyY2VOb2RlSW5mby5ub2RlLmlkLFxuICAgICAgICBzd2ltbGFuZUluZGV4OiBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgICB4OiBlbmRYLFxuICAgICAgICB5OiBlbmRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBvcHVwIHBvc2l0aW9uIC0gcG9zaXRpb24gaXQgbmVhciB0aGUgZGVjaXNpb24gbm9kZVxuICAgICAgY29uc3Qgc3dpbWxhbmVPZmZzZXRZID0gc291cmNlU3dpbWxhbmVJbmRleCAqIDI2MztcblxuICAgICAgLy8gQ2VudGVyIHRoZSBwb3B1cCBvdmVyIHRoZSBjb25uZWN0aW9uIGVuZHBvaW50XG4gICAgICB0aGlzLmRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYID0gZW5kWDtcbiAgICAgIHRoaXMuZGVjaXNpb25Db25kaXRpb25Qb3B1cFkgPSBlbmRZIC0gMTUwOyAvLyBQb3NpdGlvbiBhYm92ZSB0aGUgZW5kcG9pbnRcblxuICAgICAgLy8gU2V0IGRlY2lzaW9uIG5vZGUgSURcbiAgICAgIHRoaXMuYWN0aXZlRGVjaXNpb25Ob2RlSWQgPSBzb3VyY2VOb2RlSW5mby5ub2RlLmlkO1xuICAgICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSB0cnVlO1xuXG4gICAgICAvLyBFbmQgdGhlIGNvbm5lY3Rpb24gZHJhZ1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3dpbWxhbmVJbmRleCA9IE1hdGguZmxvb3IoZW5kWSAvIHRoaXMuc3dpbWxhbmVIZWlnaHQpO1xuICAgIGNvbnN0IHN3aW1sYW5lVG9wID0gc3dpbWxhbmVJbmRleCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG4gICAgLy8gQ2FsY3VsYXRlIHN3aW1sYW5lLXJlbGF0aXZlIHBvc2l0aW9uXG4gICAgY29uc3Qgc3dpbWxhbmVPZmZzZXRZID0gc291cmNlU3dpbWxhbmVJbmRleCAqIDI2MztcbiAgICBsZXQgcmVsYXRpdmVZID0gZW5kWSAtIHN3aW1sYW5lT2Zmc2V0WSAtIDUwOyAvLyBBZGQgaGFsZiBub2RlIGhlaWdodCBmb3IgYmV0dGVyIGFsaWdubWVudFxuICAgIGNvbnN0IHN3aW1sYW5lQm90dG9tID0gc3dpbWxhbmVUb3AgKyAyNjM7XG5cbiAgICAvLyBDbGFtcCBub2RlWSBzbyBub2RlIHN0YXlzIHdpdGhpbiBzd2ltbGFuZVxuXG4gICAgY29uc29sZS5sb2coZW5kWSwgc3dpbWxhbmVJbmRleCwgc3dpbWxhbmVPZmZzZXRZLCBzd2ltbGFuZUJvdHRvbSk7XG5cbiAgICBpZiAoZW5kWSAtIDUwIDwgc3dpbWxhbmVUb3ApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdMZXNzJyk7XG4gICAgICByZWxhdGl2ZVkgPSBzd2ltbGFuZVRvcDsgLy8gTm9kZSB3b3VsZCBvdmVyZmxvdyBhYm92ZSwgc28gYWxpZ24gdG8gdG9wXG4gICAgfSBlbHNlIGlmIChlbmRZICsgNTAgPiBzd2ltbGFuZUJvdHRvbSkge1xuICAgICAgY29uc29sZS5sb2coJ01vcmUnKTtcbiAgICAgIHJlbGF0aXZlWSA9IHN3aW1sYW5lQm90dG9tIC0gMTAwOyAvLyBOb2RlIHdvdWxkIG92ZXJmbG93IGJlbG93LCBzbyBhbGlnbiB0byBib3R0b21cbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJlY29uZGl0aW9ucyBiYXNlZCBvbiBub2RlIHR5cGVcbiAgICBpZiAobm9kZVR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgc3RhZ2UgZGlyZWN0bHkgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICAgICdzdGFnZScsXG4gICAgICAgIGVuZFgsXG4gICAgICAgIHJlbGF0aXZlWSxcbiAgICAgICAgeyBOYW1lOiAnTmV3IFN0YWdlJyB9IC8vIEFkZCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbmV3Tm9kZSAmJlxuICAgICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMgJiZcbiAgICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgc291cmNlUG9pbnRcbiAgICAgICkge1xuICAgICAgICAvLyBIYW5kbGUgY29ubmVjdGlvbiBjcmVhdGlvblxuICAgICAgICBjb25zdCBvcHBvc2luZ1R5cGUgPSB7XG4gICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgfVtzb3VyY2VQb2ludC50eXBlXSBhcyAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JztcblxuICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IG5ld05vZGUuY29ubmVjdGlvblBvaW50cy5maW5kKFxuICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IG9wcG9zaW5nVHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0YXJnZXRQb2ludCkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29ubmVjdGlvblxuICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLnN0YXRlLmNyZWF0ZUNvbm5lY3Rpb24oXG4gICAgICAgICAgICBuZXdOb2RlLmlkLFxuICAgICAgICAgICAgdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAobm9kZVR5cGUgPT09ICdzdWJmbG93Jykge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdDcmVhdGluZyBzdWJmbG93IGZyb20gY29ubmVjdGlvbiBhdDonLFxuICAgICAgICBlbmRYLFxuICAgICAgICBlbmRZLFxuICAgICAgICAnc3dpbWxhbmU6JyxcbiAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleFxuICAgICAgKTtcbiAgICAgIC8vIFNob3cgd29ya2Zsb3cgc2VsZWN0aW9uIHBvcHVwIGFuZCBzdG9yZSBjb25uZWN0aW9uIGRhdGEgZm9yIGxhdGVyIHVzZVxuICAgICAgdGhpcy5zaG93U3ViZmxvd1NlbGVjdGlvblBvcHVwKGVuZFgsIGVuZFksIHNvdXJjZVN3aW1sYW5lSW5kZXgpO1xuICAgICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIG90aGVyIG5vZGVzIENyZWF0ZSB0aGUgbmV3IG5vZGUgYXQgdGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgY29ubmVjdGlvblxuICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgbm9kZVR5cGUgYXMgVG9vbFR5cGUsXG4gICAgICBlbmRYLFxuICAgICAgcmVsYXRpdmVZXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIG5ld05vZGUgJiZcbiAgICAgIG5ld05vZGUuY29ubmVjdGlvblBvaW50cyAmJlxuICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIC8vIEZpbmQgdGhlIG1vc3QgYXBwcm9wcmlhdGUgY29ubmVjdGlvbiBwb2ludCAoY2xvc2VzdCB0byB0aGUgc291cmNlKVxuICAgICAgaWYgKHNvdXJjZVBvaW50KSB7XG4gICAgICAgIC8vIEZvciBzaW1wbGljaXR5LCB1c2UgdGhlIGZpcnN0IGNvbm5lY3Rpb24gcG9pbnQgb2Ygb3Bwb3NpbmcgdHlwZVxuICAgICAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHlvdSdkIGZpbmQgdGhlIGNsb3Nlc3Qgb3IgbW9zdCBhcHByb3ByaWF0ZSBwb2ludFxuICAgICAgICBsZXQgdGFyZ2V0UG9pbnQ7XG5cbiAgICAgICAgLy8gSWYgc291cmNlIGlzIG9uIHJpZ2h0LCB0YXJnZXQgc2hvdWxkIGJlIG9uIGxlZnQsIGV0Yy5cbiAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcbiAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgIH1bc291cmNlUG9pbnQudHlwZV0gYXMgJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbiAgICAgICAgdGFyZ2V0UG9pbnQgPSBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5zdGF0ZS5jcmVhdGVDb25uZWN0aW9uKFxuICAgICAgICAgICAgbmV3Tm9kZS5pZCxcbiAgICAgICAgICAgIHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzb3VyY2VOb2RlSW5mbykge1xuICAgICAgdGhpcy51cGRhdGVOb2RlQ29ubmVjdGlvbnMoc291cmNlTm9kZUluZm8ubm9kZSk7XG4gICAgfVxuXG4gICAgLy8gRW5kIHRoZSBjb25uZWN0aW9uIGRyYWdcbiAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byBoYW5kbGUgc2F2aW5nIHRoZSBjb25kaXRpb25cbiAgb25EZWNpc2lvbkNvbmRpdGlvblNhdmVkKGV2ZW50OiB7XG4gICAgY29ubmVjdGlvbklkOiBzdHJpbmc7XG4gICAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbikge1xuICAgICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRlY2lzaW9uTm9kZUlkLCBzd2ltbGFuZUluZGV4LCB4LCB5IH0gPVxuICAgICAgdGhpcy5wZW5kaW5nRGVjaXNpb25Db25uZWN0aW9uO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBzdGFnZSBkaXJlY3RseSB3aXRoIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgJ3N0YWdlJyxcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgeyBOYW1lOiAnTmV3IFN0YWdlJyB9IC8vIEFkZCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGNvbnN0IGRlY2lzaW9uTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChkZWNpc2lvbk5vZGVJZCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZGVjaXNpb25Ob2RlSW5mbyAmJlxuICAgICAgICBub2RlLmNvbm5lY3Rpb25Qb2ludHMgJiZcbiAgICAgICAgbm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICAvLyBGaW5kIGEgc3VpdGFibGUgY29ubmVjdGlvbiBwb2ludCBmcm9tIHRoZSBkZWNpc2lvbiBub2RlXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uTm9kZSA9IGRlY2lzaW9uTm9kZUluZm8ubm9kZTtcbiAgICAgICAgY29uc3QgZGVjaXNpb25Ob2RlUG9pbnRzID0gZGVjaXNpb25Ob2RlLmNvbm5lY3Rpb25Qb2ludHMgfHwgW107XG4gICAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gZGVjaXNpb25Ob2RlUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gJ3JpZ2h0JyB8fCBwLnR5cGUgPT09ICdib3R0b20nXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVBvaW50KSB7XG4gICAgICAgICAgLy8gRmluZCBvcHBvc2luZyB0eXBlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG5ldyBzdGFnZVxuICAgICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcbiAgICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgfVtzb3VyY2VQb2ludC50eXBlXSBhcyAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JztcblxuICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gbm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbiB3aXRoIGNvbmRpdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGBjb25uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IGRlY2lzaW9uTm9kZS5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludC5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IGRlY2lzaW9uTm9kZUluZm8uc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiBldmVudC5jb25kaXRpb24sXG4gICAgICAgICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gQWRkIGNvbm5lY3Rpb24gdG8gdGhlIHN0YXRlXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgJ0NyZWF0ZWQgZGVjaXNpb24gY29ubmVjdGlvbiB3aXRoIGNvbmRpdGlvbjonLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIHBlbmRpbmcgZGF0YVxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbiA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb25Db25kaXRpb24gPSAnJztcblxuICAgIC8vIEhpZGUgdGhlIGNvbmRpdGlvbiBwb3B1cFxuICAgIHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nID0gZmFsc2U7XG4gIH1cblxuICBvbkRlY2lzaW9uQ29uZGl0aW9uQ2FuY2VsbGVkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nID0gZmFsc2U7XG4gICAgLy8gRG9uJ3QgY3JlYXRlIHRoZSBzdGFnZSBvciBjb25uZWN0aW9uXG4gIH1cblxuICBnZXRDb25uZWN0aW9uUGF0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uUGF0aERhdGEoKTtcbiAgICBpZiAoIXBhdGhEYXRhKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCB7IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZIH0gPSBwYXRoRGF0YTtcbiAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcblxuICAgIGlmICghc291cmNlUG9pbnQpIHJldHVybiAnJztcblxuICAgIHJldHVybiB0aGlzLmdldE9ydGhvZ29uYWxQYXRoKHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZLCBzb3VyY2VQb2ludC50eXBlKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb25QYXRoRm9yU2F2ZWRDb25uZWN0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvbkRhdGEoY29ubmVjdGlvbik7XG4gICAgICBpZiAoIXBhdGhEYXRhKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHBhdGggZGF0YSBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZIH0gPSBwYXRoRGF0YTtcblxuICAgICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgICBpZiAoIXNvdXJjZU5vZGVJbmZvKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvdXJjZSBub2RlIG5vdCBmb3VuZCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VOb2RlID0gc291cmNlTm9kZUluZm8ubm9kZTtcbiAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gc291cmNlTm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAocCkgPT4gcC5pZCA9PT0gY29ubmVjdGlvbi5zb3VyY2VQb2ludElkXG4gICAgICApO1xuXG4gICAgICBpZiAoIXNvdXJjZVBvaW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvdXJjZSBwb2ludCBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3J0aG9nb25hbFBhdGgoXG4gICAgICAgIHN0YXJ0WCxcbiAgICAgICAgc3RhcnRZLFxuICAgICAgICBlbmRYLFxuICAgICAgICBlbmRZLFxuICAgICAgICBzb3VyY2VQb2ludC50eXBlXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZW5lcmF0aW5nIHBhdGggZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbiwgZXJyb3IpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGdldE9ydGhvZ29uYWxQYXRoKFxuICAgIHN0YXJ0WDogbnVtYmVyLFxuICAgIHN0YXJ0WTogbnVtYmVyLFxuICAgIGVuZFg6IG51bWJlcixcbiAgICBlbmRZOiBudW1iZXIsXG4gICAgcG9pbnRUeXBlOiAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0J1xuICApOiBzdHJpbmcge1xuICAgIC8vIERldGVybWluZSBpbml0aWFsIGRpcmVjdGlvbiBiYXNlZCBvbiBjb25uZWN0aW9uIHBvaW50IHR5cGVcbiAgICBsZXQgcGF0aCA9ICcnO1xuXG4gICAgLy8gRm9yIHNpZGUgcG9pbnRzIChsZWZ0L3JpZ2h0KSwgc3RhcnQgd2l0aCBob3Jpem9udGFsIGxpbmVcbiAgICBpZiAocG9pbnRUeXBlID09PSAnbGVmdCcgfHwgcG9pbnRUeXBlID09PSAncmlnaHQnKSB7XG4gICAgICAvLyBDYWxjdWxhdGUgaG9yaXpvbnRhbCBkaXN0YW5jZVxuICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3QgPSBlbmRYIC0gc3RhcnRYO1xuXG4gICAgICAvLyBJZiB0aGUgZW5kIHBvaW50IGlzIHZlcnkgY2xvc2UgaG9yaXpvbnRhbGx5LCB1c2UgYSBzaW1wbGUgMy1zZWdtZW50IHBhdGhcbiAgICAgIGlmIChNYXRoLmFicyhob3Jpem9udGFsRGlzdCkgPCAzMCkge1xuICAgICAgICBjb25zdCBtaWRZID0gKHN0YXJ0WSArIGVuZFkpIC8gMjtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gSCAke2VuZFh9IFYgJHttaWRZfSBWICR7ZW5kWX1gO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBwYXRoIHdpdGggaG9yaXpvbnRhbCBzZWdtZW50IGZpcnN0LCB0aGVuIHZlcnRpY2FsLCB0aGVuIGhvcml6b250YWxcbiAgICAgIGVsc2Uge1xuICAgICAgICBwYXRoID0gYE0gJHtzdGFydFh9ICR7c3RhcnRZfSBIICR7c3RhcnRYICsgaG9yaXpvbnRhbERpc3QgLyAyXG4gICAgICAgICAgfSBWICR7ZW5kWX0gSCAke2VuZFh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIHRvcC9ib3R0b20gcG9pbnRzLCBzdGFydCB3aXRoIHZlcnRpY2FsIGxpbmVcbiAgICBlbHNlIGlmIChwb2ludFR5cGUgPT09ICd0b3AnIHx8IHBvaW50VHlwZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB2ZXJ0aWNhbCBkaXN0YW5jZVxuICAgICAgY29uc3QgdmVydGljYWxEaXN0ID0gZW5kWSAtIHN0YXJ0WTtcblxuICAgICAgLy8gSWYgdGhlIGVuZCBwb2ludCBpcyB2ZXJ5IGNsb3NlIHZlcnRpY2FsbHksIHVzZSBhIHNpbXBsZSAzLXNlZ21lbnQgcGF0aFxuICAgICAgaWYgKE1hdGguYWJzKHZlcnRpY2FsRGlzdCkgPCAzMCkge1xuICAgICAgICBjb25zdCBtaWRYID0gKHN0YXJ0WCArIGVuZFgpIC8gMjtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gViAke2VuZFl9IEggJHttaWRYfSBIICR7ZW5kWH1gO1xuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgYSBwYXRoIHdpdGggdmVydGljYWwgc2VnbWVudCBmaXJzdCwgdGhlbiBob3Jpem9udGFsLCB0aGVuIHZlcnRpY2FsXG4gICAgICBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gViAke3N0YXJ0WSArIHZlcnRpY2FsRGlzdCAvIDJcbiAgICAgICAgICB9IEggJHtlbmRYfSBWICR7ZW5kWX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgc2VsZWN0Rm9ybUZvclN0YWdlKGZvcm06IEZvcm0gfCBudWxsLCBub2RlOiBOb2RlKSB7XG4gICAgLy8gSWYgZm9ybSBpcyBudWxsLCB3ZSdyZSBjbGVhcmluZyB0aGUgc2VsZWN0aW9uXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGlmICghbm9kZS5zdGFnZURhdGEpIHtcbiAgICAgICAgbm9kZS5zdGFnZURhdGEgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgbm9kZS5zdGFnZURhdGEuZm9ybUlkID0gZm9ybS5Db2RlO1xuICAgICAgICBub2RlLnN0YWdlRGF0YS5mb3JtTmFtZSA9IGZvcm0uTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENsZWFyIGZvcm0gc2VsZWN0aW9uXG4gICAgICAgIGRlbGV0ZSBub2RlLnN0YWdlRGF0YS5mb3JtSWQ7XG4gICAgICAgIGRlbGV0ZSBub2RlLnN0YWdlRGF0YS5mb3JtTmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBhbiBldmVudCB0byB1cGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgIHRoaXMub25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKHtcbiAgICAgICAgbm9kZUlkOiBub2RlLmlkLFxuICAgICAgICBzdGFnZURhdGE6IG5vZGUuc3RhZ2VEYXRhLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKGV2ZW50OiB7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+O1xuICB9KTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbm9kZSBpbiB0aGUgc3dpbWxhbmVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc3dpbWxhbmUgPSB0aGlzLnN0YXRlLnN3aW1sYW5lc1tpXTtcbiAgICAgIGNvbnN0IG5vZGVJbmRleCA9IHN3aW1sYW5lLm5vZGVzPy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGV2ZW50Lm5vZGVJZCk7XG5cbiAgICAgIGlmIChub2RlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBub2RlSW5kZXggPj0gMCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YWdlIGRhdGFcbiAgICAgICAgaWYgKHN3aW1sYW5lLm5vZGVzKSB7XG4gICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGEgPSB7XG4gICAgICAgICAgICAuLi5zd2ltbGFuZS5ub2Rlc1tub2RlSW5kZXhdLnN0YWdlRGF0YSxcbiAgICAgICAgICAgIC4uLmV2ZW50LnN0YWdlRGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgJ1VwZGF0ZWQgc3RhZ2UgZGF0YSBpbiBzd2ltbGFuZTonLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICdub2RlOicsXG4gICAgICAgICAgICBub2RlSW5kZXgsXG4gICAgICAgICAgICAnZGF0YTonLFxuICAgICAgICAgICAgc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIC8vIEFmdGVyIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkLCByZWZyZXNoIHRoZSBzb3VyY2Ugbm9kZSB0byB1cGRhdGUgaXRzIHN0YXRlXG4gICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgaWYgKHNvdXJjZU5vZGVJbmZvICYmIHNvdXJjZU5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgLy8gUmVmcmVzaCBub2RlIHN0YXRlXG4gICAgICB0aGlzLnVwZGF0ZU5vZGVDb25uZWN0aW9ucyhzb3VyY2VOb2RlSW5mby5ub2RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIHVwZGF0ZSBub2RlJ3MgY29ubmVjdGlvbiBzdGF0dXNcbiAgdXBkYXRlTm9kZUNvbm5lY3Rpb25zKG5vZGU6IFdGTm9kZSk6IHZvaWQge1xuICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgY29ubmVjdGlvbnMgdGhhdCBjb25uZWN0IHRvIHN0YWdlc1xuICAgIGNvbnN0IG91dGdvaW5nQ29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLmZpbHRlcihcbiAgICAgIChjb25uKSA9PiBjb25uLnNvdXJjZU5vZGVJZCA9PT0gbm9kZS5pZFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgdGFyZ2V0IG5vZGVzIGFyZSBzdGFnZXNcbiAgICBjb25zdCBjb25uZWN0ZWRTdGFnZU5vZGVzID0gb3V0Z29pbmdDb25uZWN0aW9uc1xuICAgICAgLm1hcCgoY29ubikgPT4gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubi50YXJnZXROb2RlSWQpKVxuICAgICAgLmZpbHRlcigobm9kZUluZm8pID0+IG5vZGVJbmZvICYmIG5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJyk7XG5cbiAgICBub2RlLmhhc011bHRpcGxlQ29ubmVjdGVkU3RhZ2VzID0gY29ubmVjdGVkU3RhZ2VOb2Rlcy5sZW5ndGggPiAxO1xuICAgIG5vZGUuaGFzUGFyYWxsZWxTdGFnZXMgPSBjb25uZWN0ZWRTdGFnZU5vZGVzLmV2ZXJ5KFxuICAgICAgKG5kKSA9PiBuZD8ubm9kZS5zdGFnZURhdGE/LklzUGFyYWxsZWxcbiAgICApO1xuICB9XG5cbiAgb25FZGl0U3dpbWxhbmUoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgc3dpbWxhbmU6IFN3aW1sYW5lSXRlbSxcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIFByZXZlbnQgdGhlIGNhbnZhcyBjbGljayBldmVudCBmcm9tIGZpcmluZ1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc29sZS5sb2coJ0VkaXQgc3dpbWxhbmUgYnV0dG9uIGNsaWNrZWQgZm9yIHN3aW1sYW5lOicsIHN3aW1sYW5lSW5kZXgpO1xuXG4gICAgLy8gRW1pdCBhIHNwZWNpYWwgZXZlbnQgZm9yIGVkaXRpbmcgYSBzd2ltbGFuZVxuICAgIHRoaXMuY2xpY2tlZFBvc2l0aW9uLmVtaXQoe1xuICAgICAgeDogLTEsIC8vIFNwZWNpYWwgdmFsdWUgdG8gaW5kaWNhdGUgZWRpdCBtb2RlXG4gICAgICB5OiBzd2ltbGFuZUluZGV4LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgLy8gICAvLyBJbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHNpbWlsYXIgdG8gdGhlIHN0YWdlIGZvcm0gcG9wdXBcbiAgLy8gICAvLyBXZSdsbCBuZWVkIHRvIGFkZCBVSSBlbGVtZW50cyBmb3IgdGhpc1xuICAvLyAgIGNvbnNvbGUubG9nKCdTdGFydCBub2RlIGZvcm0gcG9wdXAgcmVxdWVzdGVkJyk7XG5cbiAgLy8gICAvLyBGb3Igbm93LCB0aGlzIGlzIGEgcGxhY2Vob2xkZXJcbiAgLy8gICAvLyBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIHdvdWxkIGxvYWQgZm9ybXMgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3JrZmxvd1xuICAvLyB9XG5cbiAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIG5vZGVYOiBudW1iZXIsXG4gICAgbm9kZVk6IG51bWJlcixcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXIsXG4gICAgbm9kZT86IE5vZGVcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIFNldCBwb3B1cCBwb3NpdGlvblxuICAgIGNvbnN0IHN3aW1sYW5lT2Zmc2V0ID0gc3dpbWxhbmVJbmRleCAqIDI2MztcbiAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1Qb3B1cFggPSBub2RlWCAtICghbm9kZSA/IDMwIDogMCk7IC8vIFBvc2l0aW9uIG5lYXIgdGhlIHN0YXJ0IG5vZGVcbiAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1Qb3B1cFkgPSBub2RlWSArIHN3aW1sYW5lT2Zmc2V0O1xuXG4gICAgLy8gSWYgd2UncmUgb3BlbmluZyB0aGUgcG9wdXAsIGxvYWQgZm9ybXNcbiAgICBpZiAoIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCkge1xuICAgICAgdGhpcy5pc0xvYWRpbmdTdGFydE5vZGVGb3JtcyA9IHRydWU7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAgIC5nZXRGb3JtcygpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhcnROb2RlRm9ybXNMaXN0ID0gcmVzcG9uc2UuUmVzdWx0O1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSBmYWxzZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9ybXM6JywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24gPSBub2RlO1xuICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZSBub2RlIGZvciBmb3JtIHNlbGVjdGlvbjonLCBub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93U3RhcnROb2RlRm9ybVBvcHVwID0gIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cDtcbiAgfVxuXG4gIHNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybTogRm9ybSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RGb3JtRm9yU3RhZ2UoZm9ybSwgdGhpcy5hY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0V29ya2Zsb3dGb3JtKGZvcm0uQ29kZSwgZm9ybS5OYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdGUuc2V0V29ya2Zsb3dGb3JtKG51bGwsIG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBwb3B1cFxuICAgIHRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCA9IGZhbHNlO1xuICB9XG5cbiAgc2hvd1N1YmZsb3dTZWxlY3Rpb25Qb3B1cCh4OiBudW1iZXIsIHk6IG51bWJlciwgc3dpbWxhbmVJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdWJmbG93UG9wdXBYID0geDtcbiAgICB0aGlzLnN1YmZsb3dQb3B1cFkgPSB5O1xuICAgIHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbiA9IHsgc3dpbWxhbmVJbmRleCwgeCwgeSB9O1xuXG4gICAgLy8gU3RvcmUgY29ubmVjdGlvbiBkYXRhIGlmIHdlJ3JlIGNyZWF0aW5nIGZyb20gYSBjb25uZWN0aW9uXG4gICAgaWYgKHRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkge1xuICAgICAgLy8gU3RvcmUgdGhlIHNvdXJjZSBjb25uZWN0aW9uIGRhdGFcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCA9XG4gICAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludCA/PyBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXggPVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlU3dpbWxhbmVJbmRleCA/PyBudWxsO1xuICAgICAgY29uc29sZS5sb2coJ1N0b3JlZCBjb25uZWN0aW9uIGRhdGEgZm9yIHN1YmZsb3c6Jywge1xuICAgICAgICBzb3VyY2VQb2ludDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50LFxuICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvYWQgd29ya2Zsb3dzXG4gICAgdGhpcy5pc0xvYWRpbmdXb3JrZmxvd3MgPSB0cnVlO1xuICAgIHRoaXMuZGF0YVNlcnZpY2VcbiAgICAgIC5nZXRXb3JrZmxvd3MoKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMud29ya2Zsb3dzTGlzdCA9IHJlc3BvbnNlLlJlc3VsdDtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdXb3JrZmxvd3MgPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgd29ya2Zsb3dzOicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdXb3JrZmxvd3MgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zaG93U3ViZmxvd1BvcHVwID0gdHJ1ZTtcbiAgfVxuXG4gIHNlbGVjdFN1YmZsb3dXb3JrZmxvdyh3b3JrZmxvdzogV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0aW5nIHdvcmtmbG93IGZvciBzdWJmbG93OicsIHdvcmtmbG93Lk5hbWUpO1xuICAgIGNvbnNvbGUubG9nKCdQZW5kaW5nIGNvbm5lY3Rpb24gZGF0YTonLCB7XG4gICAgICBzb3VyY2VQb2ludDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50LFxuICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICBwb3NpdGlvbjogdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbikge1xuICAgICAgY29uc3QgeyBzd2ltbGFuZUluZGV4LCB4LCB5IH0gPSB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb247XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3ViZmxvdyBub2RlIHdpdGggdGhlIHNlbGVjdGVkIHdvcmtmbG93IGRhdGFcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0YXRlLmFkZE5vZGUoXG4gICAgICAgIHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICdzdWJmbG93JyxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgdW5kZWZpbmVkLCAvLyBObyBzdGFnZSBkYXRhXG4gICAgICAgIHsgaWQ6IHdvcmtmbG93LkNvZGUsIG5hbWU6IHdvcmtmbG93Lk5hbWUgfVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZWQgc3ViZmxvdyBub2RlOicsIG5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGlzIHdhcyBjcmVhdGVkIGZyb20gYSBjb25uZWN0aW9uLCBjcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChub2RlICYmIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgY29ubmVjdGlvbiB0byBuZXcgc3ViZmxvdyBub2RlJyk7XG5cbiAgICAgICAgLy8gRmluZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG5ldyBub2RlXG4gICAgICAgIGlmIChub2RlLmNvbm5lY3Rpb25Qb2ludHMgJiYgbm9kZS5jb25uZWN0aW9uUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludDtcblxuICAgICAgICAgIC8vIEZpbmQgb3Bwb3NpbmcgdHlwZSBjb25uZWN0aW9uIHBvaW50XG4gICAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBub2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09IG9wcG9zaW5nVHlwZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICBpZDogYGNvbm4tJHtEYXRlLm5vdygpfS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApfWAsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogc291cmNlUG9pbnQubm9kZUlkLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXghLFxuICAgICAgICAgICAgICB0YXJnZXRTd2ltbGFuZUluZGV4OiBzd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIGFjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEFkZCBjb25uZWN0aW9uIGRpcmVjdGx5IHRvIHRoZSBzdGF0ZSdzIGNvbm5lY3Rpb25zIGFycmF5XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQWRkZWQgY29ubmVjdGlvbiB0byBzdGF0ZTonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb25uZWN0aW9ucyBhZnRlciBhZGRpbmc6JywgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdGlvbkNyZWF0ZWQoY29ubmVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgc2VsZWN0aW9uIHRvb2wgaW4gcGFyZW50IGNvbXBvbmVudFxuICAgICAgdGhpcy5zdWJmbG93U2VsZWN0ZWQuZW1pdCgpO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwXG4gICAgdGhpcy5zaG93U3ViZmxvd1BvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQgPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIHNob3dEZWNpc2lvbkNvbmRpdGlvbnNQb3B1cChcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBub2RlOiBXRk5vZGUsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGZvciB0aGUgcG9wdXBcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgY29uc3QgZ2xvYmFsWCA9IHBvc2l0aW9uLng7XG4gICAgY29uc3QgZ2xvYmFsWSA9IHBvc2l0aW9uLnk7XG5cbiAgICAvLyBGaW5kIGFsbCBjb25uZWN0aW9ucyBmcm9tIHRoaXMgZGVjaXNpb24gbm9kZVxuICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5maWx0ZXIoXG4gICAgICAoY29ubikgPT4gY29ubi5zb3VyY2VOb2RlSWQgPT09IG5vZGUuaWRcbiAgICApO1xuXG4gICAgaWYgKGNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gTm8gY29ubmVjdGlvbnMgdG8gc2hvd1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNob3cgdGhlIGRlY2lzaW9uIGNvbmRpdGlvbnMgcG9wdXBcbiAgICB0aGlzLmFjdGl2ZURlY2lzaW9uTm9kZUlkID0gbm9kZS5pZDtcbiAgICB0aGlzLmRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYID0gZ2xvYmFsWDtcbiAgICB0aGlzLmRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZID0gZ2xvYmFsWTtcblxuICAgIC8vIFNldCB0aGUgY29ycmVjdCBwb3B1cCB2aXNpYmlsaXR5IGZsYWcgLSB0aGlzIGlzIGxpa2VseSB0aGUgaXNzdWVcbiAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IHRydWU7XG5cbiAgICBjb25zb2xlLmxvZygnU2hvd2luZyBkZWNpc2lvbiBwb3B1cDonLCB7XG4gICAgICB4OiBnbG9iYWxYLFxuICAgICAgeTogZ2xvYmFsWSxcbiAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgIGlzVmlzaWJsZTogdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2csXG4gICAgfSk7XG4gIH1cblxuICBlbnN1cmVTd2ltbGFuZUluVmlldyhzd2ltbGFuZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBlbm91Z2ggc3dpbWxhbmVzIHZpc2libGVcbiAgICBjb25zdCByZXF1aXJlZEhlaWdodCA9IChzd2ltbGFuZUluZGV4ICsgMSkgKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIGlmICh0aGlzLmNhbnZhc0hlaWdodCA8IHJlcXVpcmVkSGVpZ2h0KSB7XG4gICAgICB0aGlzLmNhbnZhc0hlaWdodCA9IHJlcXVpcmVkSGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIGdldExhYmVsUG9zaXRpb24oY29ubmVjdGlvbjogQ29ubmVjdGlvbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhdGhEYXRhID0gdGhpcy5zdGF0ZS5nZXRDb25uZWN0aW9uRGF0YShjb25uZWN0aW9uKTtcbiAgICAgIGlmICghcGF0aERhdGEpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gcGF0aCBkYXRhIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFkgfSA9IHBhdGhEYXRhO1xuXG4gICAgICBjb25zdCBzb3VyY2VOb2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGNvbm5lY3Rpb24uc291cmNlTm9kZUlkKTtcbiAgICAgIGlmICghc291cmNlTm9kZUluZm8pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU291cmNlIG5vZGUgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBzb3VyY2VOb2RlSW5mby5ub2RlO1xuICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSBzb3VyY2VOb2RlLmNvbm5lY3Rpb25Qb2ludHM/LmZpbmQoXG4gICAgICAgIChwKSA9PiBwLmlkID09PSBjb25uZWN0aW9uLnNvdXJjZVBvaW50SWRcbiAgICAgICk7XG5cbiAgICAgIGlmICghc291cmNlUG9pbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignU291cmNlIHBvaW50IG5vdCBmb3VuZCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgbWlkcG9pbnQgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb24gcG9pbnQgdHlwZVxuICAgICAgaWYgKHNvdXJjZVBvaW50LnR5cGUgPT09ICdsZWZ0JyB8fCBzb3VyY2VQb2ludC50eXBlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0ID0gZW5kWCAtIHN0YXJ0WDtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoaG9yaXpvbnRhbERpc3QpIDwgMzApIHtcbiAgICAgICAgICAvLyBGb3Igc2hvcnQgaG9yaXpvbnRhbCBjb25uZWN0aW9uc1xuICAgICAgICAgIGNvbnN0IG1pZFkgPSAoc3RhcnRZICsgZW5kWSkgLyAyO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBzdGFydFggKyAoZW5kWCAtIHN0YXJ0WCkgLyAyLFxuICAgICAgICAgICAgeTogbWlkWSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciByZWd1bGFyIGNvbm5lY3Rpb25zIHN0YXJ0aW5nIGhvcml6b250YWxseVxuICAgICAgICAgIGNvbnN0IG1pZFggPSBzdGFydFggKyBob3Jpem9udGFsRGlzdCAvIDI7XG4gICAgICAgICAgY29uc3QgbWlkWSA9IGVuZFk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IG1pZFgsXG4gICAgICAgICAgICB5OiAoc3RhcnRZICsgZW5kWSkgLyAyLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICd0b3AnIG9yICdib3R0b20nXG4gICAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdCA9IGVuZFkgLSBzdGFydFk7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHZlcnRpY2FsRGlzdCkgPCAzMCkge1xuICAgICAgICAgIC8vIEZvciBzaG9ydCB2ZXJ0aWNhbCBjb25uZWN0aW9uc1xuICAgICAgICAgIGNvbnN0IG1pZFggPSAoc3RhcnRYICsgZW5kWCkgLyAyO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBtaWRYIC0gNzUsIC8vIE1pbnVzIDc1IC0gd2hpY2ggaXMgaGFsZiB0aGUgd2lkdGggb2YgdGhlIGxhYmVsIGl0c2VsZlxuICAgICAgICAgICAgeTogc3RhcnRZICsgKGVuZFkgLSBzdGFydFkpIC8gMixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciByZWd1bGFyIGNvbm5lY3Rpb25zIHN0YXJ0aW5nIHZlcnRpY2FsbHlcbiAgICAgICAgICBjb25zdCBtaWRYID0gZW5kWDtcbiAgICAgICAgICBjb25zdCBtaWRZID0gc3RhcnRZICsgdmVydGljYWxEaXN0IC8gMjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogKChzdGFydFggKyBlbmRYKSAvIDIpIC0gNzUsIC8vIE1pbnVzIDc1IC0gd2hpY2ggaXMgaGFsZiB0aGUgd2lkdGggb2YgdGhlIGxhYmVsIGl0c2VsZlxuICAgICAgICAgICAgeTogbWlkWSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdFcnJvciBjYWxjdWxhdGluZyBsYWJlbCBwb3NpdGlvbiBmb3IgY29ubmVjdGlvbjonLFxuICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICBlcnJvclxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICB9XG4gIH1cblxuICBzYXZlQ29ubmVjdGlvbkxhYmVsKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIGxhYmVsOiBzdHJpbmcpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGNvbm5lY3Rpb24gbGFiZWwgaW4gdGhlIHN0YXRlXG4gICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMubWFwKChjb25uKSA9PiB7XG4gICAgICBpZiAoY29ubi5pZCA9PT0gY29ubmVjdGlvbi5pZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbm4sXG4gICAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbm47XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYW52YXMtY29udGFpbmVyXCI+XG4gIDxzdmdcbiAgICAjY2FudmFzXG4gICAgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJjYW52YXNIZWlnaHRcIlxuICAgIGNsYXNzPVwiZGVzaWduZXItY2FudmFzXCJcbiAgICAoY2xpY2spPVwib25DYW52YXNDbGljaygkZXZlbnQpXCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPCEtLSBHcmlkIHBhdHRlcm4gZGVmaW5pdGlvbiAtLT5cblxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJncmlkXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiZ3JpZFNpemVcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiZ3JpZFNpemVcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0gMjAgMCBMIDAgMCAwIDIwXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2UyZThmMFwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC41XCJcbiAgICAgICAgLz5cbiAgICAgIDwvcGF0dGVybj5cblxuICAgICAgPCEtLSBBcnJvdyBoZWFkIG1hcmtlciBkZWZpbml0aW9uIC0tPlxuICAgICAgPG1hcmtlclxuICAgICAgICBpZD1cImFycm93aGVhZFwiXG4gICAgICAgIG1hcmtlcldpZHRoPVwiMTBcIlxuICAgICAgICBtYXJrZXJIZWlnaHQ9XCI3XCJcbiAgICAgICAgcmVmWD1cIjlcIlxuICAgICAgICByZWZZPVwiMy41XCJcbiAgICAgICAgb3JpZW50PVwiYXV0b1wiXG4gICAgICA+XG4gICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjAgMCwgMTAgMy41LCAwIDdcIiBmaWxsPVwiI0QzNkNGRlwiIC8+XG4gICAgICA8L21hcmtlcj5cblxuICAgICAgPCEtLSBDb25uZWN0aW9uIHBvaW50IHN0eWxlcyAtLT5cbiAgICAgIDxjaXJjbGVcbiAgICAgICAgaWQ9XCJjb25uZWN0aW9uLXBvaW50LXRlbXBsYXRlXCJcbiAgICAgICAgcj1cIjVcIlxuICAgICAgICBmaWxsPVwiI0QzNkNGRlwiXG4gICAgICAgIHN0cm9rZT1cIiNGRkZGRkZcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gRGFzaGVkIGxpbmUgc3R5bGUgZm9yIGNvbm5lY3Rpb24gcHJldmlldyAtLT5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwiZGFzaGVkLWxpbmVcIlxuICAgICAgICB3aWR0aD1cIjEwXCJcbiAgICAgICAgaGVpZ2h0PVwiMTBcIlxuICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICA+XG4gICAgICAgIDxsaW5lXG4gICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICB5MT1cIjVcIlxuICAgICAgICAgIHgyPVwiMTBcIlxuICAgICAgICAgIHkyPVwiNVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjUsNVwiXG4gICAgICAgIC8+XG4gICAgICA8L3BhdHRlcm4+XG5cbiAgICAgIEBmb3IgKHN3aW1sYW5lIG9mIHN0YXRlLnN3aW1sYW5lczsgdHJhY2sgc3dpbWxhbmUub3JkZXIpIHtcbiAgICAgIDxjbGlwUGF0aCBbYXR0ci5pZF09XCInc3dpbWxhbmUtY2xpcC0nICsgc3dpbWxhbmUub3JkZXJcIj5cbiAgICAgICAgPHJlY3QgeD1cIjBcIiB5PVwiMFwiIFthdHRyLndpZHRoXT1cImNhbnZhc1dpZHRoXCIgaGVpZ2h0PVwiMjYzXCIgLz5cbiAgICAgIDwvY2xpcFBhdGg+XG4gICAgICB9XG4gICAgPC9kZWZzPlxuXG4gICAgPCEtLSBCYWNrZ3JvdW5kIGdyaWQgLS0+XG4gICAgPHJlY3Qgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMTAwJVwiIGZpbGw9XCJ1cmwoI2dyaWQpXCIgLz5cblxuICAgIDwhLS0gRGlzcGxheSBhIG1lc3NhZ2Ugd2hlbiBubyBzd2ltbGFuZXMgZXhpc3QgLS0+XG4gICAgQGlmIChzdGF0ZS5zd2ltbGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgPHRleHRcbiAgICAgIHg9XCI1MCVcIlxuICAgICAgeT1cIjUwJVwiXG4gICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgZm9udC1zaXplPVwiMTZcIlxuICAgICAgZmlsbD1cIiM5NGEzYjhcIlxuICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgID5cbiAgICAgIFNlbGVjdCB0aGUgU3dpbWxhbmUgdG9vbCBhbmQgY2xpY2sgb24gdGhlIGNhbnZhcyB0byBhZGQgYSBzd2ltbGFuZVxuICAgIDwvdGV4dD5cbiAgICB9XG5cbiAgICA8IS0tIFRoaXMgaXMgd2hlcmUgd29ya2Zsb3cgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCBsYXRlciAtLT5cbiAgICBAZm9yIChzd2ltbGFuZSBvZiBzdGF0ZS5zd2ltbGFuZXM7IHRyYWNrIHN3aW1sYW5lLm9yZGVyKSB7XG4gICAgPCEtLSA8Z1xuICAgICAgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoMCwnICsgc3dpbWxhbmUub3JkZXIgKiAyNjMgKyAnKSdcIlxuICAgICAgW2F0dHIuY2xpcC1wYXRoXT1cIid1cmwoI3N3aW1sYW5lLWNsaXAtJyArIHN3aW1sYW5lLm9yZGVyICsgJyknXCJcbiAgICA+XG4gICAgICA8cmVjdFxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiMjYzXCJcbiAgICAgICAgZmlsbD1cIiNmZmZmZmZcIlxuICAgICAgICBzdHJva2U9XCIjZTJlOGYwXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICA+PC9yZWN0PlxuXG4gICAgICA8cmVjdFxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIlxuICAgICAgICBoZWlnaHQ9XCI0MFwiXG4gICAgICAgIGZpbGw9XCIjZjhmYWZjXCJcbiAgICAgICAgc3Ryb2tlPVwiI2UyZThmMFwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgPjwvcmVjdD5cblxuICAgICAgPHRleHRcbiAgICAgICAgeD1cIjIwXCJcbiAgICAgICAgeT1cIjI1XCJcbiAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgZm9udC1zaXplPVwiMTRcIlxuICAgICAgICBmaWxsPVwiIzMzMzMzM1wiXG4gICAgICAgIGZvbnQtd2VpZ2h0PVwiYm9sZFwiXG4gICAgICA+XG4gICAgICAgIHt7IHN3aW1sYW5lLmxhYmVsIH19XG4gICAgICA8L3RleHQ+XG5cbiAgICAgIDxnXG4gICAgICAgIGNsYXNzPVwiZWRpdC1zd2ltbGFuZS1idXR0b25cIlxuICAgICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgxMDAsIDIwKSdcIlxuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgb25FZGl0U3dpbWxhbmUoJGV2ZW50LCBzd2ltbGFuZSwgc3dpbWxhbmUub3JkZXIpO1xuICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8cmVjdFxuICAgICAgICAgIHg9XCItNVwiXG4gICAgICAgICAgeT1cIi0xNVwiXG4gICAgICAgICAgd2lkdGg9XCI0MFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgIGZpbGw9XCIjZjNlOGZmXCJcbiAgICAgICAgICByeD1cIjNcIlxuICAgICAgICAgIHJ5PVwiM1wiXG4gICAgICAgICAgc3Ryb2tlPVwiI2Q4YjRmZVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L3JlY3Q+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjE1XCJcbiAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM3ZTIyY2VcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIEVkaXRcbiAgICAgICAgPC90ZXh0PlxuICAgICAgPC9nPlxuXG4gICAgICA8ZyBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgyMDAsIDIwKSdcIj5cbiAgICAgICAgQGZvciAodGFnIG9mIHN3aW1sYW5lLnRhZ3Muc2xpY2UoMCwgMyk7IHRyYWNrIHRhZy5OYW1lOyBsZXQgaSA9ICRpbmRleClcbiAgICAgICAge1xuICAgICAgICA8dGV4dFxuICAgICAgICAgIFthdHRyLnhdPVwiaSAqIDEwMFwiXG4gICAgICAgICAgeT1cIjVcIlxuICAgICAgICAgIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTJcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2NjY2XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHRhZy5OYW1lIH19XG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgfSBAaWYgKHN3aW1sYW5lLnRhZ3MubGVuZ3RoID4gMykge1xuICAgICAgICA8dGV4dFxuICAgICAgICAgIFthdHRyLnhdPVwiMyAqIDEwMCArIDEwXCJcbiAgICAgICAgICB5PVwiNVwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM2NjY2NjZcIlxuICAgICAgICA+XG4gICAgICAgICAgK3t7IHN3aW1sYW5lLnRhZ3MubGVuZ3RoIC0gMyB9fSBtb3JlXG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgfVxuICAgICAgPC9nPlxuICAgIDwvZz4gLS0+XG5cbiAgICA8ZyBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgwLCcgKyBzd2ltbGFuZS5vcmRlciAqIDI2MyArICcpJ1wiPlxuICAgICAgPCEtLSBTd2ltbGFuZSBjb250YWluZXIgLSByZW1vdmUgc3Ryb2tlIHRvIG1ha2UgaXQgcHVyZWx5IGJhY2tncm91bmQgLS0+XG4gICAgICA8cmVjdFxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiMjYzXCJcbiAgICAgICAgW2F0dHIuZmlsbF09XCJzd2ltbGFuZS5vcmRlciAlIDIgPT09IDAgPyAnI0ZDRjNGRicgOiAnI0VDRkZGNSdcIlxuICAgICAgICBzdHJva2U9XCJub25lXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDwhLS0gVmVydGljYWwgc3dpbWxhbmUgbGFiZWwgb24gdGhlIGxlZnQgLS0+XG4gICAgICA8ZyBjbGFzcz1cInN3aW1sYW5lLWxhYmVsXCI+XG4gICAgICAgIDwhLS0gUHVycGxlIGJhY2tncm91bmQgZm9yIHRoZSBsYWJlbCAtLT5cbiAgICAgICAgPHJlY3RcbiAgICAgICAgICB4PVwiMC41XCJcbiAgICAgICAgICB5PVwiMC41XCJcbiAgICAgICAgICB3aWR0aD1cIjQzXCJcbiAgICAgICAgICBoZWlnaHQ9XCIyMTVcIlxuICAgICAgICAgIHJ4PVwiMTAuNVwiXG4gICAgICAgICAgZmlsbD1cIndoaXRlXCJcbiAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgPjwvcmVjdD5cblxuICAgICAgICA8IS0tIFBsdXMgYnV0dG9uIGF0IHRoZSB0b3AgLS0+XG4gICAgICAgIDxnXG4gICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgb25FZGl0U3dpbWxhbmUoJGV2ZW50LCBzd2ltbGFuZSwgc3dpbWxhbmUub3JkZXIpO1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICB4PVwiMTIuNVwiXG4gICAgICAgICAgICB5PVwiMTBcIlxuICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgID48L3JlY3Q+XG5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0yMi41MiAxMi4xNzRWMTcuMDhIMjcuNDdWMTguNTFIMjIuNTJWMjMuMzk0SDIxLjJWMTguNTFIMTYuMjVWMTcuMDhIMjEuMlYxMi4xNzRIMjIuNTJaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjMDAwMEZGXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGx1cy1pY29uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICA8L2c+XG5cbiAgICAgICAgPCEtLSBTd2ltbGFuZSBsYWJlbCAtLT5cbiAgICAgICAgPHRleHRcbiAgICAgICAgICB4PVwiMjJcIlxuICAgICAgICAgIHk9XCIxMDZcIlxuICAgICAgICAgIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTRcIlxuICAgICAgICAgIGZpbGw9XCIjMzMzMzMzXCJcbiAgICAgICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCwgMjIsIDEwMClcIlxuICAgICAgICA+XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIHN3aW1sYW5lLmxhYmVsLmxlbmd0aCA+IDEyXG4gICAgICAgICAgICAgID8gc3dpbWxhbmUubGFiZWwuc3Vic3RyaW5nKDAsIDEwKSArIFwiLi4uXCJcbiAgICAgICAgICAgICAgOiBzd2ltbGFuZS5sYWJlbFxuICAgICAgICAgIH19XG4gICAgICAgIDwvdGV4dD5cblxuICAgICAgICA8IS0tIFRhZyBjb3VudCBpbmRpY2F0b3IgYXQgdGhlIGJvdHRvbSAtLT5cbiAgICAgICAgPHJlY3RcbiAgICAgICAgICB4PVwiMTEuNVwiXG4gICAgICAgICAgeT1cIjE4N1wiXG4gICAgICAgICAgd2lkdGg9XCIyMVwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTlcIlxuICAgICAgICAgIHJ4PVwiOS41XCJcbiAgICAgICAgICBmaWxsPVwiIzlFOUU5RVwiXG4gICAgICAgID48L3JlY3Q+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIjI0XCJcbiAgICAgICAgICB5PVwiMjA2XCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiYmxhY2tcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoLTkwLCAyMiwgMjAwKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBzd2ltbGFuZS50YWdzLmxlbmd0aCB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICA8L2c+XG4gICAgPC9nPlxuXG4gICAgfVxuXG4gICAgPCEtLSBOb2RlcyAtLT5cbiAgICBAZm9yIChzd2ltbGFuZSBvZiBzdGF0ZS5zd2ltbGFuZXM7IHRyYWNrIHN3aW1sYW5lLm9yZGVyKSB7XG4gICAgPCEtLSBSZW5kZXIgbm9kZXMgaW4gdGhpcyBzd2ltbGFuZSAtLT5cbiAgICBAZm9yIChub2RlIG9mIHN3aW1sYW5lLm5vZGVzOyB0cmFjayBub2RlLmlkKSB7XG4gICAgPGdcbiAgICAgIGNsYXNzPVwibm9kZS1lbGVtZW50XCJcbiAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJcbiAgICAgICAgJ3RyYW5zbGF0ZSgnICsgbm9kZS54ICsgJywnICsgKG5vZGUueSAtIHN3aW1sYW5lLm9yZGVyICogMjYzKSArICcpJ1xuICAgICAgXCJcbiAgICAgIChtb3VzZWVudGVyKT1cInNob3dDb25uZWN0aW9uUG9pbnRzKG5vZGUuaWQsIHN3aW1sYW5lLm9yZGVyKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJoaWRlQ29ubmVjdGlvblBvaW50cyhub2RlLmlkKVwiXG4gICAgPlxuICAgICAgPCEtLSBTdGFydCBub2RlIGluZGljYXRvciAoY2lyY2xlIGFuZCBhcnJvdykgZm9yIHRoZSBmaXJzdCBub2RlIC0tPlxuICAgICAgQGlmIChub2RlLmlzU3RhcnROb2RlKSB7XG4gICAgICA8IS0tIENpcmNsZSAtLT5cbiAgICAgIDxjaXJjbGVcbiAgICAgICAgY3g9XCItNTBcIlxuICAgICAgICBjeT1cIjUwXCJcbiAgICAgICAgcj1cIjMwXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICA+PC9jaXJjbGU+XG4gICAgICA8IS0tIEZvcm0gaWNvbiBmb3Igc3RhcnQgbm9kZSAtLT5cbiAgICAgIDxzdmc6Z1xuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyKVxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0YWdlLWljb25cIlxuICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTQ1LCA0MilcIlxuICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgcG9pbnRlci1ldmVudHM6IGFsbFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gVHJhbnNwYXJlbnQgcmVjdGFuZ2xlIHRvIGNhcHR1cmUgY2xpY2tzIC0tPlxuICAgICAgICA8c3ZnOnJlY3RcbiAgICAgICAgICB4PVwiLTJcIlxuICAgICAgICAgIHk9XCItMlwiXG4gICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAvPlxuICAgICAgICA8c3ZnOnBhdGhcbiAgICAgICAgICBkPVwiTTE2LjUgMjAuNDc1VjE3LjQ3NUgxMy41VjE2LjQ3NUgxNi41VjEzLjQ3NUgxNy41VjE2LjQ3NUgyMC41VjE3LjQ3NUgxNy41VjIwLjQ3NUgxNi41Wk0zLjUgMTcuNVYxNi41SDQuNVYxNy41SDMuNVpNNi41IDE3LjVWMTYuNUgxMS41MTdDMTEuNTA1NyAxNi42NzY3IDExLjUwNDMgMTYuODQ1IDExLjUxMyAxNy4wMDVDMTEuNTIxIDE3LjE2NSAxMS41MzEgMTcuMzMgMTEuNTQzIDE3LjVINi41Wk0zLjUgMTMuNVYxMi41SDQuNVYxMy41SDMuNVpNNi41IDEzLjVWMTIuNUgxMy44MDRDMTMuNjEyNyAxMi42Mzg3IDEzLjQzMzMgMTIuNzkxMyAxMy4yNjYgMTIuOTU4QzEzLjA5OTMgMTMuMTI0NyAxMi45Mzc3IDEzLjMwNTMgMTIuNzgxIDEzLjVINi41Wk0zLjUgOS41VjguNUg0LjVWOS41SDMuNVpNNi41IDkuNVY4LjVIMTguNVY5LjVINi41Wk0zLjUgNS41VjQuNUg0LjVWNS41SDMuNVpNNi41IDUuNVY0LjVIMTguNVY1LjVINi41WlwiXG4gICAgICAgICAgW2F0dHIuZmlsbF09XCJzdGF0ZS53b3JrZmxvd0Zvcm1JZCA/ICcjRDM2Q0ZGJyA6ICdibGFjaydcIlxuICAgICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIDwhLS0gQXJyb3cgZnJvbSBjaXJjbGUgdG8gbm9kZSAtLT5cbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9XCJNIC0yMCA1MCBMIDAgNTBcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgIG1hcmtlci1lbmQ9XCJ1cmwoI2Fycm93aGVhZClcIlxuICAgICAgPjwvcGF0aD5cbiAgICAgIH1cblxuICAgICAgPCEtLSBFeGl0IHBvaW50IGluZGljYXRvciAoY2lyY2xlIGFuZCBhcnJvdykgLS0+XG4gICAgICBAaWYgKG5vZGUuc3RhZ2VEYXRhPy5Jc0V4aXRQb2ludCkge1xuICAgICAgPCEtLSBBcnJvdyBmcm9tIG5vZGUgdG8gY2lyY2xlIC0tPlxuICAgICAgPHBhdGhcbiAgICAgICAgW2F0dHIuZF09XCInTSAnICsgbm9kZS53aWR0aCArICcgNTAgTCAnICsgKG5vZGUud2lkdGggKyAyMCkgKyAnIDUwJ1wiXG4gICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgbWFya2VyLWVuZD1cInVybCgjYXJyb3doZWFkKVwiXG4gICAgICA+PC9wYXRoPlxuICAgICAgPCEtLSBDaXJjbGUgLS0+XG4gICAgICA8Y2lyY2xlXG4gICAgICAgIFthdHRyLmN4XT1cIm5vZGUud2lkdGggKyA1MFwiXG4gICAgICAgIGN5PVwiNTBcIlxuICAgICAgICByPVwiMzBcIlxuICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgID48L2NpcmNsZT5cbiAgICAgIH1cblxuICAgICAgPCEtLSBTdGFnZSBub2RlIC0tPlxuICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIDwhLS0gPHJlY3RcbiAgICAgICAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGUuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgICAgICAgPjwvcmVjdD4gLS0+XG4gICAgICA8c3ZnOmdcbiAgICAgICAgbGliLXN0YWdlLW5vZGVcbiAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgIFtpc1N0YXJ0Tm9kZV09XCJub2RlLmlzU3RhcnROb2RlXCJcbiAgICAgICAgKHN0YWdlUHJvcGVydGllc1VwZGF0ZWQpPVwib25TdGFnZVByb3BlcnRpZXNVcGRhdGVkKCRldmVudClcIlxuICAgICAgICAoc2hvd1NoaWVsZERpYWxvZyk9XCJvblNob3dTaGllbGREaWFsb2coJGV2ZW50KVwiXG4gICAgICAgIChzaG93RXNjYWxhdGlvbkRpYWxvZyk9XCJvblNob3dFc2NhbGF0aW9uRGlhbG9nKCRldmVudClcIlxuICAgICAgICAoc2hvd0Zvcm1EaWFsb2cpPVwiXG4gICAgICAgICAgdG9nZ2xlU3RhcnROb2RlRm9ybVBvcHVwKCRldmVudCwgbm9kZS54LCBub2RlLnksIHN3aW1sYW5lLm9yZGVyLCBub2RlKVxuICAgICAgICBcIlxuICAgICAgPjwvc3ZnOmc+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gRGVjaXNpb24gbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS50eXBlID09PSAnZGVjaXNpb24nKSB7XG4gICAgICA8cGF0aFxuICAgICAgICBbYXR0ci5kXT1cIlxuICAgICAgICAgICdNIDAgJyArXG4gICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAnIEwgJyArXG4gICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICcgMCcgK1xuICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICBub2RlLndpZHRoICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgIG5vZGUuaGVpZ2h0IC8gMiArXG4gICAgICAgICAgJyBMICcgK1xuICAgICAgICAgIG5vZGUud2lkdGggLyAyICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgIG5vZGUuaGVpZ2h0ICtcbiAgICAgICAgICAnIFonXG4gICAgICAgIFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgPjwvcGF0aD5cblxuICAgICAgPCEtLSBEZWNpc2lvbiBub2RlIGNvbmRpdGlvbiBpbmRpY2F0b3IgaWNvbiAtLT5cbiAgICAgIDxzdmc6Z1xuICAgICAgICAoY2xpY2spPVwic2hvd0RlY2lzaW9uQ29uZGl0aW9uc1BvcHVwKCRldmVudCwgbm9kZSwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgICAgY2xhc3M9XCJkZWNpc2lvbi1jb25kaXRpb24taWNvblwiXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJcbiAgICAgICAgICAndHJhbnNsYXRlKCcgK1xuICAgICAgICAgIChub2RlLndpZHRoIC8gMiAtIDEwKSArXG4gICAgICAgICAgJywnICtcbiAgICAgICAgICAobm9kZS5oZWlnaHQgLyAyIC0gMTApICtcbiAgICAgICAgICAnKSdcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHN2ZzpyZWN0XG4gICAgICAgICAgeD1cIi01XCJcbiAgICAgICAgICB5PVwiLTVcIlxuICAgICAgICAgIHdpZHRoPVwiMzBcIlxuICAgICAgICAgIGhlaWdodD1cIjMwXCJcbiAgICAgICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHN2ZzpwYXRoXG4gICAgICAgICAgZD1cIk0xMCAwSDIwVjJIMTBWMFpNMTAgOEgyMFYxMEgxMFY4Wk0xMCA0SDIwVjZIMTBWNFpNMCAwSDhWMkgwVjBaTTAgOEg4VjEwSDBWOFpNMCA0SDhWNkgwVjRaXCJcbiAgICAgICAgICBmaWxsPVwiI0QzNkNGRlwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2ZzpnPlxuICAgICAgfVxuXG4gICAgICA8IS0tIEZvcm0gbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS50eXBlID09PSAnZm9ybScpIHtcbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9XCJNOTUuMDYyNSA1MC41NTkxVjk1LjA2MjVDOTUuMDYyNSA5Ny45NzE2IDkzLjkwNjkgMTAwLjc2MiA5MS44NDk4IDEwMi44MTlDODkuNzkyOCAxMDQuODc2IDg3LjAwMjggMTA2LjAzMSA4NC4wOTM4IDEwNi4wMzFIMzIuOTA2MkMyOS45OTcyIDEwNi4wMzEgMjcuMjA3MiAxMDQuODc2IDI1LjE1MDIgMTAyLjgxOUMyMy4wOTMxIDEwMC43NjIgMjEuOTM3NSA5Ny45NzE2IDIxLjkzNzUgOTUuMDYyNVYyMS45Mzc1QzIxLjkzNzUgMTkuMDI4NCAyMy4wOTMxIDE2LjIzODUgMjUuMTUwMiAxNC4xODE0QzI3LjIwNzIgMTIuMTI0NCAyOS45OTcyIDEwLjk2ODggMzIuOTA2MiAxMC45Njg4SDU1LjQ3MjJDNTcuNDEwOSAxMC45NjkgNTkuMjcwMSAxMS43MzkyIDYwLjY0MTIgMTMuMTA5OUw5Mi45MjEzIDQ1LjM5MDFDOTQuMjkyIDQ2Ljc2MTEgOTUuMDYyMiA0OC42MjA0IDk1LjA2MjUgNTAuNTU5MVpcIlxuICAgICAgICB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgLz5cbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9XCJNNTguNSAxMi43OTY5VjQwLjIxODhDNTguNSA0Mi4xNTgxIDU5LjI3MDQgNDQuMDE4MSA2MC42NDE4IDQ1LjM4OTVDNjIuMDEzMSA0Ni43NjA4IDYzLjg3MzEgNDcuNTMxMiA2NS44MTI1IDQ3LjUzMTJIOTMuMjM0NFwiXG4gICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgIC8+XG4gICAgICA8dGV4dFxuICAgICAgICB4PVwiNTAlXCJcbiAgICAgICAgeT1cIjUwJVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgZG9taW5hbnQtYmFzZWxpbmU9XCJtaWRkbGVcIlxuICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICBmb250LXNpemU9XCIxNFwiXG4gICAgICAgIGZpbGw9XCIjRDM2Q0ZGXCJcbiAgICAgID5cbiAgICAgICAgRm9ybVxuICAgICAgPC90ZXh0PlxuICAgICAgfVxuXG4gICAgICA8IS0tIFN1YmZsb3cgbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS50eXBlID09PSAnc3ViZmxvdycpIHtcbiAgICAgIDxwYXRoXG4gICAgICAgIFthdHRyLmRdPVwiXG4gICAgICAgICAgJ00gMSAnICtcbiAgICAgICAgICBub2RlLmhlaWdodCAvIDQgK1xuICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICBub2RlLndpZHRoIC8gMiArXG4gICAgICAgICAgJyAxIEwgJyArXG4gICAgICAgICAgKG5vZGUud2lkdGggLSAxKSArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICBub2RlLmhlaWdodCAvIDQgK1xuICAgICAgICAgICcgViAnICtcbiAgICAgICAgICAobm9kZS5oZWlnaHQgKiAzKSAvIDQgK1xuICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICBub2RlLndpZHRoIC8gMiArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICAobm9kZS5oZWlnaHQgLSAxKSArXG4gICAgICAgICAgJyBMIDEgJyArXG4gICAgICAgICAgKG5vZGUuaGVpZ2h0ICogMykgLyA0ICtcbiAgICAgICAgICAnIFonXG4gICAgICAgIFwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgc3Ryb2tlPVwiI0QzNkNGRlwiXG4gICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgPjwvcGF0aD5cbiAgICAgIDx0ZXh0XG4gICAgICAgIFthdHRyLnhdPVwibm9kZS53aWR0aCAvIDJcIlxuICAgICAgICBbYXR0ci55XT1cIm5vZGUuaGVpZ2h0IC8gMlwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgYWxpZ25tZW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgZm9udC1zaXplPVwiMTBcIlxuICAgICAgICBmaWxsPVwiIzAwMDAwMFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gTGltaXQgdGV4dCBsZW5ndGggLS0+XG4gICAgICAgIHt7XG4gICAgICAgICAgKG5vZGUud29ya2Zsb3dEYXRhPy5uYW1lIHx8IFwiU3ViZmxvd1wiKS5sZW5ndGggPiAxMlxuICAgICAgICAgICAgPyAobm9kZS53b3JrZmxvd0RhdGE/Lm5hbWUgfHwgXCJTdWJmbG93XCIpLnN1YnN0cmluZygwLCAxMCkgKyBcIi4uLlwiXG4gICAgICAgICAgICA6IG5vZGUud29ya2Zsb3dEYXRhPy5uYW1lIHx8IFwiU3ViZmxvd1wiXG4gICAgICAgIH19XG4gICAgICA8L3RleHQ+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBwb2ludHMgZm9yIHRoaXMgbm9kZSAtLT5cbiAgICAgIEBmb3IgKHBvaW50IG9mIG5vZGUuY29ubmVjdGlvblBvaW50cyB8fCBbXTsgdHJhY2sgcG9pbnQuaWQpIHsgQGlmXG4gICAgICAoaXNDb25uZWN0aW9uUG9pbnRWaXNpYmxlKG5vZGUuaWQpKSB7XG4gICAgICA8dXNlXG4gICAgICAgIFthdHRyLmhyZWZdPVwiJyNjb25uZWN0aW9uLXBvaW50LXRlbXBsYXRlJ1wiXG4gICAgICAgIFthdHRyLnhdPVwicG9pbnQueFwiXG4gICAgICAgIFthdHRyLnldPVwicG9pbnQueVwiXG4gICAgICAgIFthdHRyLmlkXT1cInBvaW50LmlkXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENvbm5lY3Rpb25EcmFnKCRldmVudCwgcG9pbnQsIHN3aW1sYW5lLm9yZGVyKVwiXG4gICAgICAvPlxuICAgICAgfSB9XG4gICAgPC9nPlxuICAgIDwhLS0gQSB0cmFuc3BhcmVudCBob3ZlciBhcmVhIGZvciBpbXByb3ZlZCBob3ZlciBkZXRlY3Rpb24gLS0+XG4gICAgPHJlY3RcbiAgICAgIFthdHRyLnhdPVwibm9kZS54IC0gMTBcIlxuICAgICAgW2F0dHIueV09XCJub2RlLnkgLSAxMFwiXG4gICAgICBbYXR0ci53aWR0aF09XCJub2RlLndpZHRoICsgMjBcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGUuaGVpZ2h0ICsgMjBcIlxuICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgIChtb3VzZW92ZXIpPVwic2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZS5pZCwgc3dpbWxhbmUub3JkZXIpXCJcbiAgICAgIChtb3VzZW91dCk9XCJoaWRlQ29ubmVjdGlvblBvaW50cyhub2RlLmlkKVwiXG4gICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCJcbiAgICAvPlxuICAgIH0gfVxuXG4gICAgPCEtLSBDb25uZWN0aW9ucyAtLT5cbiAgICBAZm9yIChjb25uZWN0aW9uIG9mIHN0YXRlLmNvbm5lY3Rpb25zOyB0cmFjayBjb25uZWN0aW9uLmlkKSB7XG4gICAgPGcgY2xhc3M9XCJjb25uZWN0aW9uLWVsZW1lbnRcIj5cbiAgICAgIDxwYXRoXG4gICAgICAgIFthdHRyLmRdPVwiZ2V0Q29ubmVjdGlvblBhdGhGb3JTYXZlZENvbm5lY3Rpb24oY29ubmVjdGlvbilcIlxuICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgbWFya2VyLWVuZD1cInVybCgjYXJyb3doZWFkKVwiXG4gICAgICA+PC9wYXRoPlxuXG4gICAgICA8IS0tIENvbm5lY3Rpb24gTGFiZWwgLS0+XG4gICAgICBAaWYgKGNvbm5lY3Rpb24uc291cmNlTm9kZUlkICYmIGNvbm5lY3Rpb24udGFyZ2V0Tm9kZUlkKSB7XG4gICAgICA8Zm9yZWlnbk9iamVjdFxuICAgICAgICBbYXR0ci54XT1cImdldExhYmVsUG9zaXRpb24oY29ubmVjdGlvbikueFwiXG4gICAgICAgIFthdHRyLnldPVwiZ2V0TGFiZWxQb3NpdGlvbihjb25uZWN0aW9uKS55XCJcbiAgICAgICAgd2lkdGg9XCIxNTBcIlxuICAgICAgICBoZWlnaHQ9XCI0MFwiXG4gICAgICAgIHN0eWxlPVwib3ZlcmZsb3c6IHZpc2libGU7IHBvaW50ZXItZXZlbnRzOiBhbGw7XCJcbiAgICAgICAgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoLTc1LCAtMTApJ1wiXG4gICAgICA+XG4gICAgICAgIDx3Zi1sYWJlbC1lZGl0b3JcbiAgICAgICAgICBbbGFiZWxdPVwiY29ubmVjdGlvbi5sYWJlbCB8fCAnTmV3IEFjdGlvbidcIlxuICAgICAgICAgIFt4XT1cIjBcIlxuICAgICAgICAgIFt5XT1cIjBcIlxuICAgICAgICAgIFtpc0Nvbm5lY3Rpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgKGxhYmVsQ2hhbmdlKT1cInNhdmVDb25uZWN0aW9uTGFiZWwoY29ubmVjdGlvbiwgJGV2ZW50KVwiXG4gICAgICAgICAgKG9wZW5EaWFsb2cpPVwib25TaG93QWN0aW9uRGlhbG9nKGNvbm5lY3Rpb24pXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZm9yZWlnbk9iamVjdD5cbiAgICAgIH1cbiAgICA8L2c+XG4gICAgfVxuXG4gICAgPCEtLSBDb25uZWN0aW9uIHByZXZpZXcgbGluZSAtLT5cbiAgICBAaWYgKHN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICA8Zz5cbiAgICAgIDxwYXRoXG4gICAgICAgIFthdHRyLmRdPVwiZ2V0Q29ubmVjdGlvblBhdGgoKVwiXG4gICAgICAgIHN0cm9rZT1cIiNEMzZDRkZcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjUsNVwiXG4gICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgID48L3BhdGg+XG4gICAgPC9nPlxuICAgIH1cbiAgPC9zdmc+XG5cbiAgPGRpdlxuICAgICpuZ0lmPVwicG9wdXBWaXNpYmxlXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwicG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInBvcHVwWVwiXG4gID5cbiAgICA8dmVyYmVuLXBvcC1VcFxuICAgICAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCJcbiAgICAgIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICc5OScgfVwiXG4gICAgICBbZW5hYmxlTW91c2VMZWF2ZV09XCJmYWxzZVwiXG4gICAgICAoZHJvcGRvd25PcGVuQ2hhbmdlKT1cIiRldmVudCA/IG51bGwgOiBoaWRlQ29ubmVjdGlvblBvcHVwKClcIlxuICAgID5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWRcIlxuICAgICAgICBkcm9wZG93bi1jb250ZW50XG4gICAgICA+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5DcmVhdGUgQ29ubmVjdGlvbjwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdHlwZSBvZiBhbGxvd2VkTm9kZVR5cGVzXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwicHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlTm9kZUNvbm5lY3Rpb24odHlwZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDcmVhdGUge3sgdHlwZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGlkZUNvbm5lY3Rpb25Qb3B1cCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dTdGFydE5vZGVGb3JtUG9wdXBcIlxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJzdGFydE5vZGVGb3JtUG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN0YXJ0Tm9kZUZvcm1Qb3B1cFlcIlxuICA+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzEwMCcgfVwiPlxuICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiPlxuICAgICAgICA8IS0tIEhpZGRlbiB0cmlnZ2VyIGVsZW1lbnQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwLTMgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHNoYWRvdy1tZCB3LTY0XCJcbiAgICAgICAgZHJvcGRvd24tY29udGVudFxuICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB6LWluZGV4OiAxMDAwXCJcbiAgICAgID5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdyBGb3JtPC9oND5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyBmb3Jtcy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdTdGFydE5vZGVGb3Jtc1wiIGNsYXNzPVwibWF4LWgtNDggb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0obnVsbClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBDbGVhciBmb3JtIHNlbGVjdGlvblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZm9ybSBvZiBzdGFydE5vZGVGb3Jtc0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBmb3JtLk5hbWUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwic3RhcnROb2RlRm9ybXNMaXN0Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTm8gZm9ybXMgYXZhaWxhYmxlXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC92ZXJiZW4tcG9wLVVwPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93U3ViZmxvd1BvcHVwXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwic3ViZmxvd1BvcHVwWFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJzdWJmbG93UG9wdXBZXCJcbiAgPlxuICAgIDx2ZXJiZW4tcG9wLVVwIFtkcm9wZG93bk9wZW5dPVwidHJ1ZVwiIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICcxMDAnIH1cIj5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWQgdy02NFwiXG4gICAgICAgIGRyb3Bkb3duLWNvbnRlbnRcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgei1pbmRleDogMTAwMFwiXG4gICAgICA+XG4gICAgICAgIDxoNCBjbGFzcz1cIm1iLTIgZm9udC1tZWRpdW1cIj5TZWxlY3QgV29ya2Zsb3c8L2g0PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nV29ya2Zsb3dzXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yXCI+XG4gICAgICAgICAgTG9hZGluZyB3b3JrZmxvd3MuLi5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nV29ya2Zsb3dzXCIgY2xhc3M9XCJtYXgtaC00OCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB3b3JrZmxvdyBvZiB3b3JrZmxvd3NMaXN0XCIgY2xhc3M9XCJtYi0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHB4LTMgcHktMiBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgdGV4dC1zbSBob3ZlcjpiZy1ncmF5LTUwIHRleHQtbGVmdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdWJmbG93V29ya2Zsb3cod29ya2Zsb3cpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgd29ya2Zsb3cuTmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3b3JrZmxvd3NMaXN0Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyIHB5LTIgdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgTm8gd29ya2Zsb3dzIGF2YWlsYWJsZVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgPC9kaXY+XG5cbiAgPGxpYi1jb25kaXRpb25zLXBvcHVwXG4gICAgW3Zpc2libGVdPVwic2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nXCJcbiAgICBbZGVjaXNpb25Ob2RlSWRdPVwiYWN0aXZlRGVjaXNpb25Ob2RlSWRcIlxuICAgIFtuZXdDb25uZWN0aW9uSWRdPVwiYWN0aXZlQ29ubmVjdGlvbklkXCJcbiAgICBbcG9wdXBYXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYXCJcbiAgICBbcG9wdXBZXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZXCJcbiAgICAoY2xvc2VkKT1cIm9uRGVjaXNpb25Db25kaXRpb25DYW5jZWxsZWQoKVwiXG4gICAgKHNhdmVkKT1cIm9uRGVjaXNpb25Db25kaXRpb25TYXZlZCgkZXZlbnQpXCJcbiAgPjwvbGliLWNvbmRpdGlvbnMtcG9wdXA+XG5cbiAgPCEtLSA8bGliLWRlY2lzaW9uLXBvcHVwXG4gICAgW3Zpc2libGVdPVwic2hvd0NvbmRpdGlvbnNEaWFsb2dcIlxuICAgIFtkZWNpc2lvbk5vZGVJZF09XCJhY3RpdmVEZWNpc2lvbk5vZGVJZFwiXG4gICAgW3BvcHVwWF09XCJkZWNpc2lvbkNvbmRpdGlvblBvcHVwWFwiXG4gICAgW3BvcHVwWV09XCJkZWNpc2lvbkNvbmRpdGlvblBvcHVwWVwiXG4gICAgKGNsb3NlZCk9XCJvbkRlY2lzaW9uQ29uZGl0aW9uQ2FuY2VsbGVkKClcIlxuICA+PC9saWItZGVjaXNpb24tcG9wdXA+IC0tPlxuXG4gIDxsaWItc3RhZ2UtZGlhbG9nXG4gICAgW3Zpc2libGVdPVwic2hvd1N0YWdlRGlhbG9nTG9jYWxcIlxuICAgIFtzdGFnZURhdGFdPVwiYWN0aXZlU3RhZ2VEYXRhIHx8IHt9XCJcbiAgICAoY2xvc2VkKT1cIm9uU3RhZ2VEaWFsb2dDbG9zZWQoKVwiXG4gICAgKHNhdmVkKT1cIm9uU3RhZ2VEaWFsb2dTYXZlZCgkZXZlbnQpXCJcbiAgPjwvbGliLXN0YWdlLWRpYWxvZz5cblxuICA8bGliLWFjdGlvbi1kaWFsb2dcbiAgICBbdmlzaWJsZV09XCJzaG93QWN0aW9uRGlhbG9nTG9jYWxcIlxuICAgIFthY3Rpb25EYXRhXT1cImFjdGl2ZUFjdGlvbkRhdGFcIlxuICAgIChjbG9zZWQpPVwib25BY3Rpb25EaWFsb2dDbG9zZWQoKVwiXG4gICAgKHNhdmVkKT1cIm9uQWN0aW9uRGlhbG9nU2F2ZWQoJGV2ZW50KVwiXG4gID48L2xpYi1hY3Rpb24tZGlhbG9nPlxuXG4gIDxsaWItZXNjYWxhdGlvbi1kaWFsb2dcbiAgICBbdmlzaWJsZV09XCJzaG93RXNjYWxhdGlvbkRpYWxvZ0xvY2FsXCJcbiAgICBbdHlwZV09XCJhY3RpdmVFc2NhbGF0aW9uVHlwZSgpIVwiXG4gICAgW3N0YWdlQ29kZV09XCJhY3RpdmVTdGFnZUNvZGUoKSB8fCAnJ1wiXG4gICAgW3dvcmtmbG93Q29kZV09XCJzdGF0ZS53b3JrZmxvdz8uQ29kZSB8fCAnJ1wiXG4gICAgKGNsb3NlZCk9XCJvbkVzY2FsYXRpb25EaWFsb2dDbG9zZWQoKVwiXG4gID48L2xpYi1lc2NhbGF0aW9uLWRpYWxvZz5cbjwvZGl2PlxuIl19
1063
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItY2FudmFzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi13b3JrZmxvdy11aS9zcmMvbGliL2NvbXBvbmVudHMvd29ya2Zsb3ctZGVzaWduZXIvZGVzaWduZXItY2FudmFzL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3dvcmtmbG93LWRlc2lnbmVyL2Rlc2lnbmVyLWNhbnZhcy9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBa0J2QixNQUFNLE9BQU8sdUJBQXVCO0lBMkd6QjtJQUNDO0lBM0dELFlBQVksR0FBYSxJQUFJLENBQUM7SUFDN0IsZUFBZSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0lBQy9ELGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQy9DLG9CQUFvQixHQUNsQixJQUFJLENBQUM7SUFDRyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBS3hDLENBQUM7SUFDSyxzQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFHL0MsQ0FBQztJQUNLLHVCQUF1QixHQUFHLElBQUksWUFBWSxFQUdoRCxDQUFDO0lBRUwsK0JBQStCO0lBQ1EsU0FBUyxDQUEwQjtJQUcxRSxlQUFlLENBQUMsS0FBaUI7UUFDL0Isc0VBQXNFO1FBQ3RFLElBQ0UsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RCLENBQUMsSUFBSSxDQUFDLHNCQUFzQjtZQUM1QixDQUFDLElB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S3RCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUdHLGVBQWU7c0JBQXhCLE1BQU07Z0JBTUcsc0JBQXNCO3NCQUEvQixNQUFNO2dCQUlHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFNZ0MsU0FBUztzQkFBL0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIHNpZ25hbCxcbiAgVmlld0NoaWxkLFxuICBXcml0YWJsZVNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFc2NhbGF0aW9uVHlwZSwgRm9ybSwgV29ya2Zsb3csIFdvcmtmbG93QWN0aW9uLCBXb3JrZmxvd1N0YWdlIH0gZnJvbSAndmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IFdvcmtmbG93RGF0YVNlcnZpY2UgfSBmcm9tICcuLi93b3JrZmxvdy1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgV29ya2Zsb3dEZXNpZ25lclN0YXRlIH0gZnJvbSAnLi4vd29ya2Zsb3ctZGVzaWduZXIuc3RhdGUnO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbixcbiAgQ29ubmVjdGlvblBvaW50LFxuICBOb2RlLFxuICBTd2ltbGFuZUl0ZW0sXG4gIFRvb2xUeXBlLFxuICBOb2RlIGFzIFdGTm9kZSxcbn0gZnJvbSAnLi4vd29ya2Zsb3ctZGVzaWduZXIudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGVzaWduZXItY2FudmFzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kZXNpZ25lci1jYW52YXMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyQ2FudmFzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2VsZWN0ZWRUb29sOiBUb29sVHlwZSA9IG51bGw7XG4gIEBPdXRwdXQoKSBjbGlja2VkUG9zaXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIHN1YmZsb3dTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcGVuZGluZ1N0YWdlUG9zaXRpb246IHsgc3dpbWxhbmVJbmRleDogbnVtYmVyOyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbCA9XG4gICAgbnVsbDtcbiAgQE91dHB1dCgpIHNob3dTdGFnZURpYWxvZyA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHBvc2l0aW9uOiBhbnk7XG4gICAgaXNGcm9tQ29ubmVjdGlvbjogYm9vbGVhbjtcbiAgICBpc0Zyb21EZWNpc2lvbj86IGJvb2xlYW47XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gIH0+KCk7XG4gIEBPdXRwdXQoKSBzdGFnZVByb3BlcnRpZXNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgc3RhZ2VEYXRhOiBQYXJ0aWFsPFdvcmtmbG93U3RhZ2U+O1xuICB9PigpO1xuICBAT3V0cHV0KCkgYWN0aW9uUHJvcGVydGllc1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb25uZWN0aW9uSWQ6IHN0cmluZztcbiAgICBhY3Rpb25EYXRhOiBQYXJ0aWFsPFdvcmtmbG93QWN0aW9uPjtcbiAgfT4oKTtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIFNWRyBlbGVtZW50XG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8U1ZHRWxlbWVudD47XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNldXAnLCBbJyRldmVudCddKVxuICBvbldpbmRvd01vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcG9wdXAgb3BlbiBidXQgdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG91dHNpZGUsIGNsZWFuIHVwXG4gICAgaWYgKFxuICAgICAgIXRoaXMuc2hvd1N1YmZsb3dQb3B1cCAmJlxuICAgICAgIXRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCAmJlxuICAgICAgIXRoaXMucG9wdXBWaXNpYmxlICYmIC8vIE9ubHkgZW5kIGRyYWcgaWYgbm8gcG9wdXAgaXMgdmlzaWJsZVxuICAgICAgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZygnRXh0ZXJuYWwgbW91c2V1cCBkZXRlY3RlZCAtIGNsZWFuaW5nIHVwIGNvbm5lY3Rpb24gZHJhZycpO1xuICAgICAgdGhpcy5zdGF0ZS5lbmRDb25uZWN0aW9uRHJhZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbnZhcyBkaW1lbnNpb25zXG4gIGNhbnZhc1dpZHRoID0gMzAwMDtcbiAgY2FudmFzSGVpZ2h0ID0gMjAwMDtcblxuICAvLyBHcmlkIHNpemVcbiAgZ3JpZFNpemUgPSAyMDtcblxuICBzd2ltbGFuZUhlaWdodCA9IDI2MztcbiAgdmlzaWJsZUNvbm5lY3Rpb25Qb2ludHNOb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwb3B1cFZpc2libGUgPSBmYWxzZTtcbiAgcG9wdXBYID0gMDtcbiAgcG9wdXBZID0gMDtcbiAgYWxsb3dlZE5vZGVUeXBlczogc3RyaW5nW10gPSBbXTtcblxuICBzaG93U3RhcnROb2RlRm9ybVBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1zTGlzdDogRm9ybVtdID0gW107XG4gIGlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFg6IG51bWJlciA9IDA7XG4gIHN0YXJ0Tm9kZUZvcm1Qb3B1cFk6IG51bWJlciA9IDA7XG4gIGFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uOiBOb2RlIHwgbnVsbCA9IG51bGw7XG4gIG5vZGVGb3JtczogV3JpdGFibGVTaWduYWw8XG4gICAgUmVjb3JkPHN0cmluZywgeyBmb3JtSWQ6IHN0cmluZzsgZm9ybU5hbWU6IHN0cmluZyB9PlxuICA+ID0gc2lnbmFsKHt9KTtcblxuICBzaG93U3ViZmxvd1BvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIHdvcmtmbG93c0xpc3Q6IFdvcmtmbG93W10gPSBbXTtcbiAgaXNMb2FkaW5nV29ya2Zsb3dzOiBib29sZWFuID0gZmFsc2U7XG4gIHN1YmZsb3dQb3B1cFg6IG51bWJlciA9IDA7XG4gIHN1YmZsb3dQb3B1cFk6IG51bWJlciA9IDA7XG4gIHBlbmRpbmdTdWJmbG93UG9zaXRpb246IHtcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIHBlbmRpbmdEZWNpc2lvbkNvbm5lY3Rpb246IHtcbiAgICBkZWNpc2lvbk5vZGVJZDogc3RyaW5nO1xuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludDogQ29ubmVjdGlvblBvaW50IHwgbnVsbCA9IG51bGw7XG4gIHBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dDb25kaXRpb25zRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGl2ZURlY2lzaW9uTm9kZUlkOiBzdHJpbmcgPSAnJztcbiAgYWN0aXZlQ29ubmVjdGlvbklkOiBzdHJpbmcgPSAnJztcbiAgZGVjaXNpb25Db25kaXRpb25Qb3B1cFg6IG51bWJlciA9IDA7XG4gIGRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZOiBudW1iZXIgPSAwO1xuXG4gIGlzQ3JlYXRpbmdTdGFnZUZyb21EZWNpc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwZW5kaW5nRGVjaXNpb25Db25kaXRpb246IHN0cmluZyA9ICcnO1xuICBhY3RpdmVTdGFnZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgYWN0aXZlQWN0aW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHNob3dTdGFnZURpYWxvZ0xvY2FsOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dFc2NhbGF0aW9uRGlhbG9nTG9jYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWN0aXZlRXNjYWxhdGlvblR5cGU6IFdyaXRhYmxlU2lnbmFsPEVzY2FsYXRpb25UeXBlIHwgbnVsbD4gPSBzaWduYWwobnVsbCk7XG4gIGFjdGl2ZVN0YWdlQ29kZTogV3JpdGFibGVTaWduYWw8c3RyaW5nIHwgbnVsbD4gPSBzaWduYWwobnVsbCk7XG4gIGFjdGl2ZVN0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPiA9IHt9O1xuICBhY3RpdmVBY3Rpb25EYXRhOiBDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgc2hvd0FjdGlvbkRpYWxvZ0xvY2FsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcG90ZW50aWFsVGFyZ2V0UG9pbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXRlOiBXb3JrZmxvd0Rlc2lnbmVyU3RhdGUsXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogV29ya2Zsb3dEYXRhU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ2FudmFzU2l6ZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG1vdXNlIGNsaWNrIG9uIGNhbnZhc1xuICBvbkNhbnZhc0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gT25seSBwcm9jZXNzIGNhbnZhcyBjbGlja3MgaWYgYSB0b29sIGlzIHNlbGVjdGVkXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVG9vbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGNsaWNrIG9jY3VycmVkXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ0NhbnZhcyBjbGlja2VkIGF0OicsXG4gICAgICBwb3NpdGlvbixcbiAgICAgICd3aXRoIHRvb2w6JyxcbiAgICAgIHRoaXMuc2VsZWN0ZWRUb29sXG4gICAgKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3dpbWxhbmUgaW5kZXggYmFzZWQgb24gcG9zaXRpb25cbiAgICAvLyBjb25zdCBzd2ltbGFuZUluZGV4ID0gTWF0aC5mbG9vcihwb3NpdGlvbi55IC8gdGhpcy5zd2ltbGFuZUhlaWdodCk7XG5cbiAgICAvLyBPbmx5IGVtaXQgdGhlIHBvc2l0aW9uIGlmIHdlIGhhdmUgYSB0b29sIHNlbGVjdGVkIGFuZCBpdCdzIGEgdmFsaWQgY2xpY2sgYXJlYVxuICAgIGlmICh0aGlzLnNlbGVjdGVkVG9vbCkge1xuICAgICAgdGhpcy5jbGlja2VkUG9zaXRpb24uZW1pdCh7XG4gICAgICAgIHg6IHBvc2l0aW9uLngsXG4gICAgICAgIHk6IHBvc2l0aW9uLnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBvblNob3dTaGllbGREaWFsb2coc3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbm9kZVxuICAgIGNvbnN0IG5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoc3RhZ2VJZCk7XG4gICAgaWYgKG5vZGVJbmZvKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlSWQgPSBzdGFnZUlkO1xuICAgICAgdGhpcy5hY3RpdmVTdGFnZURhdGEgPSB7IC4uLm5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhLCBpZDogc3RhZ2VJZCB9O1xuICAgICAgY29uc29sZS5sb2codGhpcy5hY3RpdmVTdGFnZURhdGEpO1xuICAgICAgdGhpcy5zaG93U3RhZ2VEaWFsb2dMb2NhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgb25TaG93QWN0aW9uRGlhbG9nKGNvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coXCJDT05FQ1RJT05cIiwgY29ubmVjdGlvbkluZm8pO1xuICAgIC8vIEZpbmQgdGhlIG5vZGVcbiAgICAvLyBjb25zdCBjb25uZWN0aW9uSW5mbyA9IHRoaXMuc3RhdGUuZmluZEFjdGlvbkJ5SWQoYWN0aW9uSWQpO1xuICAgIGlmIChjb25uZWN0aW9uSW5mbykge1xuICAgICAgdGhpcy5hY3RpdmVBY3Rpb25JZCA9IGNvbm5lY3Rpb25JbmZvLmlkO1xuICAgICAgdGhpcy5hY3RpdmVBY3Rpb25EYXRhID0gY29ubmVjdGlvbkluZm87XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmFjdGl2ZUFjdGlvbkRhdGEpO1xuICAgICAgdGhpcy5zaG93QWN0aW9uRGlhbG9nTG9jYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9uU2hvd0VzY2FsYXRpb25EaWFsb2coZXZlbnQ6IHtcbiAgICBzdGFnZUlkOiBzdHJpbmc7XG4gICAgdHlwZTogRXNjYWxhdGlvblR5cGU7XG4gIH0pOiB2b2lkIHtcbiAgICAvLyBGaW5kIHRoZSBub2RlXG4gICAgY29uc3Qgbm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChldmVudC5zdGFnZUlkKTtcbiAgICBpZiAobm9kZUluZm8pIHtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IGV2ZW50LnN0YWdlSWQ7XG4gICAgICB0aGlzLmFjdGl2ZVN0YWdlRGF0YSA9IG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhIHx8IHtcbiAgICAgICAgaWQ6IHRoaXMuYWN0aXZlU3RhZ2VJZCxcbiAgICAgIH07XG4gICAgICB0aGlzLmFjdGl2ZUVzY2FsYXRpb25UeXBlLnNldChldmVudC50eXBlKTtcbiAgICAgIHRoaXMuYWN0aXZlU3RhZ2VDb2RlLnNldCh0aGlzLmFjdGl2ZVN0YWdlRGF0YT8uQ29kZSB8fCAnJyk7XG4gICAgICBjb25zb2xlLmxvZygnQWN0aXZlIFN0YWdlIERhdGE6JywgdGhpcy5hY3RpdmVTdGFnZURhdGEpO1xuICAgICAgY29uc29sZS5sb2coJ0VzY2FsYXRpb24gVHlwZTonLCB0aGlzLmFjdGl2ZUVzY2FsYXRpb25UeXBlKCkpO1xuICAgICAgdGhpcy5zaG93RXNjYWxhdGlvbkRpYWxvZ0xvY2FsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGRpYWxvZyBjbG9zdXJlXG4gIG9uU3RhZ2VEaWFsb2dDbG9zZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93U3RhZ2VEaWFsb2dMb2NhbCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVTdGFnZURhdGEgPSB7fTtcbiAgfVxuXG4gIG9uQWN0aW9uRGlhbG9nQ2xvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FjdGlvbkRpYWxvZ0xvY2FsID0gZmFsc2U7XG4gICAgdGhpcy5hY3RpdmVBY3Rpb25JZCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVBY3Rpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIG1ldGhvZCB0byBoYW5kbGUgZGlhbG9nIGNsb3N1cmVcbiAgb25Fc2NhbGF0aW9uRGlhbG9nQ2xvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbCA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VJZCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVFc2NhbGF0aW9uVHlwZS5zZXQobnVsbCk7XG4gICAgdGhpcy5hY3RpdmVTdGFnZUNvZGUuc2V0KG51bGwpO1xuICAgIHRoaXMuYWN0aXZlU3RhZ2VEYXRhID0ge307XG4gIH1cblxuICAvLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNhdmluZyBzdGFnZSBkYXRhXG4gIG9uU3RhZ2VEaWFsb2dTYXZlZChzdGFnZURhdGE6IFBhcnRpYWw8V29ya2Zsb3dTdGFnZT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdGFnZUlkKSB7XG4gICAgICAvLyBFZGl0aW5nIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICBjb25zdCBub2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHRoaXMuYWN0aXZlU3RhZ2VJZCk7XG4gICAgICBpZiAobm9kZUluZm8pIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGFnZSBkYXRhXG4gICAgICAgIG5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhID0ge1xuICAgICAgICAgIC4uLm5vZGVJbmZvLm5vZGUuc3RhZ2VEYXRhLFxuICAgICAgICAgIC4uLnN0YWdlRGF0YSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2coJ1VwZGF0ZWQgc3RhZ2UgZGF0YTonLCBub2RlSW5mby5ub2RlLnN0YWdlRGF0YSk7XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcGFyZW50IGNvbXBvbmVudCB0byBrbm93IGFib3V0IHRoZSB1cGRhdGVcbiAgICAgICAgdGhpcy5zdGFnZVByb3BlcnRpZXNVcGRhdGVkLmVtaXQoe1xuICAgICAgICAgIG5vZGVJZDogdGhpcy5hY3RpdmVTdGFnZUlkLFxuICAgICAgICAgIHN0YWdlRGF0YTogbm9kZUluZm8ubm9kZS5zdGFnZURhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBkaWFsb2dcbiAgICB0aGlzLm9uU3RhZ2VEaWFsb2dDbG9zZWQoKTtcbiAgfVxuXG4gIG9uQWN0aW9uRGlhbG9nU2F2ZWQoYWN0aW9uRGF0YTogQ29ubmVjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUFjdGlvbklkKSB7XG4gICAgICAvLyBFZGl0aW5nIGFuIGV4aXN0aW5nIHN0YWdlXG4gICAgICAvLyBsZXQgY29ubmVjdGlvbkluZm8gPSB0aGlzLnN0YXRlLmZpbmRBY3Rpb25CeUlkKHRoaXMuYWN0aXZlQWN0aW9uSWQpO1xuICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMubWFwKChjb25uZWN0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY29ubmVjdGlvbi5pZCA9PT0gdGhpcy5hY3RpdmVBY3Rpb25JZCkge1xuICAgICAgICAgIGNvbm5lY3Rpb24ubGFiZWwgPSBhY3Rpb25EYXRhLmxhYmVsO1xuICAgICAgICAgIGNvbm5lY3Rpb24uYWN0aW9uID0gYWN0aW9uRGF0YS5hY3Rpb247XG4gICAgICAgICAgY29ubmVjdGlvbi50YXJnZXRTdGF0dXMgPSBhY3Rpb25EYXRhLnRhcmdldFN0YXR1cztcbiAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlZCBhY3Rpb24gZGF0YTonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIGRpYWxvZ1xuICAgIHRoaXMub25BY3Rpb25EaWFsb2dDbG9zZWQoKTtcbiAgfVxuXG4gIHVwZGF0ZUNhbnZhc1NpemUoKTogdm9pZCB7XG4gICAgY29uc3QgcmVxdWlyZWRIZWlnaHQgPVxuICAgICAgKHRoaXMuc3RhdGUuc3dpbWxhbmVzLmxlbmd0aCArIDEpICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICB0aGlzLmNhbnZhc0hlaWdodCA9IE1hdGgubWF4KDIwMDAsIHJlcXVpcmVkSGVpZ2h0KTsgLy8gRW5zdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb3VyIGRlZmF1bHQgaGVpZ2h0XG5cbiAgICAvLyBVcGRhdGUgYWxsIHRoZSBzd2ltbGFuZSBjbGlwIHBhdGhzIHdoZW4gc2l6ZSBjaGFuZ2VzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLnN3aW1sYW5lcy5mb3JFYWNoKChzd2ltbGFuZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgY2xpcFBhdGhJZCA9IGBzd2ltbGFuZS1jbGlwLSR7aW5kZXh9YDtcbiAgICAgICAgY29uc3QgY2xpcFBhdGhFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xpcFBhdGhJZCk7XG4gICAgICAgIGlmIChjbGlwUGF0aEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCByZWN0RWxlbWVudCA9IGNsaXBQYXRoRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdyZWN0Jyk7XG4gICAgICAgICAgaWYgKHJlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICByZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy5jYW52YXNXaWR0aC50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBTVkcgY2FudmFzXG4gIHByaXZhdGUgZ2V0TW91c2VQb3NpdGlvbihldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gICAgLy8gVXNlIGNsaWVudFgvWSBhbmQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wLFxuICAgIH07XG4gIH1cblxuICBzaG93Q29ubmVjdGlvblBvaW50cyhub2RlSWQ6IHN0cmluZywgc3dpbWxhbmVJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlQ29ubmVjdGlvblBvaW50c05vZGVJZCA9IG5vZGVJZDtcbiAgfVxuXG4gIGlzTW91c2VPdmVyTm9kZShcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBub2RlOiBXRk5vZGUsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRNb3VzZVBvc2l0aW9uKGV2ZW50KTtcbiAgICBjb25zdCBub2RlQm91bmRzID0gdGhpcy5nZXROb2RlQm91bmRzV2l0aFBhZGRpbmcobm9kZSwgc3dpbWxhbmVJbmRleCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgcG9zaXRpb24ueCA+PSBub2RlQm91bmRzLnggJiZcbiAgICAgIHBvc2l0aW9uLnggPD0gbm9kZUJvdW5kcy54ICsgbm9kZUJvdW5kcy53aWR0aCAmJlxuICAgICAgcG9zaXRpb24ueSA+PSBub2RlQm91bmRzLnkgJiZcbiAgICAgIHBvc2l0aW9uLnkgPD0gbm9kZUJvdW5kcy55ICsgbm9kZUJvdW5kcy5oZWlnaHRcbiAgICApO1xuICB9XG5cbiAgLy8gaGVscGVyIG1ldGhvZCB0byBjYWxjdWxhdGUgbm9kZSBib3VuZHMgd2l0aCBwYWRkaW5nXG4gIGdldE5vZGVCb3VuZHNXaXRoUGFkZGluZyhcbiAgICBub2RlOiBXRk5vZGUsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHBhZGRpbmcgPSAxMDsgLy8gQWRkIDEwcHggcGFkZGluZyBhcm91bmQgbm9kZXMgZm9yIGVhc2llciBob3ZlciBkZXRlY3Rpb25cblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgWSBwb3NpdGlvbiBpbmNsdWRpbmcgc3dpbWxhbmUgb2Zmc2V0XG4gICAgY29uc3QgYWJzb2x1dGVZID0gbm9kZS55ICsgc3dpbWxhbmVJbmRleCAqIDI2MztcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBub2RlLnggLSBwYWRkaW5nLFxuICAgICAgeTogYWJzb2x1dGVZIC0gcGFkZGluZyxcbiAgICAgIHdpZHRoOiBub2RlLndpZHRoICsgcGFkZGluZyAqIDIsXG4gICAgICBoZWlnaHQ6IG5vZGUuaGVpZ2h0ICsgcGFkZGluZyAqIDIsXG4gICAgfTtcbiAgfVxuXG4gIGhpZGVDb25uZWN0aW9uUG9pbnRzKG5vZGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy52aXNpYmxlQ29ubmVjdGlvblBvaW50c05vZGVJZCA9PT0gbm9kZUlkICYmXG4gICAgICAhdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpXG4gICAgKSB7XG4gICAgICB0aGlzLnZpc2libGVDb25uZWN0aW9uUG9pbnRzTm9kZUlkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpc0Nvbm5lY3Rpb25Qb2ludFZpc2libGUobm9kZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29ubmVjdGlvblBvaW50c05vZGVJZCA9PT0gbm9kZUlkO1xuICB9XG5cbiAgc3RhcnRDb25uZWN0aW9uRHJhZyhcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBwb2ludDogQ29ubmVjdGlvblBvaW50LFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBleGl0IHBvaW50IG5vZGVcbiAgICBjb25zdCBub2RlSW5mbyA9IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKHBvaW50Lm5vZGVJZCk7XG4gICAgaWYgKFxuICAgICAgbm9kZUluZm8gJiZcbiAgICAgIG5vZGVJbmZvLm5vZGUudHlwZSA9PT0gJ3N0YWdlJyAmJlxuICAgICAgbm9kZUluZm8ubm9kZS5zdGFnZURhdGE/LklzRXhpdFBvaW50XG4gICAgKSB7XG4gICAgICAvLyBEb24ndCBhbGxvdyBjb25uZWN0aW9ucyBmcm9tIGV4aXQgcG9pbnRzXG4gICAgICBjb25zb2xlLmxvZygnQ2Fubm90IGNyZWF0ZSBjb25uZWN0aW9ucyBmcm9tIGV4aXQgcG9pbnRzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIHRoaXMuc3RhdGUuc3RhcnRDb25uZWN0aW9uRHJhZyhcbiAgICAgIHBvaW50LFxuICAgICAgc3dpbWxhbmVJbmRleCxcbiAgICAgIHBvc2l0aW9uLngsXG4gICAgICBwb3NpdGlvbi55XG4gICAgKTtcblxuICAgIC8vIEFkZCBtb3VzZSBtb3ZlIGFuZCBtb3VzZSB1cCBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIGRvY3VtZW50XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgfVxuXG4gIGhpZ2hsaWdodFBvdGVudGlhbFRhcmdldHMoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNDb25uZWN0aW9uRHJhZ2dpbmcoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnN0IHRhcmdldFBvaW50SW5mbyA9IHRoaXMuZmluZENvbm5lY3Rpb25Qb2ludEF0UG9zaXRpb24oXG4gICAgICBwb3NpdGlvbi54LFxuICAgICAgcG9zaXRpb24ueVxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXRQb2ludEluZm8gJiZcbiAgICAgIHRhcmdldFBvaW50SW5mby5wb2ludC5pZCAhPT0gdGhpcy5wb3RlbnRpYWxUYXJnZXRQb2ludElkXG4gICAgKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbmV3IHRhcmdldCBwb2ludFxuICAgICAgdGhpcy5wb3RlbnRpYWxUYXJnZXRQb2ludElkID0gdGFyZ2V0UG9pbnRJbmZvLnBvaW50LmlkO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldFBvaW50SW5mbyAmJiB0aGlzLnBvdGVudGlhbFRhcmdldFBvaW50SWQpIHtcbiAgICAgIC8vIFdlJ3JlIG5vIGxvbmdlciBvdmVyIGEgdGFyZ2V0IHBvaW50XG4gICAgICB0aGlzLnBvdGVudGlhbFRhcmdldFBvaW50SWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVzZSBhcnJvdyBmdW5jdGlvbnMgdG8gcHJlc2VydmUgJ3RoaXMnIGNvbnRleHRcbiAgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbihldmVudCk7XG4gICAgdGhpcy51cGRhdGVDb25uZWN0aW9uRHJhZyhwb3NpdGlvbi54LCBwb3NpdGlvbi55KTtcbiAgICB0aGlzLmhpZ2hsaWdodFBvdGVudGlhbFRhcmdldHMoZXZlbnQpO1xuICB9O1xuXG4gIHVwZGF0ZUNvbm5lY3Rpb25EcmFnKGN1cnJlbnRYOiBudW1iZXIsIGN1cnJlbnRZOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50KSB7XG4gICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuY3VycmVudFggPSBjdXJyZW50WDtcbiAgICAgIHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5jdXJyZW50WSA9IGN1cnJlbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgd2hpY2ggc3dpbWxhbmUgdGhlIGN1cnNvciBpcyBvdmVyXG4gICAgICBjb25zdCBzd2ltbGFuZUluZGV4ID0gTWF0aC5mbG9vcihjdXJyZW50WSAvIHRoaXMuc3dpbWxhbmVIZWlnaHQpO1xuICAgICAgaWYgKHN3aW1sYW5lSW5kZXggPj0gMCAmJiBzd2ltbGFuZUluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgdGFyZ2V0IHN3aW1sYW5lIGlzIGZ1bGx5IHZpc2libGVcbiAgICAgICAgdGhpcy5lbnN1cmVTd2ltbGFuZUluVmlldyhzd2ltbGFuZUluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbk1vdXNlVXAgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnNvbGUubG9nKCdNb3VzZSB1cCBhdCBwb3NpdGlvbjonLCBwb3NpdGlvbik7XG4gICAgY29uc29sZS5sb2coJ0lzIGNvbm5lY3Rpb24gZHJhZ2dpbmc6JywgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKTtcblxuICAgIC8vIE9ubHkgcHJvY2VlZCBpZiB3ZSBhcmUgZHJhZ2dpbmcgYSBjb25uZWN0aW9uXG4gICAgaWYgKCF0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBkcm9wcGluZyBvbnRvIGEgY29ubmVjdGlvbiBwb2ludFxuICAgIGNvbnN0IHRhcmdldFBvaW50SW5mbyA9IHRoaXMuZmluZENvbm5lY3Rpb25Qb2ludEF0UG9zaXRpb24oXG4gICAgICBwb3NpdGlvbi54LFxuICAgICAgcG9zaXRpb24ueVxuICAgICk7XG5cbiAgICBpZiAodGFyZ2V0UG9pbnRJbmZvKSB7XG4gICAgICAvLyBXZSBmb3VuZCBhIHRhcmdldCBjb25uZWN0aW9uIHBvaW50XG4gICAgICBjb25zb2xlLmxvZygnRm91bmQgdGFyZ2V0IGNvbm5lY3Rpb24gcG9pbnQ6JywgdGFyZ2V0UG9pbnRJbmZvKTtcblxuICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgcG9pbnQgYW5kIHN3aW1sYW5lIGluZGV4XG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHRoaXMuc3RhdGUuZHJhZ2dpbmdDb25uZWN0aW9uRGF0YS5zb3VyY2VQb2ludDtcbiAgICAgIGNvbnN0IHNvdXJjZVN3aW1sYW5lSW5kZXggPVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlU3dpbWxhbmVJbmRleDtcblxuICAgICAgaWYgKHNvdXJjZVBvaW50ICYmIHNvdXJjZVN3aW1sYW5lSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBQcmV2ZW50IGNvbm5lY3RpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICBpZiAoc291cmNlUG9pbnQubm9kZUlkICE9PSB0YXJnZXRQb2ludEluZm8ubm9kZUlkKSB7XG4gICAgICAgICAgLy8gR2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGUgdHlwZXMgdG8gY2hlY2sgaWYgY29ubmVjdGlvbiBpcyBhbGxvd2VkXG4gICAgICAgICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChzb3VyY2VQb2ludC5ub2RlSWQpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldE5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoXG4gICAgICAgICAgICB0YXJnZXRQb2ludEluZm8ubm9kZUlkXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNvdXJjZU5vZGVJbmZvICYmXG4gICAgICAgICAgICB0YXJnZXROb2RlSW5mbyAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jYW5Db25uZWN0KFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSW5mby5ub2RlLnR5cGUsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJbmZvLm5vZGUudHlwZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICBpZDogYGNvbm4tJHtEYXRlLm5vdygpfS0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApfWAsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJZDogc291cmNlUG9pbnQubm9kZUlkLFxuICAgICAgICAgICAgICB0YXJnZXROb2RlSWQ6IHRhcmdldFBvaW50SW5mby5ub2RlSWQsXG4gICAgICAgICAgICAgIHNvdXJjZVBvaW50SWQ6IHNvdXJjZVBvaW50LmlkLFxuICAgICAgICAgICAgICB0YXJnZXRQb2ludElkOiB0YXJnZXRQb2ludEluZm8ucG9pbnQuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXg6IHRhcmdldFBvaW50SW5mby5zd2ltbGFuZUluZGV4LFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIGFjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEFkZCB0byBjb25uZWN0aW9ucyBhcnJheVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZWQgZGlyZWN0IGNvbm5lY3Rpb24gYmV0d2VlbiBub2RlczonLCBjb25uZWN0aW9uKTtcblxuICAgICAgICAgICAgLy8gTm90aWZ5IGFib3V0IGNvbm5lY3Rpb24gY3JlYXRpb25cbiAgICAgICAgICAgIHRoaXMub25Db25uZWN0aW9uQ3JlYXRlZChjb25uZWN0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICdDYW5ub3QgY29ubmVjdCB0aGVzZSBub2RlIHR5cGVzOicsXG4gICAgICAgICAgICAgIHNvdXJjZU5vZGVJbmZvPy5ub2RlLnR5cGUsXG4gICAgICAgICAgICAgICctPicsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJbmZvPy5ub2RlLnR5cGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDYW5ub3QgY29ubmVjdCBhIG5vZGUgdG8gaXRzZWxmJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRW5kIHRoZSBjb25uZWN0aW9uIGRyYWdcbiAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcG9zaXRpb24gaXMgd2l0aGluIGFueSBzd2ltbGFuZVxuICAgIGNvbnN0IGlzSW5zaWRlU3dpbWxhbmUgPSB0aGlzLmlzUG9zaXRpb25JbnNpZGVTd2ltbGFuZShwb3NpdGlvbi55KTtcbiAgICBjb25zb2xlLmxvZygnSXMgaW5zaWRlIHN3aW1sYW5lOicsIGlzSW5zaWRlU3dpbWxhbmUpO1xuXG4gICAgLy8gT25seSBzaG93IHBvcHVwIGlmIHdpdGhpbiBhIHN3aW1sYW5lXG4gICAgaWYgKGlzSW5zaWRlU3dpbWxhbmUgJiYgdGhpcy5zdGF0ZS5pc0Nvbm5lY3Rpb25EcmFnZ2luZygpKSB7XG4gICAgICBjb25zb2xlLmxvZygnU2hvd2luZyBjb25uZWN0aW9uIHBvcHVwJyk7XG4gICAgICB0aGlzLnNob3dDb25uZWN0aW9uUG9wdXAocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVuZCB0aGUgY29ubmVjdGlvbiBkcmFnIGlmIG91dHNpZGUgYSBzd2ltbGFuZVxuICAgICAgY29uc29sZS5sb2coJ0VuZGluZyBjb25uZWN0aW9uIGRyYWcgd2l0aG91dCBzaG93aW5nIHBvcHVwJyk7XG4gICAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gICAgfVxuICB9O1xuXG4gIGZpbmRDb25uZWN0aW9uUG9pbnRBdFBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdG9sZXJhbmNlOiBudW1iZXIgPSAxMFxuICApOiB7XG4gICAgcG9pbnQ6IENvbm5lY3Rpb25Qb2ludDtcbiAgICBub2RlSWQ6IHN0cmluZztcbiAgICBzd2ltbGFuZUluZGV4OiBudW1iZXI7XG4gIH0gfCBudWxsIHtcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHN3aW1sYW5lcyBhbmQgbm9kZXMgdG8gZmluZCBjb25uZWN0aW9uIHBvaW50c1xuICAgIGZvciAoXG4gICAgICBsZXQgc3dpbWxhbmVJbmRleCA9IDA7XG4gICAgICBzd2ltbGFuZUluZGV4IDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoO1xuICAgICAgc3dpbWxhbmVJbmRleCsrXG4gICAgKSB7XG4gICAgICBjb25zdCBzd2ltbGFuZSA9IHRoaXMuc3RhdGUuc3dpbWxhbmVzW3N3aW1sYW5lSW5kZXhdO1xuXG4gICAgICBpZiAoIXN3aW1sYW5lLm5vZGVzKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHN3aW1sYW5lLm5vZGVzKSB7XG4gICAgICAgIGlmICghbm9kZS5jb25uZWN0aW9uUG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBub2RlIChpbmNsdWRpbmcgc3dpbWxhbmUgb2Zmc2V0KVxuICAgICAgICBjb25zdCBhYnNvbHV0ZU5vZGVYID0gbm9kZS54O1xuICAgICAgICBjb25zdCBhYnNvbHV0ZU5vZGVZID0gbm9kZS55ICsgc3dpbWxhbmVJbmRleCAqIHRoaXMuc3dpbWxhbmVIZWlnaHQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBub2RlLmNvbm5lY3Rpb25Qb2ludHMpIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGNvbm5lY3Rpb24gcG9pbnRcbiAgICAgICAgICBjb25zdCBwb2ludFggPSBhYnNvbHV0ZU5vZGVYICsgcG9pbnQueDtcbiAgICAgICAgICBjb25zdCBwb2ludFkgPSBhYnNvbHV0ZU5vZGVZICsgcG9pbnQueTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyB3aXRoaW4gdG9sZXJhbmNlIG9mIHRoaXMgcG9pbnRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyh4IC0gcG9pbnRYKSA8PSB0b2xlcmFuY2UgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKHkgLSBwb2ludFkpIDw9IHRvbGVyYW5jZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgICAgICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICAgICAgICAgIHN3aW1sYW5lSW5kZXg6IHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaXNQb3NpdGlvbkluc2lkZVN3aW1sYW5lKHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHkgcG9zaXRpb24gaXMgd2l0aGluIGFueSBzd2ltbGFuZVxuICAgIGNvbnN0IHN3aW1sYW5lQ291bnQgPSB0aGlzLnN0YXRlLnN3aW1sYW5lcy5sZW5ndGg7XG4gICAgaWYgKHN3aW1sYW5lQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIEVhY2ggc3dpbWxhbmUgaGFzIGEgaGVpZ2h0IG9mIDI2M3B4XG4gICAgY29uc3QgdG90YWxTd2ltbGFuZUhlaWdodCA9IHN3aW1sYW5lQ291bnQgKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuXG4gICAgLy8gQ2hlY2sgaWYgeSBpcyB3aXRoaW4gdGhlIHRvdGFsIGhlaWdodCBvZiBhbGwgc3dpbWxhbmVzXG4gICAgcmV0dXJuIHkgPj0gMCAmJiB5IDwgdG90YWxTd2ltbGFuZUhlaWdodDtcbiAgfVxuXG4gIHNob3dDb25uZWN0aW9uUG9wdXAoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnU2hvd2luZyBjb25uZWN0aW9uIHBvcHVwIGF0OicsIHgsIHkpO1xuICAgIHRoaXMucG9wdXBYID0geDtcbiAgICB0aGlzLnBvcHVwWSA9IHk7XG5cbiAgICAvLyBHZXQgYWxsb3dlZCBub2RlIHR5cGVzIGJhc2VkIG9uIHRoZSBzb3VyY2Ugbm9kZSB0eXBlXG4gICAgdGhpcy5hbGxvd2VkTm9kZVR5cGVzID0gdGhpcy5zdGF0ZS5nZXRBbGxvd2VkVGFyZ2V0Tm9kZVR5cGVzKCk7XG4gICAgY29uc29sZS5sb2coJ0FsbG93ZWQgbm9kZSB0eXBlczonLCB0aGlzLmFsbG93ZWROb2RlVHlwZXMpO1xuXG4gICAgLy8gT25seSBzaG93IHRoZSBwb3B1cCBpZiB3ZSBoYXZlIGFsbG93ZWQgbm9kZSB0eXBlc1xuICAgIGlmICh0aGlzLmFsbG93ZWROb2RlVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5wb3B1cFZpc2libGUgPSB0cnVlO1xuICAgICAgY29uc29sZS5sb2coJ1BvcHVwIHZpc2liaWxpdHkgc2V0IHRvIHRydWUnKTtcblxuICAgICAgLy8gRm9yY2UgdGhlIHBvcHVwIHRvIGJlIHZpc2libGUgaW4gdGhlIG5leHQgdGlja1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJcyBwb3B1cCB2aXNpYmxlIGluIG5leHQgdGljazonLCB0aGlzLnBvcHVwVmlzaWJsZSk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYWxsb3dlZCBub2RlIHR5cGVzLCBqdXN0IGVuZCB0aGUgZHJhZ1xuICAgICAgY29uc29sZS5sb2coJ05vIGFsbG93ZWQgbm9kZSB0eXBlcywgZW5kaW5nIGRyYWcnKTtcbiAgICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgICB9XG4gIH1cblxuICBoaWRlQ29ubmVjdGlvblBvcHVwKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDYWxsIHRvIGhpZGUnKTtcbiAgICB0aGlzLnBvcHVwVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhdGUuZW5kQ29ubmVjdGlvbkRyYWcoKTtcbiAgfVxuXG4gIC8vIEFkZCB0aGlzIGhhbmRsZXIgdG8gY2xvc2UgdGhlIHBvcHVwIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxuICAvLyBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIC8vIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAvLyAgIGlmICh0aGlzLnBvcHVwVmlzaWJsZSkge1xuICAvLyAgICAgY29uc3QgcG9wdXBFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmVyYmVuLXBvcC1VcCcpO1xuICAvLyAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiAhcG9wdXBFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAvLyAgICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBjcmVhdGVOb2RlQ29ubmVjdGlvbihub2RlVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25QYXRoRGF0YSgpO1xuICAgIGlmICghcGF0aERhdGEpIHtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSB0eXBlIGlzIGFsbG93ZWQgdG8gYmUgY3JlYXRlZFxuICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHRoaXMuc3RhdGUuZ2V0QWxsb3dlZFRhcmdldE5vZGVUeXBlcygpO1xuICAgIGlmICghYWxsb3dlZFR5cGVzLmluY2x1ZGVzKG5vZGVUeXBlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYENhbm5vdCBjcmVhdGUgY29ubmVjdGlvbiB0byAke25vZGVUeXBlfSBmcm9tIGN1cnJlbnQgbm9kZSB0eXBlYFxuICAgICAgKTtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZW5kWCwgZW5kWSwgc291cmNlU3dpbWxhbmVJbmRleCB9ID0gcGF0aERhdGE7XG5cbiAgICAvLyBHZXQgc291cmNlIG5vZGUgaW5mb1xuICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVBvaW50O1xuICAgIGlmICghc291cmNlUG9pbnQpIHtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoc291cmNlUG9pbnQubm9kZUlkKTtcbiAgICBpZiAoIXNvdXJjZU5vZGVJbmZvKSB7XG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBjb25uZWN0aW5nIGZyb20gYSBkZWNpc2lvbiB0byBhIHN0YWdlLCBzaG93IGNvbmRpdGlvbiBwb3B1cCBmaXJzdFxuICAgIGlmIChzb3VyY2VOb2RlSW5mby5ub2RlLnR5cGUgPT09ICdkZWNpc2lvbicgJiYgbm9kZVR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIFN0b3JlIGluZm9ybWF0aW9uIGZvciBsYXRlciBzdGFnZSBjcmVhdGlvblxuICAgICAgdGhpcy5wZW5kaW5nRGVjaXNpb25Db25uZWN0aW9uID0ge1xuICAgICAgICBkZWNpc2lvbk5vZGVJZDogc291cmNlTm9kZUluZm8ubm9kZS5pZCxcbiAgICAgICAgc3dpbWxhbmVJbmRleDogc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgICAgeDogZW5kWCxcbiAgICAgICAgeTogZW5kWSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBwb3B1cCBwb3NpdGlvbiAtIHBvc2l0aW9uIGl0IG5lYXIgdGhlIGRlY2lzaW9uIG5vZGVcbiAgICAgIGNvbnN0IHN3aW1sYW5lT2Zmc2V0WSA9IHNvdXJjZVN3aW1sYW5lSW5kZXggKiAyNjM7XG5cbiAgICAgIC8vIENlbnRlciB0aGUgcG9wdXAgb3ZlciB0aGUgY29ubmVjdGlvbiBlbmRwb2ludFxuICAgICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWCA9IGVuZFg7XG4gICAgICB0aGlzLmRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZID0gZW5kWSAtIDE1MDsgLy8gUG9zaXRpb24gYWJvdmUgdGhlIGVuZHBvaW50XG5cbiAgICAgIC8vIFNldCBkZWNpc2lvbiBub2RlIElEXG4gICAgICB0aGlzLmFjdGl2ZURlY2lzaW9uTm9kZUlkID0gc291cmNlTm9kZUluZm8ubm9kZS5pZDtcbiAgICAgIHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nID0gdHJ1ZTtcblxuICAgICAgLy8gRW5kIHRoZSBjb25uZWN0aW9uIGRyYWdcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN3aW1sYW5lSW5kZXggPSBNYXRoLmZsb29yKGVuZFkgLyB0aGlzLnN3aW1sYW5lSGVpZ2h0KTtcbiAgICBjb25zdCBzd2ltbGFuZVRvcCA9IHN3aW1sYW5lSW5kZXggKiB0aGlzLnN3aW1sYW5lSGVpZ2h0O1xuICAgIC8vIENhbGN1bGF0ZSBzd2ltbGFuZS1yZWxhdGl2ZSBwb3NpdGlvblxuICAgIGNvbnN0IHN3aW1sYW5lT2Zmc2V0WSA9IHNvdXJjZVN3aW1sYW5lSW5kZXggKiAyNjM7XG4gICAgbGV0IHJlbGF0aXZlWSA9IGVuZFkgLSBzd2ltbGFuZU9mZnNldFkgLSA1MDsgLy8gQWRkIGhhbGYgbm9kZSBoZWlnaHQgZm9yIGJldHRlciBhbGlnbm1lbnRcbiAgICBjb25zdCBzd2ltbGFuZUJvdHRvbSA9IHN3aW1sYW5lVG9wICsgMjYzO1xuXG4gICAgLy8gQ2xhbXAgbm9kZVkgc28gbm9kZSBzdGF5cyB3aXRoaW4gc3dpbWxhbmVcblxuICAgIGNvbnNvbGUubG9nKGVuZFksIHN3aW1sYW5lSW5kZXgsIHN3aW1sYW5lT2Zmc2V0WSwgc3dpbWxhbmVCb3R0b20pO1xuXG4gICAgaWYgKGVuZFkgLSA1MCA8IHN3aW1sYW5lVG9wKSB7XG4gICAgICBjb25zb2xlLmxvZygnTGVzcycpO1xuICAgICAgcmVsYXRpdmVZID0gc3dpbWxhbmVUb3A7IC8vIE5vZGUgd291bGQgb3ZlcmZsb3cgYWJvdmUsIHNvIGFsaWduIHRvIHRvcFxuICAgIH0gZWxzZSBpZiAoZW5kWSArIDUwID4gc3dpbWxhbmVCb3R0b20pIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb3JlJyk7XG4gICAgICByZWxhdGl2ZVkgPSBzd2ltbGFuZUJvdHRvbSAtIDEwMDsgLy8gTm9kZSB3b3VsZCBvdmVyZmxvdyBiZWxvdywgc28gYWxpZ24gdG8gYm90dG9tXG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByZWNvbmRpdGlvbnMgYmFzZWQgb24gbm9kZSB0eXBlXG4gICAgaWYgKG5vZGVUeXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHN0YWdlIGRpcmVjdGx5IHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgICAnc3RhZ2UnLFxuICAgICAgICBlbmRYLFxuICAgICAgICByZWxhdGl2ZVksXG4gICAgICAgIHsgTmFtZTogJ05ldyBTdGFnZScgfSAvLyBBZGQgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG5ld05vZGUgJiZcbiAgICAgICAgbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzICYmXG4gICAgICAgIG5ld05vZGUuY29ubmVjdGlvblBvaW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgIHNvdXJjZVBvaW50XG4gICAgICApIHtcbiAgICAgICAgLy8gSGFuZGxlIGNvbm5lY3Rpb24gY3JlYXRpb25cbiAgICAgICAgY29uc3Qgb3Bwb3NpbmdUeXBlID0ge1xuICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcbiAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgIH1bc291cmNlUG9pbnQudHlwZV0gYXMgJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMuZmluZChcbiAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGFyZ2V0UG9pbnQpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5zdGF0ZS5jcmVhdGVDb25uZWN0aW9uKFxuICAgICAgICAgICAgbmV3Tm9kZS5pZCxcbiAgICAgICAgICAgIHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmhpZGVDb25uZWN0aW9uUG9wdXAoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKG5vZGVUeXBlID09PSAnc3ViZmxvdycpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnQ3JlYXRpbmcgc3ViZmxvdyBmcm9tIGNvbm5lY3Rpb24gYXQ6JyxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgICAgJ3N3aW1sYW5lOicsXG4gICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXhcbiAgICAgICk7XG4gICAgICAvLyBTaG93IHdvcmtmbG93IHNlbGVjdGlvbiBwb3B1cCBhbmQgc3RvcmUgY29ubmVjdGlvbiBkYXRhIGZvciBsYXRlciB1c2VcbiAgICAgIHRoaXMuc2hvd1N1YmZsb3dTZWxlY3Rpb25Qb3B1cChlbmRYLCBlbmRZLCBzb3VyY2VTd2ltbGFuZUluZGV4KTtcbiAgICAgIHRoaXMuaGlkZUNvbm5lY3Rpb25Qb3B1cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBvdGhlciBub2RlcyBDcmVhdGUgdGhlIG5ldyBub2RlIGF0IHRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIGNvbm5lY3Rpb25cbiAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgc291cmNlU3dpbWxhbmVJbmRleCxcbiAgICAgIG5vZGVUeXBlIGFzIFRvb2xUeXBlLFxuICAgICAgZW5kWCxcbiAgICAgIHJlbGF0aXZlWVxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBuZXdOb2RlICYmXG4gICAgICBuZXdOb2RlLmNvbm5lY3Rpb25Qb2ludHMgJiZcbiAgICAgIG5ld05vZGUuY29ubmVjdGlvblBvaW50cy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICAvLyBGaW5kIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGNvbm5lY3Rpb24gcG9pbnQgKGNsb3Nlc3QgdG8gdGhlIHNvdXJjZSlcbiAgICAgIGlmIChzb3VyY2VQb2ludCkge1xuICAgICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgdXNlIHRoZSBmaXJzdCBjb25uZWN0aW9uIHBvaW50IG9mIG9wcG9zaW5nIHR5cGVcbiAgICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3UnZCBmaW5kIHRoZSBjbG9zZXN0IG9yIG1vc3QgYXBwcm9wcmlhdGUgcG9pbnRcbiAgICAgICAgbGV0IHRhcmdldFBvaW50O1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSBpcyBvbiByaWdodCwgdGFyZ2V0IHNob3VsZCBiZSBvbiBsZWZ0LCBldGMuXG4gICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICB9W3NvdXJjZVBvaW50LnR5cGVdIGFzICd0b3AnIHwgJ3JpZ2h0JyB8ICdib3R0b20nIHwgJ2xlZnQnO1xuXG4gICAgICAgIHRhcmdldFBvaW50ID0gbmV3Tm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuc3RhdGUuY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgICAgIG5ld05vZGUuaWQsXG4gICAgICAgICAgICB0YXJnZXRQb2ludC5pZCxcbiAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXhcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMub25Db25uZWN0aW9uQ3JlYXRlZChjb25uZWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc291cmNlTm9kZUluZm8pIHtcbiAgICAgIHRoaXMudXBkYXRlTm9kZUNvbm5lY3Rpb25zKHNvdXJjZU5vZGVJbmZvLm5vZGUpO1xuICAgIH1cblxuICAgIC8vIEVuZCB0aGUgY29ubmVjdGlvbiBkcmFnXG4gICAgdGhpcy5oaWRlQ29ubmVjdGlvblBvcHVwKCk7XG4gIH1cblxuICAvLyBNZXRob2QgdG8gaGFuZGxlIHNhdmluZyB0aGUgY29uZGl0aW9uXG4gIG9uRGVjaXNpb25Db25kaXRpb25TYXZlZChldmVudDoge1xuICAgIGNvbm5lY3Rpb25JZDogc3RyaW5nO1xuICAgIGNvbmRpdGlvbjogc3RyaW5nO1xuICB9KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBlbmRpbmdEZWNpc2lvbkNvbm5lY3Rpb24pIHtcbiAgICAgIHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkZWNpc2lvbk5vZGVJZCwgc3dpbWxhbmVJbmRleCwgeCwgeSB9ID1cbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uQ29ubmVjdGlvbjtcblxuICAgIC8vIENyZWF0ZSB0aGUgc3RhZ2UgZGlyZWN0bHkgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICBjb25zdCBub2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgc3dpbWxhbmVJbmRleCxcbiAgICAgICdzdGFnZScsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHsgTmFtZTogJ05ldyBTdGFnZScgfSAvLyBBZGQgZGVmYXVsdCBwcm9wZXJ0aWVzXG4gICAgKTtcblxuICAgIGlmIChub2RlKSB7XG4gICAgICBjb25zdCBkZWNpc2lvbk5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoZGVjaXNpb25Ob2RlSWQpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGRlY2lzaW9uTm9kZUluZm8gJiZcbiAgICAgICAgbm9kZS5jb25uZWN0aW9uUG9pbnRzICYmXG4gICAgICAgIG5vZGUuY29ubmVjdGlvblBvaW50cy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgLy8gRmluZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gcG9pbnQgZnJvbSB0aGUgZGVjaXNpb24gbm9kZVxuICAgICAgICBjb25zdCBkZWNpc2lvbk5vZGUgPSBkZWNpc2lvbk5vZGVJbmZvLm5vZGU7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uTm9kZVBvaW50cyA9IGRlY2lzaW9uTm9kZS5jb25uZWN0aW9uUG9pbnRzIHx8IFtdO1xuICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IGRlY2lzaW9uTm9kZVBvaW50cy5maW5kKFxuICAgICAgICAgIChwKSA9PiBwLnR5cGUgPT09ICdyaWdodCcgfHwgcC50eXBlID09PSAnYm90dG9tJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChzb3VyY2VQb2ludCkge1xuICAgICAgICAgIC8vIEZpbmQgb3Bwb3NpbmcgdHlwZSBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSBuZXcgc3RhZ2VcbiAgICAgICAgICBjb25zdCBvcHBvc2luZ1R5cGUgPSB7XG4gICAgICAgICAgICByaWdodDogJ2xlZnQnLFxuICAgICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgIH1bc291cmNlUG9pbnQudHlwZV0gYXMgJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCc7XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IG5vZGUuY29ubmVjdGlvblBvaW50cy5maW5kKFxuICAgICAgICAgICAgKHApID0+IHAudHlwZSA9PT0gb3Bwb3NpbmdUeXBlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICh0YXJnZXRQb2ludCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24gd2l0aCBjb25kaXRpb25cbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgICAgICAgIGlkOiBgY29ubi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMCl9YCxcbiAgICAgICAgICAgICAgc291cmNlTm9kZUlkOiBkZWNpc2lvbk5vZGUuaWQsXG4gICAgICAgICAgICAgIHRhcmdldE5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgICAgICAgc291cmNlUG9pbnRJZDogc291cmNlUG9pbnQuaWQsXG4gICAgICAgICAgICAgIHRhcmdldFBvaW50SWQ6IHRhcmdldFBvaW50LmlkLFxuICAgICAgICAgICAgICBzb3VyY2VTd2ltbGFuZUluZGV4OiBkZWNpc2lvbk5vZGVJbmZvLnN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAgIHRhcmdldFN3aW1sYW5lSW5kZXg6IHN3aW1sYW5lSW5kZXgsXG4gICAgICAgICAgICAgIGNvbmRpdGlvbjogZXZlbnQuY29uZGl0aW9uLFxuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIGFjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEFkZCBjb25uZWN0aW9uIHRvIHRoZSBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICdDcmVhdGVkIGRlY2lzaW9uIGNvbm5lY3Rpb24gd2l0aCBjb25kaXRpb246JyxcbiAgICAgICAgICAgICAgY29ubmVjdGlvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBwZW5kaW5nIGRhdGFcbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbkNvbm5lY3Rpb24gPSBudWxsO1xuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uQ29uZGl0aW9uID0gJyc7XG5cbiAgICAvLyBIaWRlIHRoZSBjb25kaXRpb24gcG9wdXBcbiAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IGZhbHNlO1xuICB9XG5cbiAgb25EZWNpc2lvbkNvbmRpdGlvbkNhbmNlbGxlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEZWNpc2lvbkNvbmRpdGlvbkRpYWxvZyA9IGZhbHNlO1xuICAgIC8vIERvbid0IGNyZWF0ZSB0aGUgc3RhZ2Ugb3IgY29ubmVjdGlvblxuICB9XG5cbiAgZ2V0Q29ubmVjdGlvblBhdGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvblBhdGhEYXRhKCk7XG4gICAgaWYgKCFwYXRoRGF0YSkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG4gICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQ7XG5cbiAgICBpZiAoIXNvdXJjZVBvaW50KSByZXR1cm4gJyc7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRPcnRob2dvbmFsUGF0aChzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSwgc291cmNlUG9pbnQudHlwZSk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uUGF0aEZvclNhdmVkQ29ubmVjdGlvbihjb25uZWN0aW9uOiBDb25uZWN0aW9uKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0aERhdGEgPSB0aGlzLnN0YXRlLmdldENvbm5lY3Rpb25EYXRhKGNvbm5lY3Rpb24pO1xuICAgICAgaWYgKCFwYXRoRGF0YSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBwYXRoIGRhdGEgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWSB9ID0gcGF0aERhdGE7XG5cbiAgICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQpO1xuICAgICAgaWYgKCFzb3VyY2VOb2RlSW5mbykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2Ugbm9kZSBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlTm9kZSA9IHNvdXJjZU5vZGVJbmZvLm5vZGU7XG4gICAgICBjb25zdCBzb3VyY2VQb2ludCA9IHNvdXJjZU5vZGUuY29ubmVjdGlvblBvaW50cz8uZmluZChcbiAgICAgICAgKHApID0+IHAuaWQgPT09IGNvbm5lY3Rpb24uc291cmNlUG9pbnRJZFxuICAgICAgKTtcblxuICAgICAgaWYgKCFzb3VyY2VQb2ludCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTb3VyY2UgcG9pbnQgbm90IGZvdW5kIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24pO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldE9ydGhvZ29uYWxQYXRoKFxuICAgICAgICBzdGFydFgsXG4gICAgICAgIHN0YXJ0WSxcbiAgICAgICAgZW5kWCxcbiAgICAgICAgZW5kWSxcbiAgICAgICAgc291cmNlUG9pbnQudHlwZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBwYXRoIGZvciBjb25uZWN0aW9uOicsIGNvbm5lY3Rpb24sIGVycm9yKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBnZXRPcnRob2dvbmFsUGF0aChcbiAgICBzdGFydFg6IG51bWJlcixcbiAgICBzdGFydFk6IG51bWJlcixcbiAgICBlbmRYOiBudW1iZXIsXG4gICAgZW5kWTogbnVtYmVyLFxuICAgIHBvaW50VHlwZTogJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCdcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBEZXRlcm1pbmUgaW5pdGlhbCBkaXJlY3Rpb24gYmFzZWQgb24gY29ubmVjdGlvbiBwb2ludCB0eXBlXG4gICAgbGV0IHBhdGggPSAnJztcblxuICAgIC8vIEZvciBzaWRlIHBvaW50cyAobGVmdC9yaWdodCksIHN0YXJ0IHdpdGggaG9yaXpvbnRhbCBsaW5lXG4gICAgaWYgKHBvaW50VHlwZSA9PT0gJ2xlZnQnIHx8IHBvaW50VHlwZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgLy8gQ2FsY3VsYXRlIGhvcml6b250YWwgZGlzdGFuY2VcbiAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0ID0gZW5kWCAtIHN0YXJ0WDtcblxuICAgICAgLy8gSWYgdGhlIGVuZCBwb2ludCBpcyB2ZXJ5IGNsb3NlIGhvcml6b250YWxseSwgdXNlIGEgc2ltcGxlIDMtc2VnbWVudCBwYXRoXG4gICAgICBpZiAoTWF0aC5hYnMoaG9yaXpvbnRhbERpc3QpIDwgMzApIHtcbiAgICAgICAgY29uc3QgbWlkWSA9IChzdGFydFkgKyBlbmRZKSAvIDI7XG4gICAgICAgIHBhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IEggJHtlbmRYfSBWICR7bWlkWX0gViAke2VuZFl9YDtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgcGF0aCB3aXRoIGhvcml6b250YWwgc2VnbWVudCBmaXJzdCwgdGhlbiB2ZXJ0aWNhbCwgdGhlbiBob3Jpem9udGFsXG4gICAgICBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGBNICR7c3RhcnRYfSAke3N0YXJ0WX0gSCAke3N0YXJ0WCArIGhvcml6b250YWxEaXN0IC8gMlxuICAgICAgICAgIH0gViAke2VuZFl9IEggJHtlbmRYfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZvciB0b3AvYm90dG9tIHBvaW50cywgc3RhcnQgd2l0aCB2ZXJ0aWNhbCBsaW5lXG4gICAgZWxzZSBpZiAocG9pbnRUeXBlID09PSAndG9wJyB8fCBwb2ludFR5cGUgPT09ICdib3R0b20nKSB7XG4gICAgICAvLyBDYWxjdWxhdGUgdmVydGljYWwgZGlzdGFuY2VcbiAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdCA9IGVuZFkgLSBzdGFydFk7XG5cbiAgICAgIC8vIElmIHRoZSBlbmQgcG9pbnQgaXMgdmVyeSBjbG9zZSB2ZXJ0aWNhbGx5LCB1c2UgYSBzaW1wbGUgMy1zZWdtZW50IHBhdGhcbiAgICAgIGlmIChNYXRoLmFicyh2ZXJ0aWNhbERpc3QpIDwgMzApIHtcbiAgICAgICAgY29uc3QgbWlkWCA9IChzdGFydFggKyBlbmRYKSAvIDI7XG4gICAgICAgIHBhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IFYgJHtlbmRZfSBIICR7bWlkWH0gSCAke2VuZFh9YDtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgcGF0aCB3aXRoIHZlcnRpY2FsIHNlZ21lbnQgZmlyc3QsIHRoZW4gaG9yaXpvbnRhbCwgdGhlbiB2ZXJ0aWNhbFxuICAgICAgZWxzZSB7XG4gICAgICAgIHBhdGggPSBgTSAke3N0YXJ0WH0gJHtzdGFydFl9IFYgJHtzdGFydFkgKyB2ZXJ0aWNhbERpc3QgLyAyXG4gICAgICAgICAgfSBIICR7ZW5kWH0gViAke2VuZFl9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIHNlbGVjdEZvcm1Gb3JTdGFnZShmb3JtOiBGb3JtIHwgbnVsbCwgbm9kZTogTm9kZSkge1xuICAgIC8vIElmIGZvcm0gaXMgbnVsbCwgd2UncmUgY2xlYXJpbmcgdGhlIHNlbGVjdGlvblxuICAgIGlmIChub2RlKSB7XG4gICAgICBpZiAoIW5vZGUuc3RhZ2VEYXRhKSB7XG4gICAgICAgIG5vZGUuc3RhZ2VEYXRhID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgIG5vZGUuc3RhZ2VEYXRhLmZvcm1JZCA9IGZvcm0uQ29kZTtcbiAgICAgICAgbm9kZS5zdGFnZURhdGEuZm9ybU5hbWUgPSBmb3JtLk5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGVhciBmb3JtIHNlbGVjdGlvblxuICAgICAgICBkZWxldGUgbm9kZS5zdGFnZURhdGEuZm9ybUlkO1xuICAgICAgICBkZWxldGUgbm9kZS5zdGFnZURhdGEuZm9ybU5hbWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgYW4gZXZlbnQgdG8gdXBkYXRlIHRoZSBzdGFnZSBkYXRhXG4gICAgICB0aGlzLm9uU3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCh7XG4gICAgICAgIG5vZGVJZDogbm9kZS5pZCxcbiAgICAgICAgc3RhZ2VEYXRhOiBub2RlLnN0YWdlRGF0YSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZChldmVudDoge1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIHN0YWdlRGF0YTogUGFydGlhbDxXb3JrZmxvd1N0YWdlPjtcbiAgfSk6IHZvaWQge1xuICAgIC8vIEZpbmQgdGhlIG5vZGUgaW4gdGhlIHN3aW1sYW5lc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5zd2ltbGFuZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN3aW1sYW5lID0gdGhpcy5zdGF0ZS5zd2ltbGFuZXNbaV07XG4gICAgICBjb25zdCBub2RlSW5kZXggPSBzd2ltbGFuZS5ub2Rlcz8uZmluZEluZGV4KChuKSA9PiBuLmlkID09PSBldmVudC5ub2RlSWQpO1xuXG4gICAgICBpZiAobm9kZUluZGV4ICE9PSB1bmRlZmluZWQgJiYgbm9kZUluZGV4ID49IDApIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGFnZSBkYXRhXG4gICAgICAgIGlmIChzd2ltbGFuZS5ub2Rlcykge1xuICAgICAgICAgIHN3aW1sYW5lLm5vZGVzW25vZGVJbmRleF0uc3RhZ2VEYXRhID0ge1xuICAgICAgICAgICAgLi4uc3dpbWxhbmUubm9kZXNbbm9kZUluZGV4XS5zdGFnZURhdGEsXG4gICAgICAgICAgICAuLi5ldmVudC5zdGFnZURhdGEsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICdVcGRhdGVkIHN0YWdlIGRhdGEgaW4gc3dpbWxhbmU6JyxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICAnbm9kZTonLFxuICAgICAgICAgICAgbm9kZUluZGV4LFxuICAgICAgICAgICAgJ2RhdGE6JyxcbiAgICAgICAgICAgIHN3aW1sYW5lLm5vZGVzW25vZGVJbmRleF0uc3RhZ2VEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAvLyBBZnRlciBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZCwgcmVmcmVzaCB0aGUgc291cmNlIG5vZGUgdG8gdXBkYXRlIGl0cyBzdGF0ZVxuICAgIGNvbnN0IHNvdXJjZU5vZGVJbmZvID0gdGhpcy5zdGF0ZS5maW5kTm9kZUJ5SWQoY29ubmVjdGlvbi5zb3VyY2VOb2RlSWQpO1xuICAgIGlmIChzb3VyY2VOb2RlSW5mbyAmJiBzb3VyY2VOb2RlSW5mby5ub2RlLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgIC8vIFJlZnJlc2ggbm9kZSBzdGF0ZVxuICAgICAgdGhpcy51cGRhdGVOb2RlQ29ubmVjdGlvbnMoc291cmNlTm9kZUluZm8ubm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgbm9kZSdzIGNvbm5lY3Rpb24gc3RhdHVzXG4gIHVwZGF0ZU5vZGVDb25uZWN0aW9ucyhub2RlOiBXRk5vZGUpOiB2b2lkIHtcbiAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIG91dGdvaW5nIGNvbm5lY3Rpb25zIHRoYXQgY29ubmVjdCB0byBzdGFnZXNcbiAgICBjb25zdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5maWx0ZXIoXG4gICAgICAoY29ubikgPT4gY29ubi5zb3VyY2VOb2RlSWQgPT09IG5vZGUuaWRcbiAgICApO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmdldCBub2RlcyBhcmUgc3RhZ2VzXG4gICAgY29uc3QgY29ubmVjdGVkU3RhZ2VOb2RlcyA9IG91dGdvaW5nQ29ubmVjdGlvbnNcbiAgICAgIC5tYXAoKGNvbm4pID0+IHRoaXMuc3RhdGUuZmluZE5vZGVCeUlkKGNvbm4udGFyZ2V0Tm9kZUlkKSlcbiAgICAgIC5maWx0ZXIoKG5vZGVJbmZvKSA9PiBub2RlSW5mbyAmJiBub2RlSW5mby5ub2RlLnR5cGUgPT09ICdzdGFnZScpO1xuXG4gICAgbm9kZS5oYXNNdWx0aXBsZUNvbm5lY3RlZFN0YWdlcyA9IGNvbm5lY3RlZFN0YWdlTm9kZXMubGVuZ3RoID4gMTtcbiAgICBub2RlLmhhc1BhcmFsbGVsU3RhZ2VzID0gY29ubmVjdGVkU3RhZ2VOb2Rlcy5ldmVyeShcbiAgICAgIChuZCkgPT4gbmQ/Lm5vZGUuc3RhZ2VEYXRhPy5Jc1BhcmFsbGVsXG4gICAgKTtcbiAgfVxuXG4gIG9uRWRpdFN3aW1sYW5lKFxuICAgIGV2ZW50OiBNb3VzZUV2ZW50LFxuICAgIHN3aW1sYW5lOiBTd2ltbGFuZUl0ZW0sXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBQcmV2ZW50IHRoZSBjYW52YXMgY2xpY2sgZXZlbnQgZnJvbSBmaXJpbmdcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnNvbGUubG9nKCdFZGl0IHN3aW1sYW5lIGJ1dHRvbiBjbGlja2VkIGZvciBzd2ltbGFuZTonLCBzd2ltbGFuZUluZGV4KTtcblxuICAgIC8vIEVtaXQgYSBzcGVjaWFsIGV2ZW50IGZvciBlZGl0aW5nIGEgc3dpbWxhbmVcbiAgICB0aGlzLmNsaWNrZWRQb3NpdGlvbi5lbWl0KHtcbiAgICAgIHg6IC0xLCAvLyBTcGVjaWFsIHZhbHVlIHRvIGluZGljYXRlIGVkaXQgbW9kZVxuICAgICAgeTogc3dpbWxhbmVJbmRleCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNob3dTdGFydE5vZGVGb3JtUG9wdXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgLy8gICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gIC8vICAgLy8gSW1wbGVtZW50YXRpb24gd2lsbCBiZSBzaW1pbGFyIHRvIHRoZSBzdGFnZSBmb3JtIHBvcHVwXG4gIC8vICAgLy8gV2UnbGwgbmVlZCB0byBhZGQgVUkgZWxlbWVudHMgZm9yIHRoaXNcbiAgLy8gICBjb25zb2xlLmxvZygnU3RhcnQgbm9kZSBmb3JtIHBvcHVwIHJlcXVlc3RlZCcpO1xuXG4gIC8vICAgLy8gRm9yIG5vdywgdGhpcyBpcyBhIHBsYWNlaG9sZGVyXG4gIC8vICAgLy8gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBsb2FkIGZvcm1zIGFuZCBhZGQgdGhlbSB0byB0aGUgd29ya2Zsb3dcbiAgLy8gfVxuXG4gIHRvZ2dsZVN0YXJ0Tm9kZUZvcm1Qb3B1cChcbiAgICBldmVudDogTW91c2VFdmVudCxcbiAgICBub2RlWDogbnVtYmVyLFxuICAgIG5vZGVZOiBudW1iZXIsXG4gICAgc3dpbWxhbmVJbmRleDogbnVtYmVyLFxuICAgIG5vZGU/OiBOb2RlXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBTZXQgcG9wdXAgcG9zaXRpb25cbiAgICBjb25zdCBzd2ltbGFuZU9mZnNldCA9IHN3aW1sYW5lSW5kZXggKiAyNjM7XG4gICAgdGhpcy5zdGFydE5vZGVGb3JtUG9wdXBYID0gbm9kZVggLSAoIW5vZGUgPyAzMCA6IDApOyAvLyBQb3NpdGlvbiBuZWFyIHRoZSBzdGFydCBub2RlXG4gICAgdGhpcy5zdGFydE5vZGVGb3JtUG9wdXBZID0gbm9kZVkgKyBzd2ltbGFuZU9mZnNldDtcblxuICAgIC8vIElmIHdlJ3JlIG9wZW5pbmcgdGhlIHBvcHVwLCBsb2FkIGZvcm1zXG4gICAgaWYgKCF0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXApIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nU3RhcnROb2RlRm9ybXMgPSB0cnVlO1xuICAgICAgdGhpcy5kYXRhU2VydmljZVxuICAgICAgICAuZ2V0Rm9ybXMoKVxuICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXJ0Tm9kZUZvcm1zTGlzdCA9IHJlc3BvbnNlLlJlc3VsdDtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGZvcm1zOicsIGVycm9yKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChub2RlKSB7XG4gICAgICB0aGlzLmFjdGl2ZU5vZGVGb3JGb3JtU2VsZWN0aW9uID0gbm9kZTtcbiAgICAgIGNvbnNvbGUubG9nKCdBY3RpdmUgbm9kZSBmb3IgZm9ybSBzZWxlY3Rpb246Jywgbm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1N0YXJ0Tm9kZUZvcm1Qb3B1cCA9ICF0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXA7XG4gIH1cblxuICBzZWxlY3RTdGFydE5vZGVGb3JtKGZvcm06IEZvcm0gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0Rm9ybUZvclN0YWdlKGZvcm0sIHRoaXMuYWN0aXZlTm9kZUZvckZvcm1TZWxlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZm9ybSkge1xuICAgICAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93Rm9ybShmb3JtLkNvZGUsIGZvcm0uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnNldFdvcmtmbG93Rm9ybShudWxsLCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbG9zZSB0aGUgcG9wdXBcbiAgICB0aGlzLnNob3dTdGFydE5vZGVGb3JtUG9wdXAgPSBmYWxzZTtcbiAgfVxuXG4gIHNob3dTdWJmbG93U2VsZWN0aW9uUG9wdXAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHN3aW1sYW5lSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd1BvcHVwWCA9IHg7XG4gICAgdGhpcy5zdWJmbG93UG9wdXBZID0geTtcbiAgICB0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24gPSB7IHN3aW1sYW5lSW5kZXgsIHgsIHkgfTtcblxuICAgIC8vIFN0b3JlIGNvbm5lY3Rpb24gZGF0YSBpZiB3ZSdyZSBjcmVhdGluZyBmcm9tIGEgY29ubmVjdGlvblxuICAgIGlmICh0aGlzLnN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICAgIC8vIFN0b3JlIHRoZSBzb3VyY2UgY29ubmVjdGlvbiBkYXRhXG4gICAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQgPVxuICAgICAgICB0aGlzLnN0YXRlLmRyYWdnaW5nQ29ubmVjdGlvbkRhdGEuc291cmNlUG9pbnQgPz8gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ID1cbiAgICAgICAgdGhpcy5zdGF0ZS5kcmFnZ2luZ0Nvbm5lY3Rpb25EYXRhLnNvdXJjZVN3aW1sYW5lSW5kZXggPz8gbnVsbDtcbiAgICAgIGNvbnNvbGUubG9nKCdTdG9yZWQgY29ubmVjdGlvbiBkYXRhIGZvciBzdWJmbG93OicsIHtcbiAgICAgICAgc291cmNlUG9pbnQ6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCxcbiAgICAgICAgc291cmNlU3dpbWxhbmVJbmRleDogdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVN3aW1sYW5lSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHdvcmtmbG93c1xuICAgIHRoaXMuaXNMb2FkaW5nV29ya2Zsb3dzID0gdHJ1ZTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlXG4gICAgICAuZ2V0V29ya2Zsb3dzKClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLndvcmtmbG93c0xpc3QgPSByZXNwb25zZS5SZXN1bHQ7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nV29ya2Zsb3dzID0gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHdvcmtmbG93czonLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nV29ya2Zsb3dzID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIHRoaXMuc2hvd1N1YmZsb3dQb3B1cCA9IHRydWU7XG4gIH1cblxuICBzZWxlY3RTdWJmbG93V29ya2Zsb3cod29ya2Zsb3c6IFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGluZyB3b3JrZmxvdyBmb3Igc3ViZmxvdzonLCB3b3JrZmxvdy5OYW1lKTtcbiAgICBjb25zb2xlLmxvZygnUGVuZGluZyBjb25uZWN0aW9uIGRhdGE6Jywge1xuICAgICAgc291cmNlUG9pbnQ6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VQb2ludCxcbiAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4LFxuICAgICAgcG9zaXRpb246IHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbixcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnBlbmRpbmdTdWJmbG93UG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHsgc3dpbWxhbmVJbmRleCwgeCwgeSB9ID0gdGhpcy5wZW5kaW5nU3ViZmxvd1Bvc2l0aW9uO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN1YmZsb3cgbm9kZSB3aXRoIHRoZSBzZWxlY3RlZCB3b3JrZmxvdyBkYXRhXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5zdGF0ZS5hZGROb2RlKFxuICAgICAgICBzd2ltbGFuZUluZGV4LFxuICAgICAgICAnc3ViZmxvdycsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHVuZGVmaW5lZCwgLy8gTm8gc3RhZ2UgZGF0YVxuICAgICAgICB7IGlkOiB3b3JrZmxvdy5Db2RlLCBuYW1lOiB3b3JrZmxvdy5OYW1lIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdDcmVhdGVkIHN1YmZsb3cgbm9kZTonLCBub2RlKTtcblxuICAgICAgLy8gSWYgdGhpcyB3YXMgY3JlYXRlZCBmcm9tIGEgY29ubmVjdGlvbiwgY3JlYXRlIHRoZSBjb25uZWN0aW9uXG4gICAgICBpZiAobm9kZSAmJiB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0aW5nIGNvbm5lY3Rpb24gdG8gbmV3IHN1YmZsb3cgbm9kZScpO1xuXG4gICAgICAgIC8vIEZpbmQgYSBzdWl0YWJsZSBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSBuZXcgbm9kZVxuICAgICAgICBpZiAobm9kZS5jb25uZWN0aW9uUG9pbnRzICYmIG5vZGUuY29ubmVjdGlvblBvaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlUG9pbnQgPSB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlUG9pbnQ7XG5cbiAgICAgICAgICAvLyBGaW5kIG9wcG9zaW5nIHR5cGUgY29ubmVjdGlvbiBwb2ludFxuICAgICAgICAgIGNvbnN0IG9wcG9zaW5nVHlwZSA9IHtcbiAgICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICAgICAgdG9wOiAnYm90dG9tJyxcbiAgICAgICAgICAgIGJvdHRvbTogJ3RvcCcsXG4gICAgICAgICAgfVtzb3VyY2VQb2ludC50eXBlXSBhcyAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JztcblxuICAgICAgICAgIGNvbnN0IHRhcmdldFBvaW50ID0gbm9kZS5jb25uZWN0aW9uUG9pbnRzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gcC50eXBlID09PSBvcHBvc2luZ1R5cGVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRhcmdldFBvaW50KSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvblxuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgaWQ6IGBjb25uLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgICAgICAgICAgICBzb3VyY2VOb2RlSWQ6IHNvdXJjZVBvaW50Lm5vZGVJZCxcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlkOiBub2RlLmlkLFxuICAgICAgICAgICAgICBzb3VyY2VQb2ludElkOiBzb3VyY2VQb2ludC5pZCxcbiAgICAgICAgICAgICAgdGFyZ2V0UG9pbnRJZDogdGFyZ2V0UG9pbnQuaWQsXG4gICAgICAgICAgICAgIHNvdXJjZVN3aW1sYW5lSW5kZXg6IHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25Tb3VyY2VTd2ltbGFuZUluZGV4ISxcbiAgICAgICAgICAgICAgdGFyZ2V0U3dpbWxhbmVJbmRleDogc3dpbWxhbmVJbmRleCxcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICBhY3Rpb246IG51bGwsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBBZGQgY29ubmVjdGlvbiBkaXJlY3RseSB0byB0aGUgc3RhdGUncyBjb25uZWN0aW9ucyBhcnJheVxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jb25uZWN0aW9ucy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FkZGVkIGNvbm5lY3Rpb24gdG8gc3RhdGU6JywgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29ubmVjdGlvbnMgYWZ0ZXIgYWRkaW5nOicsIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3Rpb25DcmVhdGVkKGNvbm5lY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlLmVuZENvbm5lY3Rpb25EcmFnKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHNlbGVjdGlvbiB0b29sIGluIHBhcmVudCBjb21wb25lbnRcbiAgICAgIHRoaXMuc3ViZmxvd1NlbGVjdGVkLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIHRoaXMuc2hvd1N1YmZsb3dQb3B1cCA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1N1YmZsb3dQb3NpdGlvbiA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvblNvdXJjZVBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdDb25uZWN0aW9uU291cmNlU3dpbWxhbmVJbmRleCA9IG51bGw7XG4gIH1cblxuICBzaG93RGVjaXNpb25Db25kaXRpb25zUG9wdXAoXG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgbm9kZTogV0ZOb2RlLFxuICAgIHN3aW1sYW5lSW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gR2V0IHRoZSBwb3NpdGlvbiBmb3IgdGhlIHBvcHVwXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldE1vdXNlUG9zaXRpb24oZXZlbnQpO1xuICAgIGNvbnN0IGdsb2JhbFggPSBwb3NpdGlvbi54O1xuICAgIGNvbnN0IGdsb2JhbFkgPSBwb3NpdGlvbi55O1xuXG4gICAgLy8gRmluZCBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGlzIGRlY2lzaW9uIG5vZGVcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IHRoaXMuc3RhdGUuY29ubmVjdGlvbnMuZmlsdGVyKFxuICAgICAgKGNvbm4pID0+IGNvbm4uc291cmNlTm9kZUlkID09PSBub2RlLmlkXG4gICAgKTtcblxuICAgIGlmIChjb25uZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIE5vIGNvbm5lY3Rpb25zIHRvIHNob3dcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaG93IHRoZSBkZWNpc2lvbiBjb25kaXRpb25zIHBvcHVwXG4gICAgdGhpcy5hY3RpdmVEZWNpc2lvbk5vZGVJZCA9IG5vZGUuaWQ7XG4gICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWCA9IGdsb2JhbFg7XG4gICAgdGhpcy5kZWNpc2lvbkNvbmRpdGlvblBvcHVwWSA9IGdsb2JhbFk7XG5cbiAgICAvLyBTZXQgdGhlIGNvcnJlY3QgcG9wdXAgdmlzaWJpbGl0eSBmbGFnIC0gdGhpcyBpcyBsaWtlbHkgdGhlIGlzc3VlXG4gICAgdGhpcy5zaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2cgPSB0cnVlO1xuXG4gICAgY29uc29sZS5sb2coJ1Nob3dpbmcgZGVjaXNpb24gcG9wdXA6Jywge1xuICAgICAgeDogZ2xvYmFsWCxcbiAgICAgIHk6IGdsb2JhbFksXG4gICAgICBub2RlSWQ6IG5vZGUuaWQsXG4gICAgICBpc1Zpc2libGU6IHRoaXMuc2hvd0RlY2lzaW9uQ29uZGl0aW9uRGlhbG9nLFxuICAgIH0pO1xuICB9XG5cbiAgZW5zdXJlU3dpbWxhbmVJblZpZXcoc3dpbWxhbmVJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gRW5zdXJlIHdlIGhhdmUgZW5vdWdoIHN3aW1sYW5lcyB2aXNpYmxlXG4gICAgY29uc3QgcmVxdWlyZWRIZWlnaHQgPSAoc3dpbWxhbmVJbmRleCArIDEpICogdGhpcy5zd2ltbGFuZUhlaWdodDtcbiAgICBpZiAodGhpcy5jYW52YXNIZWlnaHQgPCByZXF1aXJlZEhlaWdodCkge1xuICAgICAgdGhpcy5jYW52YXNIZWlnaHQgPSByZXF1aXJlZEhlaWdodDtcbiAgICB9XG4gIH1cblxuICBnZXRMYWJlbFBvc2l0aW9uKGNvbm5lY3Rpb246IENvbm5lY3Rpb24pOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXRoRGF0YSA9IHRoaXMuc3RhdGUuZ2V0Q29ubmVjdGlvbkRhdGEoY29ubmVjdGlvbik7XG4gICAgICBpZiAoIXBhdGhEYXRhKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHBhdGggZGF0YSBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0WCwgc3RhcnRZLCBlbmRYLCBlbmRZIH0gPSBwYXRoRGF0YTtcblxuICAgICAgY29uc3Qgc291cmNlTm9kZUluZm8gPSB0aGlzLnN0YXRlLmZpbmROb2RlQnlJZChjb25uZWN0aW9uLnNvdXJjZU5vZGVJZCk7XG4gICAgICBpZiAoIXNvdXJjZU5vZGVJbmZvKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvdXJjZSBub2RlIG5vdCBmb3VuZCBmb3IgY29ubmVjdGlvbjonLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VOb2RlID0gc291cmNlTm9kZUluZm8ubm9kZTtcbiAgICAgIGNvbnN0IHNvdXJjZVBvaW50ID0gc291cmNlTm9kZS5jb25uZWN0aW9uUG9pbnRzPy5maW5kKFxuICAgICAgICAocCkgPT4gcC5pZCA9PT0gY29ubmVjdGlvbi5zb3VyY2VQb2ludElkXG4gICAgICApO1xuXG4gICAgICBpZiAoIXNvdXJjZVBvaW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvdXJjZSBwb2ludCBub3QgZm91bmQgZm9yIGNvbm5lY3Rpb246JywgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIG1pZHBvaW50IGJhc2VkIG9uIHRoZSBjb25uZWN0aW9uIHBvaW50IHR5cGVcbiAgICAgIGlmIChzb3VyY2VQb2ludC50eXBlID09PSAnbGVmdCcgfHwgc291cmNlUG9pbnQudHlwZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdCA9IGVuZFggLSBzdGFydFg7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGhvcml6b250YWxEaXN0KSA8IDMwKSB7XG4gICAgICAgICAgLy8gRm9yIHNob3J0IGhvcml6b250YWwgY29ubmVjdGlvbnNcbiAgICAgICAgICBjb25zdCBtaWRZID0gKHN0YXJ0WSArIGVuZFkpIC8gMjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogc3RhcnRYICsgKGVuZFggLSBzdGFydFgpIC8gMixcbiAgICAgICAgICAgIHk6IG1pZFksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgcmVndWxhciBjb25uZWN0aW9ucyBzdGFydGluZyBob3Jpem9udGFsbHlcbiAgICAgICAgICBjb25zdCBtaWRYID0gc3RhcnRYICsgaG9yaXpvbnRhbERpc3QgLyAyO1xuICAgICAgICAgIGNvbnN0IG1pZFkgPSBlbmRZO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBtaWRYLFxuICAgICAgICAgICAgeTogKHN0YXJ0WSArIGVuZFkpIC8gMixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAndG9wJyBvciAnYm90dG9tJ1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3QgPSBlbmRZIC0gc3RhcnRZO1xuXG4gICAgICAgIGlmIChNYXRoLmFicyh2ZXJ0aWNhbERpc3QpIDwgMzApIHtcbiAgICAgICAgICAvLyBGb3Igc2hvcnQgdmVydGljYWwgY29ubmVjdGlvbnNcbiAgICAgICAgICBjb25zdCBtaWRYID0gKHN0YXJ0WCArIGVuZFgpIC8gMjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogbWlkWCAtIDc1LCAvLyBNaW51cyA3NSAtIHdoaWNoIGlzIGhhbGYgdGhlIHdpZHRoIG9mIHRoZSBsYWJlbCBpdHNlbGZcbiAgICAgICAgICAgIHk6IHN0YXJ0WSArIChlbmRZIC0gc3RhcnRZKSAvIDIsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgcmVndWxhciBjb25uZWN0aW9ucyBzdGFydGluZyB2ZXJ0aWNhbGx5XG4gICAgICAgICAgY29uc3QgbWlkWCA9IGVuZFg7XG4gICAgICAgICAgY29uc3QgbWlkWSA9IHN0YXJ0WSArIHZlcnRpY2FsRGlzdCAvIDI7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6ICgoc3RhcnRYICsgZW5kWCkgLyAyKSAtIDc1LCAvLyBNaW51cyA3NSAtIHdoaWNoIGlzIGhhbGYgdGhlIHdpZHRoIG9mIHRoZSBsYWJlbCBpdHNlbGZcbiAgICAgICAgICAgIHk6IG1pZFksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnRXJyb3IgY2FsY3VsYXRpbmcgbGFiZWwgcG9zaXRpb24gZm9yIGNvbm5lY3Rpb246JyxcbiAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgZXJyb3JcbiAgICAgICk7XG4gICAgICByZXR1cm4geyB4OiAwLCB5OiAwIH07XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNvbm5lY3Rpb25MYWJlbChjb25uZWN0aW9uOiBDb25uZWN0aW9uLCBsYWJlbDogc3RyaW5nKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBjb25uZWN0aW9uIGxhYmVsIGluIHRoZSBzdGF0ZVxuICAgIHRoaXMuc3RhdGUuY29ubmVjdGlvbnMgPSB0aGlzLnN0YXRlLmNvbm5lY3Rpb25zLm1hcCgoY29ubikgPT4ge1xuICAgICAgaWYgKGNvbm4uaWQgPT09IGNvbm5lY3Rpb24uaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb25uLFxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25uO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FudmFzLWNvbnRhaW5lclwiPlxuICA8c3ZnICNjYW52YXMgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIiBbYXR0ci5oZWlnaHRdPVwiY2FudmFzSGVpZ2h0XCIgY2xhc3M9XCJkZXNpZ25lci1jYW52YXNcIlxuICAgIChjbGljayk9XCJvbkNhbnZhc0NsaWNrKCRldmVudClcIj5cbiAgICA8ZGVmcz5cbiAgICAgIDwhLS0gR3JpZCBwYXR0ZXJuIGRlZmluaXRpb24gLS0+XG5cbiAgICAgIDxwYXR0ZXJuIGlkPVwiZ3JpZFwiIFthdHRyLndpZHRoXT1cImdyaWRTaXplXCIgW2F0dHIuaGVpZ2h0XT1cImdyaWRTaXplXCIgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cbiAgICAgICAgPHBhdGggZD1cIk0gMjAgMCBMIDAgMCAwIDIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjZTJlOGYwXCIgc3Ryb2tlLXdpZHRoPVwiMC41XCIgLz5cbiAgICAgIDwvcGF0dGVybj5cblxuICAgICAgPCEtLSBBcnJvdyBoZWFkIG1hcmtlciBkZWZpbml0aW9uIC0tPlxuICAgICAgPG1hcmtlciBpZD1cImFycm93aGVhZFwiIG1hcmtlcldpZHRoPVwiMTBcIiBtYXJrZXJIZWlnaHQ9XCI3XCIgcmVmWD1cIjlcIiByZWZZPVwiMy41XCIgb3JpZW50PVwiYXV0b1wiPlxuICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIwIDAsIDEwIDMuNSwgMCA3XCIgZmlsbD1cIiNEMzZDRkZcIiAvPlxuICAgICAgPC9tYXJrZXI+XG5cbiAgICAgIDwhLS0gQ29ubmVjdGlvbiBwb2ludCBzdHlsZXMgLS0+XG4gICAgICA8Y2lyY2xlIGlkPVwiY29ubmVjdGlvbi1wb2ludC10ZW1wbGF0ZVwiIHI9XCI1XCIgZmlsbD1cIiNEMzZDRkZcIiBzdHJva2U9XCIjRkZGRkZGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIC8+XG5cbiAgICAgIDwhLS0gRGFzaGVkIGxpbmUgc3R5bGUgZm9yIGNvbm5lY3Rpb24gcHJldmlldyAtLT5cbiAgICAgIDxwYXR0ZXJuIGlkPVwiZGFzaGVkLWxpbmVcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxuICAgICAgICA8bGluZSB4MT1cIjBcIiB5MT1cIjVcIiB4Mj1cIjEwXCIgeTI9XCI1XCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtZGFzaGFycmF5PVwiNSw1XCIgLz5cbiAgICAgIDwvcGF0dGVybj5cblxuICAgICAgQGZvciAoc3dpbWxhbmUgb2Ygc3RhdGUuc3dpbWxhbmVzOyB0cmFjayBzd2ltbGFuZS5vcmRlcikge1xuICAgICAgPGNsaXBQYXRoIFthdHRyLmlkXT1cIidzd2ltbGFuZS1jbGlwLScgKyBzd2ltbGFuZS5vcmRlclwiPlxuICAgICAgICA8cmVjdCB4PVwiMFwiIHk9XCIwXCIgW2F0dHIud2lkdGhdPVwiY2FudmFzV2lkdGhcIiBoZWlnaHQ9XCIyNjNcIiAvPlxuICAgICAgPC9jbGlwUGF0aD5cbiAgICAgIH1cbiAgICA8L2RlZnM+XG5cbiAgICA8IS0tIEJhY2tncm91bmQgZ3JpZCAtLT5cbiAgICA8cmVjdCB3aWR0aD1cIjEwMCVcIiBoZWlnaHQ9XCIxMDAlXCIgZmlsbD1cInVybCgjZ3JpZClcIiAvPlxuXG4gICAgPCEtLSBEaXNwbGF5IGEgbWVzc2FnZSB3aGVuIG5vIHN3aW1sYW5lcyBleGlzdCAtLT5cbiAgICBAaWYgKHN0YXRlLnN3aW1sYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICA8dGV4dCB4PVwiNTAlXCIgeT1cIjUwJVwiIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiIGZvbnQtc2l6ZT1cIjE2XCIgZmlsbD1cIiM5NGEzYjhcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiPlxuICAgICAgU2VsZWN0IHRoZSBTd2ltbGFuZSB0b29sIGFuZCBjbGljayBvbiB0aGUgY2FudmFzIHRvIGFkZCBhIHN3aW1sYW5lXG4gICAgPC90ZXh0PlxuICAgIH1cblxuICAgIDwhLS0gVGhpcyBpcyB3aGVyZSB3b3JrZmxvdyBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIGxhdGVyIC0tPlxuICAgIEBmb3IgKHN3aW1sYW5lIG9mIHN0YXRlLnN3aW1sYW5lczsgdHJhY2sgc3dpbWxhbmUub3JkZXIpIHtcbiAgICA8IS0tIDxnXG4gICAgICBbYXR0ci50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZSgwLCcgKyBzd2ltbGFuZS5vcmRlciAqIDI2MyArICcpJ1wiXG4gICAgICBbYXR0ci5jbGlwLXBhdGhdPVwiJ3VybCgjc3dpbWxhbmUtY2xpcC0nICsgc3dpbWxhbmUub3JkZXIgKyAnKSdcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCIyNjNcIlxuICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiXG4gICAgICAgIHN0cm9rZT1cIiNlMmU4ZjBcIlxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgID48L3JlY3Q+XG5cbiAgICAgIDxyZWN0XG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiXG4gICAgICAgIGhlaWdodD1cIjQwXCJcbiAgICAgICAgZmlsbD1cIiNmOGZhZmNcIlxuICAgICAgICBzdHJva2U9XCIjZTJlOGYwXCJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICA+PC9yZWN0PlxuXG4gICAgICA8dGV4dFxuICAgICAgICB4PVwiMjBcIlxuICAgICAgICB5PVwiMjVcIlxuICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICBmb250LXNpemU9XCIxNFwiXG4gICAgICAgIGZpbGw9XCIjMzMzMzMzXCJcbiAgICAgICAgZm9udC13ZWlnaHQ9XCJib2xkXCJcbiAgICAgID5cbiAgICAgICAge3sgc3dpbWxhbmUubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cblxuICAgICAgPGdcbiAgICAgICAgY2xhc3M9XCJlZGl0LXN3aW1sYW5lLWJ1dHRvblwiXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDEwMCwgMjApJ1wiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBvbkVkaXRTd2ltbGFuZSgkZXZlbnQsIHN3aW1sYW5lLCBzd2ltbGFuZS5vcmRlcik7XG4gICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxyZWN0XG4gICAgICAgICAgeD1cIi01XCJcbiAgICAgICAgICB5PVwiLTE1XCJcbiAgICAgICAgICB3aWR0aD1cIjQwXCJcbiAgICAgICAgICBoZWlnaHQ9XCIyMFwiXG4gICAgICAgICAgZmlsbD1cIiNmM2U4ZmZcIlxuICAgICAgICAgIHJ4PVwiM1wiXG4gICAgICAgICAgcnk9XCIzXCJcbiAgICAgICAgICBzdHJva2U9XCIjZDhiNGZlXCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgPHRleHRcbiAgICAgICAgICB4PVwiMTVcIlxuICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiIzdlMjJjZVwiXG4gICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIlxuICAgICAgICA+XG4gICAgICAgICAgRWRpdFxuICAgICAgICA8L3RleHQ+XG4gICAgICA8L2c+XG5cbiAgICAgIDxnIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDIwMCwgMjApJ1wiPlxuICAgICAgICBAZm9yICh0YWcgb2Ygc3dpbWxhbmUudGFncy5zbGljZSgwLCAzKTsgdHJhY2sgdGFnLk5hbWU7IGxldCBpID0gJGluZGV4KVxuICAgICAgICB7XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCJpICogMTAwXCJcbiAgICAgICAgICB5PVwiNVwiXG4gICAgICAgICAgZm9udC1mYW1pbHk9XCJzYW5zLXNlcmlmXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMlwiXG4gICAgICAgICAgZmlsbD1cIiM2NjY2NjZcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdGFnLk5hbWUgfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICB9IEBpZiAoc3dpbWxhbmUudGFncy5sZW5ndGggPiAzKSB7XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgW2F0dHIueF09XCIzICogMTAwICsgMTBcIlxuICAgICAgICAgIHk9XCI1XCJcbiAgICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjEyXCJcbiAgICAgICAgICBmaWxsPVwiIzY2NjY2NlwiXG4gICAgICAgID5cbiAgICAgICAgICAre3sgc3dpbWxhbmUudGFncy5sZW5ndGggLSAzIH19IG1vcmVcbiAgICAgICAgPC90ZXh0PlxuICAgICAgICB9XG4gICAgICA8L2c+XG4gICAgPC9nPiAtLT5cblxuICAgIDxnIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKDAsJyArIHN3aW1sYW5lLm9yZGVyICogMjYzICsgJyknXCI+XG4gICAgICA8IS0tIFN3aW1sYW5lIGNvbnRhaW5lciAtIHJlbW92ZSBzdHJva2UgdG8gbWFrZSBpdCBwdXJlbHkgYmFja2dyb3VuZCAtLT5cbiAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIjBcIiBbYXR0ci53aWR0aF09XCJjYW52YXNXaWR0aFwiIFthdHRyLmhlaWdodF09XCIyNjNcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInN3aW1sYW5lLm9yZGVyICUgMiA9PT0gMCA/ICcjRkNGM0ZGJyA6ICcjRUNGRkY1J1wiIHN0cm9rZT1cIm5vbmVcIj48L3JlY3Q+XG5cbiAgICAgIDwhLS0gVmVydGljYWwgc3dpbWxhbmUgbGFiZWwgb24gdGhlIGxlZnQgLS0+XG4gICAgICA8ZyBjbGFzcz1cInN3aW1sYW5lLWxhYmVsXCI+XG4gICAgICAgIDwhLS0gUHVycGxlIGJhY2tncm91bmQgZm9yIHRoZSBsYWJlbCAtLT5cbiAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjQzXCIgaGVpZ2h0PVwiMjE1XCIgcng9XCIxMC41XCIgZmlsbD1cIndoaXRlXCIgc3Ryb2tlPVwiI0QzNkNGRlwiPjwvcmVjdD5cblxuICAgICAgICA8IS0tIFBsdXMgYnV0dG9uIGF0IHRoZSB0b3AgLS0+XG4gICAgICAgIDxnIChjbGljayk9XCJcbiAgICAgICAgICAgIG9uRWRpdFN3aW1sYW5lKCRldmVudCwgc3dpbWxhbmUsIHN3aW1sYW5lLm9yZGVyKTtcbiAgICAgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIFwiPlxuICAgICAgICAgIDxyZWN0IHg9XCIxMi41XCIgeT1cIjEwXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIj48L3JlY3Q+XG5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIyLjUyIDEyLjE3NFYxNy4wOEgyNy40N1YxOC41MUgyMi41MlYyMy4zOTRIMjEuMlYxOC41MUgxNi4yNVYxNy4wOEgyMS4yVjEyLjE3NEgyMi41MlpcIlxuICAgICAgICAgICAgZmlsbD1cIiMwMDAwRkZcIiBjbGFzcz1cInBsdXMtaWNvblwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCI+PC9wYXRoPlxuICAgICAgICA8L2c+XG5cbiAgICAgICAgPCEtLSBTd2ltbGFuZSBsYWJlbCAtLT5cbiAgICAgICAgPHRleHQgeD1cIjIyXCIgeT1cIjEwNlwiIGZvbnQtZmFtaWx5PVwic2Fucy1zZXJpZlwiIGZvbnQtc2l6ZT1cIjE0XCIgZmlsbD1cIiMzMzMzMzNcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCwgMjIsIDEwMClcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgIHN3aW1sYW5lLmxhYmVsLmxlbmd0aCA+IDEyXG4gICAgICAgICAgPyBzd2ltbGFuZS5sYWJlbC5zdWJzdHJpbmcoMCwgMTApICsgXCIuLi5cIlxuICAgICAgICAgIDogc3dpbWxhbmUubGFiZWxcbiAgICAgICAgICB9fVxuICAgICAgICA8L3RleHQ+XG5cbiAgICAgICAgPCEtLSBUYWcgY291bnQgaW5kaWNhdG9yIGF0IHRoZSBib3R0b20gLS0+XG4gICAgICAgIDxyZWN0IHg9XCIxMS41XCIgeT1cIjE4N1wiIHdpZHRoPVwiMjFcIiBoZWlnaHQ9XCIxOVwiIHJ4PVwiOS41XCIgZmlsbD1cIiM5RTlFOUVcIj48L3JlY3Q+XG4gICAgICAgIDx0ZXh0IHg9XCIyNFwiIHk9XCIyMDZcIiBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxMlwiIGZpbGw9XCJibGFja1wiIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgICAgICB0cmFuc2Zvcm09XCJyb3RhdGUoLTkwLCAyMiwgMjAwKVwiPlxuICAgICAgICAgIHt7IHN3aW1sYW5lLnRhZ3MubGVuZ3RoIH19XG4gICAgICAgIDwvdGV4dD5cbiAgICAgIDwvZz5cbiAgICA8L2c+XG5cbiAgICB9XG5cbiAgICA8IS0tIE5vZGVzIC0tPlxuICAgIEBmb3IgKHN3aW1sYW5lIG9mIHN0YXRlLnN3aW1sYW5lczsgdHJhY2sgc3dpbWxhbmUub3JkZXIpIHtcbiAgICA8IS0tIFJlbmRlciBub2RlcyBpbiB0aGlzIHN3aW1sYW5lIC0tPlxuICAgIEBmb3IgKG5vZGUgb2Ygc3dpbWxhbmUubm9kZXM7IHRyYWNrIG5vZGUuaWQpIHtcbiAgICA8ZyBjbGFzcz1cIm5vZGUtZWxlbWVudFwiIFthdHRyLnRyYW5zZm9ybV09XCJcbiAgICAgICAgJ3RyYW5zbGF0ZSgnICsgbm9kZS54ICsgJywnICsgKG5vZGUueSAtIHN3aW1sYW5lLm9yZGVyICogMjYzKSArICcpJ1xuICAgICAgXCIgKG1vdXNlZW50ZXIpPVwic2hvd0Nvbm5lY3Rpb25Qb2ludHMobm9kZS5pZCwgc3dpbWxhbmUub3JkZXIpXCIgKG1vdXNlbGVhdmUpPVwiaGlkZUNvbm5lY3Rpb25Qb2ludHMobm9kZS5pZClcIj5cbiAgICAgIDwhLS0gU3RhcnQgbm9kZSBpbmRpY2F0b3IgKGNpcmNsZSBhbmQgYXJyb3cpIGZvciB0aGUgZmlyc3Qgbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS5pc1N0YXJ0Tm9kZSkge1xuICAgICAgPCEtLSBDaXJjbGUgLS0+XG4gICAgICA8Y2lyY2xlIGN4PVwiLTUwXCIgY3k9XCI1MFwiIHI9XCIzMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIj48L2NpcmNsZT5cbiAgICAgIDwhLS0gRm9ybSBpY29uIGZvciBzdGFydCBub2RlIC0tPlxuICAgICAgPHN2ZzpnIChjbGljayk9XCJcbiAgICAgICAgICB0b2dnbGVTdGFydE5vZGVGb3JtUG9wdXAoJGV2ZW50LCBub2RlLngsIG5vZGUueSwgc3dpbWxhbmUub3JkZXIpXG4gICAgICAgIFwiIGNsYXNzPVwic3RhZ2UtaWNvblwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNDUsIDQyKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyOyBwb2ludGVyLWV2ZW50czogYWxsXCI+XG4gICAgICAgIDwhLS0gVHJhbnNwYXJlbnQgcmVjdGFuZ2xlIHRvIGNhcHR1cmUgY2xpY2tzIC0tPlxuICAgICAgICA8c3ZnOnJlY3QgeD1cIi0yXCIgeT1cIi0yXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgZmlsbD1cInRyYW5zcGFyZW50XCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIiAvPlxuICAgICAgICA8c3ZnOnBhdGhcbiAgICAgICAgICBkPVwiTTE2LjUgMjAuNDc1VjE3LjQ3NUgxMy41VjE2LjQ3NUgxNi41VjEzLjQ3NUgxNy41VjE2LjQ3NUgyMC41VjE3LjQ3NUgxNy41VjIwLjQ3NUgxNi41Wk0zLjUgMTcuNVYxNi41SDQuNVYxNy41SDMuNVpNNi41IDE3LjVWMTYuNUgxMS41MTdDMTEuNTA1NyAxNi42NzY3IDExLjUwNDMgMTYuODQ1IDExLjUxMyAxNy4wMDVDMTEuNTIxIDE3LjE2NSAxMS41MzEgMTcuMzMgMTEuNTQzIDE3LjVINi41Wk0zLjUgMTMuNVYxMi41SDQuNVYxMy41SDMuNVpNNi41IDEzLjVWMTIuNUgxMy44MDRDMTMuNjEyNyAxMi42Mzg3IDEzLjQzMzMgMTIuNzkxMyAxMy4yNjYgMTIuOTU4QzEzLjA5OTMgMTMuMTI0NyAxMi45Mzc3IDEzLjMwNTMgMTIuNzgxIDEzLjVINi41Wk0zLjUgOS41VjguNUg0LjVWOS41SDMuNVpNNi41IDkuNVY4LjVIMTguNVY5LjVINi41Wk0zLjUgNS41VjQuNUg0LjVWNS41SDMuNVpNNi41IDUuNVY0LjVIMTguNVY1LjVINi41WlwiXG4gICAgICAgICAgW2F0dHIuZmlsbF09XCJzdGF0ZS53b3JrZmxvd0Zvcm1JZCA/ICcjRDM2Q0ZGJyA6ICdibGFjaydcIiB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCIgLz5cbiAgICAgIDwvc3ZnOmc+XG4gICAgICA8IS0tIEFycm93IGZyb20gY2lyY2xlIHRvIG5vZGUgLS0+XG4gICAgICA8cGF0aCBkPVwiTSAtMjAgNTAgTCAwIDUwXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIiBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCI+PC9wYXRoPlxuICAgICAgfVxuXG4gICAgICA8IS0tIEV4aXQgcG9pbnQgaW5kaWNhdG9yIChjaXJjbGUgYW5kIGFycm93KSAtLT5cbiAgICAgIEBpZiAobm9kZS5zdGFnZURhdGE/LklzRXhpdFBvaW50KSB7XG4gICAgICA8IS0tIEFycm93IGZyb20gbm9kZSB0byBjaXJjbGUgLS0+XG4gICAgICA8cGF0aCBbYXR0ci5kXT1cIidNICcgKyBub2RlLndpZHRoICsgJyA1MCBMICcgKyAobm9kZS53aWR0aCArIDIwKSArICcgNTAnXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCI+PC9wYXRoPlxuICAgICAgPCEtLSBDaXJjbGUgLS0+XG4gICAgICA8Y2lyY2xlIFthdHRyLmN4XT1cIm5vZGUud2lkdGggKyA1MFwiIGN5PVwiNTBcIiByPVwiMzBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIyXCI+PC9jaXJjbGU+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gU3RhZ2Ugbm9kZSAtLT5cbiAgICAgIEBpZiAobm9kZS50eXBlID09PSAnc3RhZ2UnKSB7XG4gICAgICA8IS0tIDxyZWN0XG4gICAgICAgICAgICAgICAgICB4PVwiMFwiXG4gICAgICAgICAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJub2RlLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJub2RlLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDM2Q0ZGXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgICAgICAgID48L3JlY3Q+IC0tPlxuICAgICAgPHN2ZzpnIGxpYi1zdGFnZS1ub2RlIFtub2RlXT1cIm5vZGVcIiBbaXNTdGFydE5vZGVdPVwibm9kZS5pc1N0YXJ0Tm9kZVwiXG4gICAgICAgIChzdGFnZVByb3BlcnRpZXNVcGRhdGVkKT1cIm9uU3RhZ2VQcm9wZXJ0aWVzVXBkYXRlZCgkZXZlbnQpXCIgKHNob3dTaGllbGREaWFsb2cpPVwib25TaG93U2hpZWxkRGlhbG9nKCRldmVudClcIlxuICAgICAgICAoc2hvd0VzY2FsYXRpb25EaWFsb2cpPVwib25TaG93RXNjYWxhdGlvbkRpYWxvZygkZXZlbnQpXCIgKHNob3dGb3JtRGlhbG9nKT1cIlxuICAgICAgICAgIHRvZ2dsZVN0YXJ0Tm9kZUZvcm1Qb3B1cCgkZXZlbnQsIG5vZGUueCwgbm9kZS55LCBzd2ltbGFuZS5vcmRlciwgbm9kZSlcbiAgICAgICAgXCI+PC9zdmc6Zz5cbiAgICAgIH1cblxuICAgICAgPCEtLSBEZWNpc2lvbiBub2RlIC0tPlxuICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdkZWNpc2lvbicpIHtcbiAgICAgIDxwYXRoIFthdHRyLmRdPVwiXG4gICAgICAgICAgJ00gMCAnICtcbiAgICAgICAgICBub2RlLmhlaWdodCAvIDIgK1xuICAgICAgICAgICcgTCAnICtcbiAgICAgICAgICBub2RlLndpZHRoIC8gMiArXG4gICAgICAgICAgJyAwJyArXG4gICAgICAgICAgJyBMICcgK1xuICAgICAgICAgIG5vZGUud2lkdGggK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgbm9kZS5oZWlnaHQgLyAyICtcbiAgICAgICAgICAnIEwgJyArXG4gICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgbm9kZS5oZWlnaHQgK1xuICAgICAgICAgICcgWidcbiAgICAgICAgXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjRDM2Q0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMVwiPjwvcGF0aD5cblxuICAgICAgPCEtLSBEZWNpc2lvbiBub2RlIGNvbmRpdGlvbiBpbmRpY2F0b3IgaWNvbiAtLT5cbiAgICAgIDxzdmc6ZyAoY2xpY2spPVwic2hvd0RlY2lzaW9uQ29uZGl0aW9uc1BvcHVwKCRldmVudCwgbm9kZSwgc3dpbWxhbmUub3JkZXIpXCIgY2xhc3M9XCJkZWNpc2lvbi1jb25kaXRpb24taWNvblwiXG4gICAgICAgIFthdHRyLnRyYW5zZm9ybV09XCJcbiAgICAgICAgICAndHJhbnNsYXRlKCcgK1xuICAgICAgICAgIChub2RlLndpZHRoIC8gMiAtIDEwKSArXG4gICAgICAgICAgJywnICtcbiAgICAgICAgICAobm9kZS5oZWlnaHQgLyAyIC0gMTApICtcbiAgICAgICAgICAnKSdcbiAgICAgICAgXCI+XG4gICAgICAgIDxzdmc6cmVjdCB4PVwiLTVcIiB5PVwiLTVcIiB3aWR0aD1cIjMwXCIgaGVpZ2h0PVwiMzBcIiBmaWxsPVwidHJhbnNwYXJlbnRcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiIC8+XG4gICAgICAgIDxzdmc6cGF0aCBkPVwiTTEwIDBIMjBWMkgxMFYwWk0xMCA4SDIwVjEwSDEwVjhaTTEwIDRIMjBWNkgxMFY0Wk0wIDBIOFYySDBWMFpNMCA4SDhWMTBIMFY4Wk0wIDRIOFY2SDBWNFpcIlxuICAgICAgICAgIGZpbGw9XCIjRDM2Q0ZGXCIgLz5cbiAgICAgIDwvc3ZnOmc+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gRm9ybSBub2RlIC0tPlxuICAgICAgQGlmIChub2RlLnR5cGUgPT09ICdmb3JtJykge1xuICAgICAgPHBhdGhcbiAgICAgICAgZD1cIk05NS4wNjI1IDUwLjU1OTFWOTUuMDYyNUM5NS4wNjI1IDk3Ljk3MTYgOTMuOTA2OSAxMDAuNzYyIDkxLjg0OTggMTAyLjgxOUM4OS43OTI4IDEwNC44NzYgODcuMDAyOCAxMDYuMDMxIDg0LjA5MzggMTA2LjAzMUgzMi45MDYyQzI5Ljk5NzIgMTA2LjAzMSAyNy4yMDcyIDEwNC44NzYgMjUuMTUwMiAxMDIuODE5QzIzLjA5MzEgMTAwLjc2MiAyMS45Mzc1IDk3Ljk3MTYgMjEuOTM3NSA5NS4wNjI1VjIxLjkzNzVDMjEuOTM3NSAxOS4wMjg0IDIzLjA5MzEgMTYuMjM4NSAyNS4xNTAyIDE0LjE4MTRDMjcuMjA3MiAxMi4xMjQ0IDI5Ljk5NzIgMTAuOTY4OCAzMi45MDYyIDEwLjk2ODhINTUuNDcyMkM1Ny40MTA5IDEwLjk2OSA1OS4yNzAxIDExLjczOTIgNjAuNjQxMiAxMy4xMDk5TDkyLjkyMTMgNDUuMzkwMUM5NC4yOTIgNDYuNzYxMSA5NS4wNjIyIDQ4LjYyMDQgOTUuMDYyNSA1MC41NTkxWlwiXG4gICAgICAgIHRyYW5zZm9ybT1cInNjYWxlKDAuNylcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTU4LjUgMTIuNzk2OVY0MC4yMTg4QzU4LjUgNDIuMTU4MSA1OS4yNzA0IDQ0LjAxODEgNjAuNjQxOCA0NS4zODk1QzYyLjAxMzEgNDYuNzYwOCA2My44NzMxIDQ3LjUzMTIgNjUuODEyNSA0Ny41MzEySDkzLjIzNDRcIlxuICAgICAgICB0cmFuc2Zvcm09XCJzY2FsZSgwLjcpXCIgc3Ryb2tlPVwiI0QzNkNGRlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICA8dGV4dCB4PVwiNTAlXCIgeT1cIjUwJVwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJtaWRkbGVcIiBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxNFwiXG4gICAgICAgIGZpbGw9XCIjRDM2Q0ZGXCI+XG4gICAgICAgIEZvcm1cbiAgICAgIDwvdGV4dD5cbiAgICAgIH1cblxuICAgICAgPCEtLSBTdWJmbG93IG5vZGUgLS0+XG4gICAgICBAaWYgKG5vZGUudHlwZSA9PT0gJ3N1YmZsb3cnKSB7XG4gICAgICA8cGF0aCBbYXR0ci5kXT1cIlxuICAgICAgICAgICdNIDEgJyArXG4gICAgICAgICAgbm9kZS5oZWlnaHQgLyA0ICtcbiAgICAgICAgICAnIEwgJyArXG4gICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICcgMSBMICcgK1xuICAgICAgICAgIChub2RlLndpZHRoIC0gMSkgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgbm9kZS5oZWlnaHQgLyA0ICtcbiAgICAgICAgICAnIFYgJyArXG4gICAgICAgICAgKG5vZGUuaGVpZ2h0ICogMykgLyA0ICtcbiAgICAgICAgICAnIEwgJyArXG4gICAgICAgICAgbm9kZS53aWR0aCAvIDIgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgKG5vZGUuaGVpZ2h0IC0gMSkgK1xuICAgICAgICAgICcgTCAxICcgK1xuICAgICAgICAgIChub2RlLmhlaWdodCAqIDMpIC8gNCArXG4gICAgICAgICAgJyBaJ1xuICAgICAgICBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIxXCI+PC9wYXRoPlxuICAgICAgPHRleHQgW2F0dHIueF09XCJub2RlLndpZHRoIC8gMlwiIFthdHRyLnldPVwibm9kZS5oZWlnaHQgLyAyXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBhbGlnbm1lbnQtYmFzZWxpbmU9XCJtaWRkbGVcIlxuICAgICAgICBmb250LWZhbWlseT1cInNhbnMtc2VyaWZcIiBmb250LXNpemU9XCIxMFwiIGZpbGw9XCIjMDAwMDAwXCI+XG4gICAgICAgIDwhLS0gTGltaXQgdGV4dCBsZW5ndGggLS0+XG4gICAgICAgIHt7XG4gICAgICAgIChub2RlLndvcmtmbG93RGF0YT8ubmFtZSB8fCBcIlN1YmZsb3dcIikubGVuZ3RoID4gMTJcbiAgICAgICAgPyAobm9kZS53b3JrZmxvd0RhdGE/Lm5hbWUgfHwgXCJTdWJmbG93XCIpLnN1YnN0cmluZygwLCAxMCkgKyBcIi4uLlwiXG4gICAgICAgIDogbm9kZS53b3JrZmxvd0RhdGE/Lm5hbWUgfHwgXCJTdWJmbG93XCJcbiAgICAgICAgfX1cbiAgICAgIDwvdGV4dD5cbiAgICAgIH1cblxuICAgICAgPCEtLSBDb25uZWN0aW9uIHBvaW50cyBmb3IgdGhpcyBub2RlIC0tPlxuICAgICAgQGZvciAocG9pbnQgb2Ygbm9kZS5jb25uZWN0aW9uUG9pbnRzIHx8IFtdOyB0cmFjayBwb2ludC5pZCkgeyBAaWZcbiAgICAgIChpc0Nvbm5lY3Rpb25Qb2ludFZpc2libGUobm9kZS5pZCkpIHtcbiAgICAgIDx1c2UgW2F0dHIuaHJlZl09XCInI2Nvbm5lY3Rpb24tcG9pbnQtdGVtcGxhdGUnXCIgW2F0dHIueF09XCJwb2ludC54XCIgW2F0dHIueV09XCJwb2ludC55XCIgW2F0dHIuaWRdPVwicG9pbnQuaWRcIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q29ubmVjdGlvbkRyYWcoJGV2ZW50LCBwb2ludCwgc3dpbWxhbmUub3JkZXIpXCIgLz5cbiAgICAgIH0gfVxuICAgIDwvZz5cbiAgICA8IS0tIEEgdHJhbnNwYXJlbnQgaG92ZXIgYXJlYSBmb3IgaW1wcm92ZWQgaG92ZXIgZGV0ZWN0aW9uIC0tPlxuICAgIDxyZWN0IFthdHRyLnhdPVwibm9kZS54IC0gMTBcIiBbYXR0ci55XT1cIm5vZGUueSAtIDEwXCIgW2F0dHIud2lkdGhdPVwibm9kZS53aWR0aCArIDIwXCIgW2F0dHIuaGVpZ2h0XT1cIm5vZGUuaGVpZ2h0ICsgMjBcIlxuICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCIgKG1vdXNlb3Zlcik9XCJzaG93Q29ubmVjdGlvblBvaW50cyhub2RlLmlkLCBzd2ltbGFuZS5vcmRlcilcIlxuICAgICAgKG1vdXNlb3V0KT1cImhpZGVDb25uZWN0aW9uUG9pbnRzKG5vZGUuaWQpXCIgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZVwiIC8+XG4gICAgfSB9XG5cbiAgICA8IS0tIENvbm5lY3Rpb25zIC0tPlxuICAgIEBmb3IgKGNvbm5lY3Rpb24gb2Ygc3RhdGUuY29ubmVjdGlvbnM7IHRyYWNrIGNvbm5lY3Rpb24uaWQpIHtcbiAgICA8ZyBjbGFzcz1cImNvbm5lY3Rpb24tZWxlbWVudFwiPlxuICAgICAgPHBhdGggW2F0dHIuZF09XCJnZXRDb25uZWN0aW9uUGF0aEZvclNhdmVkQ29ubmVjdGlvbihjb25uZWN0aW9uKVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICBtYXJrZXItZW5kPVwidXJsKCNhcnJvd2hlYWQpXCI+PC9wYXRoPlxuXG4gICAgICA8IS0tIENvbm5lY3Rpb24gTGFiZWwgLS0+XG4gICAgICBAaWYgKGNvbm5lY3Rpb24uc291cmNlTm9kZUlkICYmIGNvbm5lY3Rpb24udGFyZ2V0Tm9kZUlkKSB7XG4gICAgICA8Zm9yZWlnbk9iamVjdCBbYXR0ci54XT1cImdldExhYmVsUG9zaXRpb24oY29ubmVjdGlvbikueFwiIFthdHRyLnldPVwiZ2V0TGFiZWxQb3NpdGlvbihjb25uZWN0aW9uKS55XCIgd2lkdGg9XCIxNTBcIlxuICAgICAgICBoZWlnaHQ9XCI0MFwiIHN0eWxlPVwib3ZlcmZsb3c6IHZpc2libGU7IHBvaW50ZXItZXZlbnRzOiBhbGw7XCIgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoLTc1LCAtMTApJ1wiPlxuICAgICAgICA8d2YtbGFiZWwtZWRpdG9yIFtsYWJlbF09XCJjb25uZWN0aW9uLmxhYmVsIHx8ICdOZXcgQWN0aW9uJ1wiIFt4XT1cIjBcIiBbeV09XCIwXCIgW2lzQ29ubmVjdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAobGFiZWxDaGFuZ2UpPVwic2F2ZUNvbm5lY3Rpb25MYWJlbChjb25uZWN0aW9uLCAkZXZlbnQpXCIgKG9wZW5EaWFsb2cpPVwib25TaG93QWN0aW9uRGlhbG9nKGNvbm5lY3Rpb24pXCIgLz5cbiAgICAgIDwvZm9yZWlnbk9iamVjdD5cbiAgICAgIH1cbiAgICA8L2c+XG4gICAgfVxuXG4gICAgPCEtLSBDb25uZWN0aW9uIHByZXZpZXcgbGluZSAtLT5cbiAgICBAaWYgKHN0YXRlLmlzQ29ubmVjdGlvbkRyYWdnaW5nKCkpIHtcbiAgICA8Zz5cbiAgICAgIDxwYXRoIFthdHRyLmRdPVwiZ2V0Q29ubmVjdGlvblBhdGgoKVwiIHN0cm9rZT1cIiNEMzZDRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWRhc2hhcnJheT1cIjUsNVwiIGZpbGw9XCJub25lXCI+PC9wYXRoPlxuICAgIDwvZz5cbiAgICB9XG4gIDwvc3ZnPlxuXG4gIDxkaXYgKm5nSWY9XCJwb3B1cFZpc2libGVcIiBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiIFtzdHlsZS5sZWZ0LnB4XT1cInBvcHVwWFwiIFtzdHlsZS50b3AucHhdPVwicG9wdXBZXCI+XG4gICAgPHZlcmJlbi1wb3AtVXAgW2Ryb3Bkb3duT3Blbl09XCJ0cnVlXCIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzk5JyB9XCIgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgKGRyb3Bkb3duT3BlbkNoYW5nZSk9XCIkZXZlbnQgPyBudWxsIDogaGlkZUNvbm5lY3Rpb25Qb3B1cCgpXCI+XG4gICAgICA8ZGl2IGRyb3Bkb3duLXRyaWdnZXIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+XG4gICAgICAgIDwhLS0gSGlkZGVuIHRyaWdnZXIgZWxlbWVudCAtLT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtMyBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgc2hhZG93LW1kXCIgZHJvcGRvd24tY29udGVudD5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPkNyZWF0ZSBDb25uZWN0aW9uPC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0eXBlIG9mIGFsbG93ZWROb2RlVHlwZXNcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVOb2RlQ29ubmVjdGlvbih0eXBlKVwiPlxuICAgICAgICAgICAgICBDcmVhdGUge3sgdHlwZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInB4LTMgcHktMiBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgdGV4dC1zbSBob3ZlcjpiZy1ncmF5LTUwXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoaWRlQ29ubmVjdGlvblBvcHVwKClcIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInNob3dTdGFydE5vZGVGb3JtUG9wdXBcIiBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiIFtzdHlsZS5sZWZ0LnB4XT1cInN0YXJ0Tm9kZUZvcm1Qb3B1cFhcIlxuICAgIFtzdHlsZS50b3AucHhdPVwic3RhcnROb2RlRm9ybVBvcHVwWVwiPlxuICAgIDx2ZXJiZW4tcG9wLVVwIFtkcm9wZG93bk9wZW5dPVwidHJ1ZVwiIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICcxMDAnIH1cIj5cbiAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgPCEtLSBIaWRkZW4gdHJpZ2dlciBlbGVtZW50IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicC0zIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCBzaGFkb3ctbWQgdy02NFwiIGRyb3Bkb3duLWNvbnRlbnRcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgei1pbmRleDogMTAwMFwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJtYi0yIGZvbnQtbWVkaXVtXCI+U2VsZWN0IFdvcmtmbG93IEZvcm08L2g0PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nU3RhcnROb2RlRm9ybXNcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTJcIj5cbiAgICAgICAgICBMb2FkaW5nIGZvcm1zLi4uXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzTG9hZGluZ1N0YXJ0Tm9kZUZvcm1zXCIgY2xhc3M9XCJtYXgtaC00OCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBweC0zIHB5LTIgYmctZ3JheS01MCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgdGV4dC1zbSBob3ZlcjpiZy1ncmF5LTUwIHRleHQtbGVmdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTdGFydE5vZGVGb3JtKG51bGwpXCI+XG4gICAgICAgICAgICAgIENsZWFyIGZvcm0gc2VsZWN0aW9uXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmb3JtIG9mIHN0YXJ0Tm9kZUZvcm1zTGlzdFwiIGNsYXNzPVwibWItMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInctZnVsbCBweC0zIHB5LTIgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkIHRleHQtc20gaG92ZXI6YmctZ3JheS01MCB0ZXh0LWxlZnRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdiZy1ibHVlLTUwICFib3JkZXItYmx1ZS01MDAgIWJvcmRlci0yIGZvbnQtc2VtaWJvbGQnOiBmb3JtPy5Db2RlID09PSBhY3RpdmVOb2RlRm9yRm9ybVNlbGVjdGlvbj8uc3RhZ2VEYXRhPy5mb3JtSWR9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN0YXJ0Tm9kZUZvcm0oZm9ybSlcIj5cbiAgICAgICAgICAgICAge3sgZm9ybS5OYW1lIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3RhcnROb2RlRm9ybXNMaXN0Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwidGV4dC1jZW50ZXIgcHktMiB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICBObyBmb3JtcyBhdmFpbGFibGVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzaG93U3ViZmxvd1BvcHVwXCIgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIiBbc3R5bGUubGVmdC5weF09XCJzdWJmbG93UG9wdXBYXCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInN1YmZsb3dQb3B1cFlcIj5cbiAgICA8dmVyYmVuLXBvcC1VcCBbZHJvcGRvd25PcGVuXT1cInRydWVcIiBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnMTAwJyB9XCI+XG4gICAgICA8ZGl2IGRyb3Bkb3duLXRyaWdnZXIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+XG4gICAgICAgIDwhLS0gSGlkZGVuIHRyaWdnZXIgZWxlbWVudCAtLT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInAtMyBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQgc2hhZG93LW1kIHctNjRcIiBkcm9wZG93bi1jb250ZW50XG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IHotaW5kZXg6IDEwMDBcIj5cbiAgICAgICAgPGg0IGNsYXNzPVwibWItMiBmb250LW1lZGl1bVwiPlNlbGVjdCBXb3JrZmxvdzwvaDQ+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdXb3JrZmxvd3NcIiBjbGFzcz1cInRleHQtY2VudGVyIHB5LTJcIj5cbiAgICAgICAgICBMb2FkaW5nIHdvcmtmbG93cy4uLlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdXb3JrZmxvd3NcIiBjbGFzcz1cIm1heC1oLTQ4IG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHdvcmtmbG93IG9mIHdvcmtmbG93c0xpc3RcIiBjbGFzcz1cIm1iLTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3LWZ1bGwgcHgtMyBweS0yIGJnLXdoaXRlIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcm91bmRlZCB0ZXh0LXNtIGhvdmVyOmJnLWdyYXktNTAgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1YmZsb3dXb3JrZmxvdyh3b3JrZmxvdylcIj5cbiAgICAgICAgICAgICAge3sgd29ya2Zsb3cuTmFtZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIndvcmtmbG93c0xpc3QubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0yIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgIE5vIHdvcmtmbG93cyBhdmFpbGFibGVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3ZlcmJlbi1wb3AtVXA+XG4gIDwvZGl2PlxuXG4gIDxsaWItY29uZGl0aW9ucy1wb3B1cCBbdmlzaWJsZV09XCJzaG93RGVjaXNpb25Db25kaXRpb25EaWFsb2dcIiBbZGVjaXNpb25Ob2RlSWRdPVwiYWN0aXZlRGVjaXNpb25Ob2RlSWRcIlxuICAgIFtuZXdDb25uZWN0aW9uSWRdPVwiYWN0aXZlQ29ubmVjdGlvbklkXCIgW3BvcHVwWF09XCJkZWNpc2lvbkNvbmRpdGlvblBvcHVwWFwiIFtwb3B1cFldPVwiZGVjaXNpb25Db25kaXRpb25Qb3B1cFlcIlxuICAgIChjbG9zZWQpPVwib25EZWNpc2lvbkNvbmRpdGlvbkNhbmNlbGxlZCgpXCIgKHNhdmVkKT1cIm9uRGVjaXNpb25Db25kaXRpb25TYXZlZCgkZXZlbnQpXCI+PC9saWItY29uZGl0aW9ucy1wb3B1cD5cblxuICA8IS0tIDxsaWItZGVjaXNpb24tcG9wdXBcbiAgICBbdmlzaWJsZV09XCJzaG93Q29uZGl0aW9uc0RpYWxvZ1wiXG4gICAgW2RlY2lzaW9uTm9kZUlkXT1cImFjdGl2ZURlY2lzaW9uTm9kZUlkXCJcbiAgICBbcG9wdXBYXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBYXCJcbiAgICBbcG9wdXBZXT1cImRlY2lzaW9uQ29uZGl0aW9uUG9wdXBZXCJcbiAgICAoY2xvc2VkKT1cIm9uRGVjaXNpb25Db25kaXRpb25DYW5jZWxsZWQoKVwiXG4gID48L2xpYi1kZWNpc2lvbi1wb3B1cD4gLS0+XG5cbiAgPGxpYi1zdGFnZS1kaWFsb2cgW3Zpc2libGVdPVwic2hvd1N0YWdlRGlhbG9nTG9jYWxcIiBbc3RhZ2VEYXRhXT1cImFjdGl2ZVN0YWdlRGF0YSB8fCB7fVwiXG4gICAgKGNsb3NlZCk9XCJvblN0YWdlRGlhbG9nQ2xvc2VkKClcIiAoc2F2ZWQpPVwib25TdGFnZURpYWxvZ1NhdmVkKCRldmVudClcIj48L2xpYi1zdGFnZS1kaWFsb2c+XG5cbiAgPGxpYi1hY3Rpb24tZGlhbG9nIFt2aXNpYmxlXT1cInNob3dBY3Rpb25EaWFsb2dMb2NhbFwiIFthY3Rpb25EYXRhXT1cImFjdGl2ZUFjdGlvbkRhdGFcIiAoY2xvc2VkKT1cIm9uQWN0aW9uRGlhbG9nQ2xvc2VkKClcIlxuICAgIChzYXZlZCk9XCJvbkFjdGlvbkRpYWxvZ1NhdmVkKCRldmVudClcIj48L2xpYi1hY3Rpb24tZGlhbG9nPlxuXG4gIDxsaWItZXNjYWxhdGlvbi1kaWFsb2cgW3Zpc2libGVdPVwic2hvd0VzY2FsYXRpb25EaWFsb2dMb2NhbFwiIFt0eXBlXT1cImFjdGl2ZUVzY2FsYXRpb25UeXBlKCkhXCJcbiAgICBbc3RhZ2VDb2RlXT1cImFjdGl2ZVN0YWdlQ29kZSgpIHx8ICcnXCIgW3dvcmtmbG93Q29kZV09XCJzdGF0ZS53b3JrZmxvdz8uQ29kZSB8fCAnJ1wiXG4gICAgKGNsb3NlZCk9XCJvbkVzY2FsYXRpb25EaWFsb2dDbG9zZWQoKVwiPjwvbGliLWVzY2FsYXRpb24tZGlhbG9nPlxuPC9kaXY+XG4iXX0=