UNPKG

e5core-angular-ui

Version:

e5 Anywhere Angular UI

412 lines 38.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, QueryList, ViewChildren, ChangeDetectorRef } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { WorkItemService, TaxonomyFieldDefinitionService } from 'e5core-angular-services'; import { Guid } from 'guid-typescript'; import { E5coreUiWorkRelatedItemsBaseComponent } from './component/e5core-ui-work-related-items-base'; import { PrimeTreeTableModel } from '../../models/prime-tree-table.model'; import { KeyValuePair } from '../../util/key-value-pair'; var E5coreUiWorkRelatedItemsComponent = /** @class */ (function () { function E5coreUiWorkRelatedItemsComponent(workItemService, fieldDefinitonServices, changeDetectorRef) { this.workItemService = workItemService; this.fieldDefinitonServices = fieldDefinitonServices; this.changeDetectorRef = changeDetectorRef; this.findId = 0; this.createButtonText = "Create"; this.fieldsToShow = null; this.showCreateChildButton = true; this.showDefinedChildrenOnly = true; this.workItemSelectEvent = new EventEmitter(); this.attachmentSelectEvent = new EventEmitter(); this.categorisationChangeEvent = new EventEmitter(); this.createChildWorkItemEvent = new EventEmitter(); this.labels = []; } /** * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; if (typeof this.workItem$ == 'undefined') { console.error('e5core-ui-work-related-items [workItem$] must have a BehaviorSubject<WorkItemModel>'); return; } if (this.fieldsToShow) { this.fieldsToShow.forEach(function (element) { _this.setLabel(element); }); } if (typeof this.workItem$ != 'undefined') { this.workItem$.subscribe(function (wim) { if (wim.workId != null && wim.workId != Guid.EMPTY) { _this.workId = wim.workId; _this.populateWorkRelatedItems(_this.workId); if (_this.showDefinedChildrenOnly) _this.populateWorkClassChildren(wim.workId.toString()); } }); } }; /** * @private * @param {?} findField * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.setLabel = /** * @private * @param {?} findField * @return {?} */ function (findField) { var _this = this; if (findField.value == "") { /** @type {?} */ var index = this.labels.length; this.labels[this.labels.length] = ""; this.fieldDefinitonServices.get(findField.key).subscribe(function (fd) { _this.labels[index] = fd.label; _this.changeDetectorRef.detectChanges(); }); } else { this.labels[this.labels.length] = findField.value; } }; /** * @private * @param {?} wid * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.populateWorkClassChildren = /** * @private * @param {?} wid * @return {?} */ function (wid) { var _this = this; this.workItemService.getWorkWorkClassChildren(wid).subscribe(function (s) { _this.workRelatedItemsComponents.forEach(function (element) { element.childWorkItemCategories = s; }); }, function (error) { console.error(error); }); }; /** * @private * @param {?} wid * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.populateWorkRelatedItems = /** * @private * @param {?} wid * @return {?} */ function (wid) { var _this = this; this.workItemService.getWorkRelatedItems(wid, { findId: this.findId, pageSize: this.selectedPage.pageSize, pageNo: this.selectedPage.pageIndex, doSearchFromRoot: true }).subscribe(function (s) { /** @type {?} */ var rootModel = _this.convertToUiModel(s.relatedItems); _this.workRelatedItemsComponents.forEach(function (element) { element.length = s.total; element.treeData = (/** @type {?} */ ([rootModel])); _this.changeDetectorRef.detectChanges(); }); _this.changeDetectorRef.detectChanges(); }, function (error) { console.error(error); }); }; /** * @private * @param {?} apiModels * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.convertToUiModel = /** * @private * @param {?} apiModels * @return {?} */ function (apiModels) { var _this = this; if (!apiModels) return; // Nothing to do // Nothing to do /** @type {?} */ var current = apiModels.filter(function (u) { return u.id == _this.workId; }); if (current.length == 0) return; /** @type {?} */ var parent = apiModels.filter(function (u) { return u.id == current[0].parentId; }); if (current[0].parentId == Guid.EMPTY) parent = current; /** @type {?} */ var children = apiModels.filter(function (u) { return u.parentId == _this.workId; }); /** @type {?} */ var rootModel = new PrimeTreeTableModel(); rootModel.data.id = parent[0].id; rootModel.data.attachmentCount = parent[0].attachmentCount; rootModel.data.parentId = parent[0].parentId; rootModel.expanded = true; this.populateDataFields(rootModel.data, parent[0]); this.processChildren(rootModel, children, apiModels); return rootModel; }; /** * @private * @param {?} parent * @param {?} children * @param {?} apiModels * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.processChildren = /** * @private * @param {?} parent * @param {?} children * @param {?} apiModels * @return {?} */ function (parent, children, apiModels) { for (var i = 0; i < children.length; i++) { /** @type {?} */ var child = children[i]; /** @type {?} */ var model = new PrimeTreeTableModel(); model.data.id = child.id; model.data.attachmentCount = child.attachmentCount; model.data.parentId = child.parentId; this.populateDataFields(model.data, child); parent.children[parent.children.length] = model; /** @type {?} */ var moreChildren = apiModels.filter(function (u) { return u.parentId == child.id; }); if (moreChildren.length > 0) { this.processChildren(model, moreChildren, apiModels); } } }; /** * @private * @param {?} modelData * @param {?} child * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.populateDataFields = /** * @private * @param {?} modelData * @param {?} child * @return {?} */ function (modelData, child) { if (!this.fieldsToShow) { modelData.fieldValues = []; } else { for (var i = 0; i < this.fieldsToShow.length; i++) { /** @type {?} */ var findField = this.fieldsToShow[i]; /** @type {?} */ var field = child.fieldValues.filter(function (u) { return u.key == findField.key; }); if (field == null || field.length == 0) { field = [{ key: findField.key, value: "" }]; } /** @type {?} */ var keyValuePair = new KeyValuePair(); keyValuePair.key = field[0].key; keyValuePair.value = field[0].value; modelData.fieldValues[modelData.fieldValues.length] = keyValuePair; } } }; /** * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { }; /** * @param {?} selectedCategory * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.CreateChildWorkItem = /** * @param {?} selectedCategory * @return {?} */ function (selectedCategory) { var _this = this; if (!this.workId) { console.error("e5core-ui-work-related-items has no work item."); return; } /** @type {?} */ var workItemCreateModel = { category1Id: selectedCategory.category1Id, category2Id: selectedCategory.category2Id, category3Id: selectedCategory.category3Id, workItemFields: [ { fieldId: "Parent_id", fieldValue: this.workId, fieldType: "Guid" } ] }; this.workItemService.create(workItemCreateModel).subscribe(function (s) { _this.createChildWorkItemEvent.emit({ workId: s.id, reference: s.reference, type: "related" }); _this.populateWorkRelatedItems(_this.workId); }, function (error) { console.error(error); }); }; /** * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.onCreateChildWorkItem = /** * @return {?} */ function () { this.CreateChildWorkItem(this.selectedCategory); }; /** * @param {?} $event * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.onCategorizationChange = /** * @param {?} $event * @return {?} */ function ($event) { this.selectedCategory = $event; this.categorisationChangeEvent.emit($event); }; /** * @param {?} openWorkEvent * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.onWorkItemSelect = /** * @param {?} openWorkEvent * @return {?} */ function (openWorkEvent) { this.workItemSelectEvent.emit(openWorkEvent); }; /** * @param {?} viewerDisplayEvent * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.onAttachmentSelect = /** * @param {?} viewerDisplayEvent * @return {?} */ function (viewerDisplayEvent) { this.attachmentSelectEvent.emit(viewerDisplayEvent); }; /** * @param {?} event * @return {?} */ E5coreUiWorkRelatedItemsComponent.prototype.onPageEvent = /** * @param {?} event * @return {?} */ function (event) { this.selectedPage = event; if (typeof this.workId != 'undefined' && this.workId != Guid.EMPTY) { this.populateWorkRelatedItems(this.workId); } }; E5coreUiWorkRelatedItemsComponent.decorators = [ { type: Component, args: [{ selector: 'e5core-ui-work-related-items', template: "\n <span *ngIf=\"workItem$\">\n <e5core-ui-work-related-items-prime [labels]=\"labels\" [showCreateChildButton]=\"showCreateChildButton\" [createButtonText]=\"createButtonText\" [showDefinedChildrenOnly]=\"showDefinedChildrenOnly\" [readonly]=\"readonly\" (workItemSelectEvent)=\"onWorkItemSelect($event)\" (attachmentSelectEvent)=\"onAttachmentSelect($event)\" (categorisationChangeEvent)=\"onCategorizationChange($event)\" (createChildWorkItemEvent)=\"onCreateChildWorkItem()\" (pageEvent)=\"onPageEvent($event)\"></e5core-ui-work-related-items-prime>\n </span>\n <div *ngIf=\"!(workItem$)\" class=\"e5core-component-error\">&lt;e5core-ui-work-related-items&gt; [workItem$] must have a BehaviorSubject&lt;WorkItemModel&gt;</div>", changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ E5coreUiWorkRelatedItemsComponent.ctorParameters = function () { return [ { type: WorkItemService }, { type: TaxonomyFieldDefinitionService }, { type: ChangeDetectorRef } ]; }; E5coreUiWorkRelatedItemsComponent.propDecorators = { workItem$: [{ type: Input }], findId: [{ type: Input }], createButtonText: [{ type: Input }], fieldsToShow: [{ type: Input }], readonly: [{ type: Input }], pagesizes: [{ type: Input }], showCreateChildButton: [{ type: Input }], showDefinedChildrenOnly: [{ type: Input }], workItemSelectEvent: [{ type: Output }], attachmentSelectEvent: [{ type: Output }], categorisationChangeEvent: [{ type: Output }], createChildWorkItemEvent: [{ type: Output }], workRelatedItemsComponents: [{ type: ViewChildren, args: [E5coreUiWorkRelatedItemsBaseComponent,] }] }; return E5coreUiWorkRelatedItemsComponent; }()); export { E5coreUiWorkRelatedItemsComponent }; if (false) { /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workItem$; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.findId; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.createButtonText; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.fieldsToShow; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.readonly; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.pagesizes; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.showCreateChildButton; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.showDefinedChildrenOnly; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workItemSelectEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.attachmentSelectEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.categorisationChangeEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.createChildWorkItemEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workId; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.selectedPage; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.selectedCategory; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.labels; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workRelatedItemsComponents; /** * @type {?} * @private */ E5coreUiWorkRelatedItemsComponent.prototype.workItemService; /** * @type {?} * @private */ E5coreUiWorkRelatedItemsComponent.prototype.fieldDefinitonServices; /** * @type {?} * @private */ E5coreUiWorkRelatedItemsComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTVjb3JlLXVpLXdvcmstcmVsYXRlZC1pdGVtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9lNWNvcmUtYW5ndWxhci11aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMvZTVjb3JlLXVpLXdvcmstcmVsYXRlZC1pdGVtcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsdUJBQXVCLEVBQUUsS0FBSyxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkssT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixFQUF3QixNQUFNLHlCQUF5QixDQUFDO0FBQ2hILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUd0RyxPQUFPLEVBQUUsbUJBQW1CLEVBQXNCLE1BQU0scUNBQXFDLENBQUM7QUFFOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pEO0lBaUNFLDJDQUNVLGVBQWdDLEVBQ2hDLHNCQUFzRCxFQUN0RCxpQkFBb0M7UUFGcEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBZ0M7UUFDdEQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXhCckMsV0FBTSxHQUFZLENBQUMsQ0FBQztRQUNwQixxQkFBZ0IsR0FBWSxRQUFRLENBQUM7UUFDckMsaUJBQVksR0FBb0IsSUFBSSxDQUFDO1FBR3JDLDBCQUFxQixHQUFhLElBQUksQ0FBQztRQUN2Qyw0QkFBdUIsR0FBYSxJQUFJLENBQUM7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QUFXLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2xFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDOztnQkFoUEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFFBQVEsRUFBRSxrdUJBSXVKO29CQUNqSyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7Ozs7Z0JBbEJRLGVBQWU7Z0JBQUUsOEJBQThCO2dCQUhrRSxpQkFBaUI7Ozs0QkF3QnhJLEtBQUs7eUJBQ0wsS0FBSzttQ0FDTCxLQUFLOytCQUNMLEtBQUs7MkJBQ0wsS0FBSzs0QkFDTCxLQUFLO3dDQUNMLEtBQUs7MENBQ0wsS0FBSztzQ0FFTCxNQUFNO3dDQUNOLE1BQU07NENBQ04sTUFBTTsyQ0FDTixNQUFNOzZDQU9OLFlBQVksU0FBQyxxQ0FBcUM7O0lBbU5yRCx3Q0FBQztDQUFBLEFBalBELElBaVBDO1NBeE9ZLGlDQUFpQzs7O0lBRTVDLHNEQUFvRDs7SUFDcEQsbURBQTZCOztJQUM3Qiw2REFBOEM7O0lBQzlDLHlEQUE4Qzs7SUFDOUMscURBQTRCOztJQUM1QixzREFBOEI7O0lBQzlCLGtFQUFnRDs7SUFDaEQsb0VBQWtEOztJQUVsRCxnRUFBa0U7O0lBQ2xFLGtFQUF5RTs7SUFDekUsc0VBQW9GOztJQUNwRixxRUFBdUU7O0lBRXZFLG1EQUFpQjs7SUFDakIseURBQWtCOztJQUNsQiw2REFBdUI7O0lBQ3ZCLG1EQUFzQjs7SUFFdEIsdUVBQ29GOzs7OztJQUdsRiw0REFBd0M7Ozs7O0lBQ3hDLG1FQUE4RDs7Ozs7SUFDOUQsOERBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBXb3JrSXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dvcmstaXRlbSc7XG5pbXBvcnQgeyBXb3JrSXRlbVNlcnZpY2UsIFRheG9ub215RmllbGREZWZpbml0aW9uU2VydmljZSwgV29ya1JlbGF0ZWRJdGVtTW9kZWwgfSBmcm9tICdlNWNvcmUtYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBHdWlkIH0gZnJvbSAnZ3VpZC10eXBlc2NyaXB0JztcbmltcG9ydCB7IEU1Y29yZVVpV29ya1JlbGF0ZWRJdGVtc0Jhc2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9lNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zLWJhc2UnO1xuaW1wb3J0IHsgVmlld2VyRGlzcGxheUV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzL3ZpZXdlci1kaXNwbGF5LWV2ZW50JztcbmltcG9ydCB7IE9wZW5Xb3JrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvb3Blbi13b3JrLWV2ZW50JztcbmltcG9ydCB7IFByaW1lVHJlZVRhYmxlTW9kZWwsIFRyZWVUYWJsZURhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9wcmltZS10cmVlLXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvY2F0ZWdvcml6YXRpb24tY2hhbmdlLWV2ZW50JztcbmltcG9ydCB7IEtleVZhbHVlUGFpciB9IGZyb20gJy4uLy4uL3V0aWwva2V5LXZhbHVlLXBhaXInO1xuaW1wb3J0IHsgRHluYW1pYyB9IGZyb20gJy4uLy4uL3V0aWwvZHluYW1pYyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMnLFxuICB0ZW1wbGF0ZTogYFxuICA8c3BhbiAqbmdJZj1cIndvcmtJdGVtJFwiPlxuICAgIDxlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zLXByaW1lIFtsYWJlbHNdPVwibGFiZWxzXCIgW3Nob3dDcmVhdGVDaGlsZEJ1dHRvbl09XCJzaG93Q3JlYXRlQ2hpbGRCdXR0b25cIiBbY3JlYXRlQnV0dG9uVGV4dF09XCJjcmVhdGVCdXR0b25UZXh0XCIgW3Nob3dEZWZpbmVkQ2hpbGRyZW5Pbmx5XT1cInNob3dEZWZpbmVkQ2hpbGRyZW5Pbmx5XCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgKHdvcmtJdGVtU2VsZWN0RXZlbnQpPVwib25Xb3JrSXRlbVNlbGVjdCgkZXZlbnQpXCIgKGF0dGFjaG1lbnRTZWxlY3RFdmVudCk9XCJvbkF0dGFjaG1lbnRTZWxlY3QoJGV2ZW50KVwiIChjYXRlZ29yaXNhdGlvbkNoYW5nZUV2ZW50KT1cIm9uQ2F0ZWdvcml6YXRpb25DaGFuZ2UoJGV2ZW50KVwiIChjcmVhdGVDaGlsZFdvcmtJdGVtRXZlbnQpPVwib25DcmVhdGVDaGlsZFdvcmtJdGVtKClcIiAocGFnZUV2ZW50KT1cIm9uUGFnZUV2ZW50KCRldmVudClcIj48L2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMtcHJpbWU+XG4gIDwvc3Bhbj5cbiAgPGRpdiAqbmdJZj1cIiEod29ya0l0ZW0kKVwiIGNsYXNzPVwiZTVjb3JlLWNvbXBvbmVudC1lcnJvclwiPiZsdDtlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zJmd0OyBbd29ya0l0ZW0kXSBtdXN0IGhhdmUgYSBCZWhhdmlvclN1YmplY3QmbHQ7V29ya0l0ZW1Nb2RlbCZndDs8L2Rpdj5gLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBFNWNvcmVVaVdvcmtSZWxhdGVkSXRlbXNDb21wb25lbnQgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcblxuICBASW5wdXQoKSB3b3JrSXRlbSQgOiBCZWhhdmlvclN1YmplY3Q8V29ya0l0ZW1Nb2RlbD47XG4gIEBJbnB1dCgpIGZpbmRJZCA6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGNyZWF0ZUJ1dHRvblRleHQgOiBzdHJpbmcgPSBcIkNyZWF0ZVwiO1xuICBASW5wdXQoKSBmaWVsZHNUb1Nob3cgOiBLZXlWYWx1ZVBhaXJbXSA9IG51bGw7XG4gIEBJbnB1dCgpIHJlYWRvbmx5IDogYm9vbGVhbjtcbiAgQElucHV0KCkgcGFnZXNpemVzIDogbnVtYmVyW107XG4gIEBJbnB1dCgpIHNob3dDcmVhdGVDaGlsZEJ1dHRvbiA6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RGVmaW5lZENoaWxkcmVuT25seSA6IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgQE91dHB1dCgpIHdvcmtJdGVtU2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9wZW5Xb3JrRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhdHRhY2htZW50U2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdlckRpc3BsYXlFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNhdGVnb3Jpc2F0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVDaGlsZFdvcmtJdGVtRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9wZW5Xb3JrRXZlbnQ+KCk7XG5cbiAgd29ya0lkIDogc3RyaW5nIDtcbiAgc2VsZWN0ZWRQYWdlOiBhbnk7XG4gIHNlbGVjdGVkQ2F0ZWdvcnkgOiBhbnk7XG4gIGxhYmVsczpzdHJpbmdbXSA9IFtdIDtcbiAgXG4gIEBWaWV3Q2hpbGRyZW4oRTVjb3JlVWlXb3JrUmVsYXRlZEl0ZW1zQmFzZUNvbXBvbmVudClcbiAgcHVibGljIHdvcmtSZWxhdGVkSXRlbXNDb21wb25lbnRzOiBRdWVyeUxpc3Q8RTVjb3JlVWlXb3JrUmVsYXRlZEl0ZW1zQmFzZUNvbXBvbmVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB3b3JrSXRlbVNlcnZpY2U6IFdvcmtJdGVtU2VydmljZSxcbiAgICBwcml2YXRlIGZpZWxkRGVmaW5pdG9uU2VydmljZXM6IFRheG9ub215RmllbGREZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy53b3JrSXRlbSQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMgW3dvcmtJdGVtJF0gbXVzdCBoYXZlIGEgQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+Jyk7XG4gICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIGlmKHRoaXMuZmllbGRzVG9TaG93KSB7XG4gICAgICB0aGlzLmZpZWxkc1RvU2hvdy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLnNldExhYmVsKGVsZW1lbnQpO1xuICAgICAgfSk7ICBcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMud29ya0l0ZW0kICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLndvcmtJdGVtJC5zdWJzY3JpYmUoXG4gICAgICAgIHdpbSA9PiB7XG4gICAgICAgICAgaWYgKHdpbS53b3JrSWQgIT0gbnVsbCAmJiB3aW0ud29ya0lkICE9IEd1aWQuRU1QVFkpIHtcbiAgICAgICAgICAgIHRoaXMud29ya0lkID0gd2ltLndvcmtJZDtcblxuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVdvcmtSZWxhdGVkSXRlbXModGhpcy53b3JrSWQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93RGVmaW5lZENoaWxkcmVuT25seSlcbiAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVdvcmtDbGFzc0NoaWxkcmVuKHdpbS53b3JrSWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYWJlbChmaW5kRmllbGQgOiBLZXlWYWx1ZVBhaXIpIHtcbiAgICBpZiAoZmluZEZpZWxkLnZhbHVlID09IFwiXCIpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMubGFiZWxzLmxlbmd0aDtcbiAgICAgIHRoaXMubGFiZWxzW3RoaXMubGFiZWxzLmxlbmd0aF0gPSBcIlwiO1xuICAgICAgdGhpcy5maWVsZERlZmluaXRvblNlcnZpY2VzLmdldChmaW5kRmllbGQua2V5KS5zdWJzY3JpYmUoIFxuICAgICAgICBmZCA9PiB7XG4gICAgICAgICAgdGhpcy5sYWJlbHNbaW5kZXhdID0gZmQubGFiZWw7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pIDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbHNbdGhpcy5sYWJlbHMubGVuZ3RoXSA9IGZpbmRGaWVsZC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlV29ya0NsYXNzQ2hpbGRyZW4od2lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtJdGVtU2VydmljZS5nZXRXb3JrV29ya0NsYXNzQ2hpbGRyZW4od2lkKS5zdWJzY3JpYmUoXG4gICAgICBzID0+IHtcbiAgICAgICAgdGhpcy53b3JrUmVsYXRlZEl0ZW1zQ29tcG9uZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuY2hpbGRXb3JrSXRlbUNhdGVnb3JpZXMgPSBzO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHdpZDogc3RyaW5nKSB7XG4gICAgdGhpcy53b3JrSXRlbVNlcnZpY2UuZ2V0V29ya1JlbGF0ZWRJdGVtcyh3aWQsIHtcbiAgICAgIGZpbmRJZDogdGhpcy5maW5kSWQsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5zZWxlY3RlZFBhZ2UucGFnZVNpemUsXG4gICAgICBwYWdlTm86IHRoaXMuc2VsZWN0ZWRQYWdlLnBhZ2VJbmRleCxcbiAgICAgIGRvU2VhcmNoRnJvbVJvb3Q6IHRydWVcbiAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgIHMgPT4ge1xuICAgICAgICB2YXIgcm9vdE1vZGVsID0gdGhpcy5jb252ZXJ0VG9VaU1vZGVsKHMucmVsYXRlZEl0ZW1zKTtcbiAgICAgICAgdGhpcy53b3JrUmVsYXRlZEl0ZW1zQ29tcG9uZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnQubGVuZ3RoID0gcy50b3RhbDtcbiAgICAgICAgICBlbGVtZW50LnRyZWVEYXRhID0gPFByaW1lVHJlZVRhYmxlTW9kZWxbXT5bcm9vdE1vZGVsXTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVWlNb2RlbChhcGlNb2RlbHM6IFdvcmtSZWxhdGVkSXRlbU1vZGVsW10pOiBQcmltZVRyZWVUYWJsZU1vZGVsIHtcbiAgICBpZighYXBpTW9kZWxzKVxuICAgICAgcmV0dXJuIDsgLy8gTm90aGluZyB0byBkb1xuICAgICAgXG4gICAgdmFyIGN1cnJlbnQgPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5pZCA9PSB0aGlzLndvcmtJZCk7XG5cbiAgICBpZiAoY3VycmVudC5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcblxuICAgICAgIFxuICAgIHZhciBwYXJlbnQgPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5pZCA9PSBjdXJyZW50WzBdLnBhcmVudElkKTtcbiAgICBcbiAgICBpZihjdXJyZW50WzBdLnBhcmVudElkPT1HdWlkLkVNUFRZKVxuICAgICAgcGFyZW50ID0gY3VycmVudDtcblxuICAgIHZhciBjaGlsZHJlbiA9IGFwaU1vZGVscy5maWx0ZXIodSA9PiB1LnBhcmVudElkID09IHRoaXMud29ya0lkKTtcblxuICAgIHZhciByb290TW9kZWwgPSBuZXcgUHJpbWVUcmVlVGFibGVNb2RlbCgpO1xuICAgIHJvb3RNb2RlbC5kYXRhLmlkID0gcGFyZW50WzBdLmlkO1xuICAgIHJvb3RNb2RlbC5kYXRhLmF0dGFjaG1lbnRDb3VudCA9IHBhcmVudFswXS5hdHRhY2htZW50Q291bnQ7XG4gICAgcm9vdE1vZGVsLmRhdGEucGFyZW50SWQgPSBwYXJlbnRbMF0ucGFyZW50SWQ7XG4gICAgcm9vdE1vZGVsLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnBvcHVsYXRlRGF0YUZpZWxkcyhyb290TW9kZWwuZGF0YSwgcGFyZW50WzBdKTtcbiAgICB0aGlzLnByb2Nlc3NDaGlsZHJlbihyb290TW9kZWwsIGNoaWxkcmVuLCBhcGlNb2RlbHMpXG5cbiAgICByZXR1cm4gcm9vdE1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQ2hpbGRyZW4ocGFyZW50OiBQcmltZVRyZWVUYWJsZU1vZGVsLCBjaGlsZHJlbjogV29ya1JlbGF0ZWRJdGVtTW9kZWxbXSwgYXBpTW9kZWxzOiBXb3JrUmVsYXRlZEl0ZW1Nb2RlbFtdKSB7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBtb2RlbCA9IG5ldyBQcmltZVRyZWVUYWJsZU1vZGVsKCk7XG4gICAgICBtb2RlbC5kYXRhLmlkID0gY2hpbGQuaWQ7XG4gICAgICBtb2RlbC5kYXRhLmF0dGFjaG1lbnRDb3VudCA9IGNoaWxkLmF0dGFjaG1lbnRDb3VudDtcbiAgICAgIG1vZGVsLmRhdGEucGFyZW50SWQgPSBjaGlsZC5wYXJlbnRJZDtcblxuICAgICAgdGhpcy5wb3B1bGF0ZURhdGFGaWVsZHMobW9kZWwuZGF0YSwgY2hpbGQpO1xuICAgICAgcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5sZW5ndGhdID0gbW9kZWw7XG5cbiAgICAgIHZhciBtb3JlQ2hpbGRyZW4gPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5wYXJlbnRJZCA9PSBjaGlsZC5pZCk7XG5cbiAgICAgIGlmIChtb3JlQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NDaGlsZHJlbihtb2RlbCwgbW9yZUNoaWxkcmVuLCBhcGlNb2RlbHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVEYXRhRmllbGRzKG1vZGVsRGF0YTogVHJlZVRhYmxlRGF0YU1vZGVsLCBjaGlsZDogYW55KSB7XG4gICAgaWYoIXRoaXMuZmllbGRzVG9TaG93KSB7XG4gICAgICBtb2RlbERhdGEuZmllbGRWYWx1ZXMgPSBbXSA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmZpZWxkc1RvU2hvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmluZEZpZWxkID0gdGhpcy5maWVsZHNUb1Nob3dbaV07XG4gICAgICAgIHZhciBmaWVsZCA9IGNoaWxkLmZpZWxkVmFsdWVzLmZpbHRlcih1ID0+IHUua2V5ID09IGZpbmRGaWVsZC5rZXkpO1xuICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCB8fCBmaWVsZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGZpZWxkID0gW3trZXk6IGZpbmRGaWVsZC5rZXksIHZhbHVlOiBcIlwifV1cbiAgICAgICAgfVxuICBcbiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IG5ldyBLZXlWYWx1ZVBhaXIoKTtcbiAgICAgICAga2V5VmFsdWVQYWlyLmtleSA9IGZpZWxkWzBdLmtleTtcbiAgICAgICAga2V5VmFsdWVQYWlyLnZhbHVlID0gZmllbGRbMF0udmFsdWU7XG4gICAgICAgIG1vZGVsRGF0YS5maWVsZFZhbHVlc1ttb2RlbERhdGEuZmllbGRWYWx1ZXMubGVuZ3RoXSA9IGtleVZhbHVlUGFpcjtcbiAgICAgIH0gIFxuICAgIH1cbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICB9XG5cbiAgcHVibGljIENyZWF0ZUNoaWxkV29ya0l0ZW0oc2VsZWN0ZWRDYXRlZ29yeSA6IGFueSkgOiB2b2lkIHtcbiAgICBpZighdGhpcy53b3JrSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zIGhhcyBubyB3b3JrIGl0ZW0uXCIpIDtcbiAgICAgIHJldHVybiA7XG4gICAgfVxuXG4gICAgdmFyIHdvcmtJdGVtQ3JlYXRlTW9kZWwgPSB7XG4gICAgICAgICAgY2F0ZWdvcnkxSWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkxSWQsXG4gICAgICAgICAgY2F0ZWdvcnkySWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkySWQsXG4gICAgICAgICAgY2F0ZWdvcnkzSWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkzSWQsXG4gICAgICAgICAgd29ya0l0ZW1GaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGRJZDogXCJQYXJlbnRfaWRcIixcbiAgICAgICAgICAgICAgZmllbGRWYWx1ZTogdGhpcy53b3JrSWQsXG4gICAgICAgICAgICAgIGZpZWxkVHlwZTogXCJHdWlkXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdIFxuICAgICAgICB9O1xuXG4gICAgdGhpcy53b3JrSXRlbVNlcnZpY2UuY3JlYXRlKHdvcmtJdGVtQ3JlYXRlTW9kZWwpLnN1YnNjcmliZShcbiAgICAgIHMgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoaWxkV29ya0l0ZW1FdmVudC5lbWl0KHt3b3JrSWQ6IHMuaWQsIHJlZmVyZW5jZTogcy5yZWZlcmVuY2UsIHR5cGU6IFwicmVsYXRlZFwifSk7XG4gICAgICAgIHRoaXMucG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHRoaXMud29ya0lkKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBvbkNyZWF0ZUNoaWxkV29ya0l0ZW0oKSA6IHZvaWQge1xuICAgIHRoaXMuQ3JlYXRlQ2hpbGRXb3JrSXRlbSh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICB9XG5cbiAgcHVibGljIG9uQ2F0ZWdvcml6YXRpb25DaGFuZ2UoJGV2ZW50OiBDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50KSA6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9ICRldmVudDtcbiAgICB0aGlzLmNhdGVnb3Jpc2F0aW9uQ2hhbmdlRXZlbnQuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uV29ya0l0ZW1TZWxlY3Qob3BlbldvcmtFdmVudCA6IE9wZW5Xb3JrRXZlbnQpIDogdm9pZCB7XG4gICAgdGhpcy53b3JrSXRlbVNlbGVjdEV2ZW50LmVtaXQob3BlbldvcmtFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25BdHRhY2htZW50U2VsZWN0KHZpZXdlckRpc3BsYXlFdmVudCA6IFZpZXdlckRpc3BsYXlFdmVudCkgOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaG1lbnRTZWxlY3RFdmVudC5lbWl0KHZpZXdlckRpc3BsYXlFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdlRXZlbnQoZXZlbnQpIDogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2UgPSBldmVudDtcbiAgICBcbiAgICBpZiAodHlwZW9mIHRoaXMud29ya0lkICE9ICd1bmRlZmluZWQnICYmIHRoaXMud29ya0lkICE9IEd1aWQuRU1QVFkpIHtcbiAgICAgIHRoaXMucG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHRoaXMud29ya0lkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==