ngx-tethys 17.0.12 → 17.0.13

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [17.0.13](https://github.com/atinc/ngx-tethys/compare/17.0.12...17.0.13) (2024-07-03)
6
+
7
+
8
+ ### Features
9
+
10
+ * **tree:** thy-tree support thyExpandedKeys and thyExpandAll #INFR-12795 ([#3110](https://github.com/atinc/ngx-tethys/issues/3110)) ([ce8aedf](https://github.com/atinc/ngx-tethys/commit/ce8aedfbe39430f8cddfc1a7c2c583e770b7800f)), closes [#INFR-12795](https://github.com/atinc/ngx-tethys/issues/INFR-12795)
11
+
12
+
13
+
5
14
  ## [17.0.12](https://github.com/atinc/ngx-tethys/compare/17.0.11...17.0.12) (2024-07-02)
6
15
 
7
16
 
@@ -110,11 +110,11 @@ fieldset:disabled a.btn {
110
110
  @include mixin.button-outline-variant(
111
111
  variables.$gray-700,
112
112
  variables.$gray-300,
113
- variables.$primary,
114
- null,
115
- variables.$primary,
116
- null,
117
- variables.$primary
113
+ variables.$gray-700,
114
+ variables.$gray-100,
115
+ variables.$gray-300,
116
+ variables.$gray-100,
117
+ variables.$gray-300
118
118
  );
119
119
  }
120
120
 
@@ -163,6 +163,10 @@ export class ThyTree {
163
163
  * @type boolean
164
164
  */
165
165
  this.thyTitleTruncate = true;
166
+ /**
167
+ * 是否展开所有树节点
168
+ */
169
+ this.thyExpandAll = false;
166
170
  /**
167
171
  * 设置缩进距离,缩进距离 = thyIndent * node.level
168
172
  * @type number
@@ -237,6 +241,12 @@ export class ThyTree {
237
241
  this._selectedKeys = changes.thySelectedKeys.currentValue;
238
242
  this._selectTreeNodes(changes.thySelectedKeys.currentValue);
239
243
  }
244
+ if (changes.thyExpandedKeys && !changes.thyExpandedKeys.isFirstChange()) {
245
+ this._handleExpandedKeys();
246
+ }
247
+ if (changes.thyExpandAll && !changes.thyExpandAll.isFirstChange()) {
248
+ this._handleExpandedKeys();
249
+ }
240
250
  }
241
251
  eventTriggerChanged(event) {
242
252
  switch (event.eventName) {
@@ -254,7 +264,13 @@ export class ThyTree {
254
264
  this.thyTreeService.initializeTreeNodes(this.thyNodes);
255
265
  this.flattenTreeNodes = this.thyTreeService.flattenTreeNodes;
256
266
  this._selectTreeNodes(this._selectedKeys);
257
- this.thyTreeService.expandTreeNodes(this._expandedKeys);
267
+ this._handleExpandedKeys();
268
+ }
269
+ _handleExpandedKeys() {
270
+ if (this.thyExpandedKeys?.length) {
271
+ this._expandedKeys = helpers.concatArray(this.thyExpandedKeys.filter(key => !this._expandedKeys.includes(key)), this._expandedKeys);
272
+ }
273
+ this.thyTreeService.expandTreeNodes(this.thyExpandAll || this._expandedKeys);
258
274
  }
259
275
  _setTreeType() {
260
276
  if (this.thyType && treeTypeClassMap[this.thyType]) {
@@ -506,7 +522,7 @@ export class ThyTree {
506
522
  this.destroy$.complete();
507
523
  }
508
524
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: ThyTree, deps: [{ token: i1.ThyTreeService }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
509
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.2.3", type: ThyTree, isStandalone: true, selector: "thy-tree", inputs: { thyNodes: "thyNodes", thyShowExpand: "thyShowExpand", thyMultiple: ["thyMultiple", "thyMultiple", coerceBooleanProperty], thyDraggable: ["thyDraggable", "thyDraggable", coerceBooleanProperty], thyCheckable: ["thyCheckable", "thyCheckable", coerceBooleanProperty], thyClickBehavior: "thyClickBehavior", thyCheckStateResolve: "thyCheckStateResolve", thyAsync: ["thyAsync", "thyAsync", coerceBooleanProperty], thyType: "thyType", thyIcons: "thyIcons", thySize: "thySize", thyVirtualScroll: ["thyVirtualScroll", "thyVirtualScroll", coerceBooleanProperty], thyItemSize: ["thyItemSize", "thyItemSize", numberAttribute], thyTitleTruncate: ["thyTitleTruncate", "thyTitleTruncate", coerceBooleanProperty], thySelectedKeys: "thySelectedKeys", thyIndent: ["thyIndent", "thyIndent", numberAttribute], thyBeforeDragStart: "thyBeforeDragStart", thyBeforeDragDrop: "thyBeforeDragDrop" }, outputs: { viewport: "viewport", thyOnClick: "thyOnClick", thyOnCheckboxChange: "thyOnCheckboxChange", thyOnExpandChange: "thyOnExpandChange", thyOnDragDrop: "thyOnDragDrop", thyDblClick: "thyDblClick" }, host: { properties: { "class.thy-multiple-selection-list": "this.thyMultiple", "class.thy-tree-draggable": "this.thyDraggable", "class.thy-virtual-scrolling-tree": "this.thyVirtualScroll", "class.thy-tree": "this.thyTreeClass", "class.thy-tree-dragging": "this.dragging" } }, providers: [
525
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.2.3", type: ThyTree, isStandalone: true, selector: "thy-tree", inputs: { thyNodes: "thyNodes", thyShowExpand: "thyShowExpand", thyMultiple: ["thyMultiple", "thyMultiple", coerceBooleanProperty], thyDraggable: ["thyDraggable", "thyDraggable", coerceBooleanProperty], thyCheckable: ["thyCheckable", "thyCheckable", coerceBooleanProperty], thyClickBehavior: "thyClickBehavior", thyCheckStateResolve: "thyCheckStateResolve", thyAsync: ["thyAsync", "thyAsync", coerceBooleanProperty], thyType: "thyType", thyIcons: "thyIcons", thySize: "thySize", thyVirtualScroll: ["thyVirtualScroll", "thyVirtualScroll", coerceBooleanProperty], thyItemSize: ["thyItemSize", "thyItemSize", numberAttribute], thyTitleTruncate: ["thyTitleTruncate", "thyTitleTruncate", coerceBooleanProperty], thySelectedKeys: "thySelectedKeys", thyExpandedKeys: "thyExpandedKeys", thyExpandAll: ["thyExpandAll", "thyExpandAll", coerceBooleanProperty], thyIndent: ["thyIndent", "thyIndent", numberAttribute], thyBeforeDragStart: "thyBeforeDragStart", thyBeforeDragDrop: "thyBeforeDragDrop" }, outputs: { viewport: "viewport", thyOnClick: "thyOnClick", thyOnCheckboxChange: "thyOnCheckboxChange", thyOnExpandChange: "thyOnExpandChange", thyOnDragDrop: "thyOnDragDrop", thyDblClick: "thyDblClick" }, host: { properties: { "class.thy-multiple-selection-list": "this.thyMultiple", "class.thy-tree-draggable": "this.thyDraggable", "class.thy-virtual-scrolling-tree": "this.thyVirtualScroll", "class.thy-tree": "this.thyTreeClass", "class.thy-tree-dragging": "this.dragging" } }, providers: [
510
526
  {
511
527
  provide: NG_VALUE_ACCESSOR,
512
528
  useExisting: forwardRef(() => ThyTree),
@@ -597,6 +613,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
597
613
  args: [{ transform: coerceBooleanProperty }]
598
614
  }], thySelectedKeys: [{
599
615
  type: Input
616
+ }], thyExpandedKeys: [{
617
+ type: Input
618
+ }], thyExpandAll: [{
619
+ type: Input,
620
+ args: [{ transform: coerceBooleanProperty }]
600
621
  }], thyIndent: [{
601
622
  type: Input,
602
623
  args: [{ transform: numberAttribute }]
@@ -630,4 +651,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
630
651
  type: ViewChildren,
631
652
  args: [CdkDrag]
632
653
  }] } });
633
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJlZS90cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy90cmVlL3RyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlHLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBSWYsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBS0gsbUJBQW1CLEVBRW5CLFlBQVksRUFHZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxF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QWNPLHFCQUFxQjtzQkFBN0UsWUFBWTt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWXZELFlBQVk7c0JBRFgsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBSTdCLFFBQVE7c0JBRFAsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBR2YsUUFBUTtzQkFBOUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5LCBoZWxwZXJzIH0gZnJvbSAnbmd4LXRldGh5cy91dGlsJztcbmltcG9ydCB7IHVzZUhvc3RSZW5kZXJlciB9IGZyb20gJ0B0ZXRoeXMvY2RrL2RvbSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwsIENka1ZpcnR1YWxGb3JPZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIG51bWJlckF0dHJpYnV0ZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRIWV9UUkVFX0FCU1RSQUNUX1RPS0VOIH0gZnJvbSAnLi90cmVlLWFic3RyYWN0JztcbmltcG9ydCB7IFRoeVRyZWVOb2RlIH0gZnJvbSAnLi90cmVlLW5vZGUuY2xhc3MnO1xuaW1wb3J0IHtcbiAgICBUaHlUcmVlQmVmb3JlRHJhZ0Ryb3BDb250ZXh0LFxuICAgIFRoeVRyZWVCZWZvcmVEcmFnU3RhcnRDb250ZXh0LFxuICAgIFRoeUNsaWNrQmVoYXZpb3IsXG4gICAgVGh5VHJlZURyYWdEcm9wRXZlbnQsXG4gICAgVGh5VHJlZURyb3BQb3NpdGlvbixcbiAgICBUaHlUcmVlRW1pdEV2ZW50LFxuICAgIFRoeVRyZWVJY29ucyxcbiAgICBUaHlUcmVlTm9kZUNoZWNrU3RhdGUsXG4gICAgVGh5VHJlZU5vZGVEYXRhXG59IGZyb20gJy4vdHJlZS5jbGFzcyc7XG5pbXBvcnQgeyBUaHlUcmVlU2VydmljZSB9IGZyb20gJy4vdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRoeVRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IE5nSWYsIE5nRm9yLCBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJhZ0VuZCwgQ2RrRHJhZ01vdmUsIENka0RyYWdTdGFydCwgQ2RrRHJvcExpc3QgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgZmlsdGVyLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRoeVRyZWVOb2RlRHJhZ2dhYmxlUGlwZSB9IGZyb20gJy4vdHJlZS5waXBlJztcblxudHlwZSBUaHlUcmVlU2l6ZSA9ICdzbScgfCAnZGVmYXVsdCc7XG5cbnR5cGUgVGh5VHJlZVR5cGUgPSAnZGVmYXVsdCcgfCAnZXNwZWNpYWwnO1xuXG5jb25zdCB0cmVlVHlwZUNsYXNzTWFwID0ge1xuICAgIGRlZmF1bHQ6IFsndGh5LXRyZWUtZGVmYXVsdCddLFxuICAgIGVzcGVjaWFsOiBbJ3RoeS10cmVlLWVzcGVjaWFsJ11cbn07XG5cbmNvbnN0IHRyZWVJdGVtU2l6ZU1hcCA9IHtcbiAgICBkZWZhdWx0OiA0NCxcbiAgICBzbTogNDJcbn07XG5cbi8qKlxuICog5qCR5b2i5o6n5Lu257uE5Lu2XG4gKiBAbmFtZSB0aHktdHJlZVxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoeS10cmVlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaHlUcmVlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIWV9UUkVFX0FCU1RSQUNUX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGh5VHJlZSlcbiAgICAgICAgfSxcbiAgICAgICAgVGh5VHJlZVNlcnZpY2VcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBDZGtEcmFnLFxuICAgICAgICBDZGtEcm9wTGlzdCxcbiAgICAgICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxuICAgICAgICBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsLFxuICAgICAgICBDZGtWaXJ0dWFsRm9yT2YsXG4gICAgICAgIFRoeVRyZWVOb2RlQ29tcG9uZW50LFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgVGh5VHJlZU5vZGVEcmFnZ2FibGVQaXBlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaHlUcmVlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfZHJhZ2dhYmxlID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9leHBhbmRlZEtleXM6IChzdHJpbmcgfCBudW1iZXIpW107XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZEtleXM6IChzdHJpbmcgfCBudW1iZXIpW107XG5cbiAgICBwcml2YXRlIGhvc3RSZW5kZXJlciA9IHVzZUhvc3RSZW5kZXJlcigpO1xuXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoXzogYW55KSA9PiB7fTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgLy8g57yT5a2YIEVsZW1lbnQg5ZKMIERyYWdSZWYg55qE5YWz57O777yM5pa55L6/5ZyoIEl0ZW0g5ouW5Yqo5pe25p+l5om+XG4gICAgcHJpdmF0ZSBub2RlRHJhZ3NNYXAgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBDZGtEcmFnPFRoeVRyZWVOb2RlPj4oKTtcblxuICAgIHByaXZhdGUgbm9kZURyYWdNb3ZlZCA9IG5ldyBTdWJqZWN0PENka0RyYWdNb3ZlPigpO1xuXG4gICAgLy8gcHJpdmF0ZSBzdGFydERyYWdOb2RlRXhwYW5kZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHN0YXJ0RHJhZ05vZGVDbG9uZTogVGh5VHJlZU5vZGU7XG5cbiAgICAvLyBOb2RlIOaLluWKqOe7j+i/h+ebruagh+aXtuS4tOaXtuiusOW9leebruagh2lk5Lul5Y+K55u45a+55bqU55uu5qCH55qE5L2N572uXG4gICAgcHJpdmF0ZSBub2RlRHJvcFRhcmdldDoge1xuICAgICAgICBwb3NpdGlvbj86IFRoeVRyZWVEcm9wUG9zaXRpb247XG4gICAgICAgIGtleT86IG51bWJlciB8IHN0cmluZztcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkcm9wRW50ZXJQcmVkaWNhdGU/OiAoY29udGV4dDogeyBzb3VyY2U6IFRoeVRyZWVOb2RlOyB0YXJnZXQ6IFRoeVRyZWVOb2RlOyBkcm9wUG9zaXRpb246IFRoeVRyZWVEcm9wUG9zaXRpb24gfSkgPT4gYm9vbGVhbiA9XG4gICAgICAgIGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2hvd0V4cGFuZChjb250ZXh0LnRhcmdldCkgfHwgKCF0aGlzLmlzU2hvd0V4cGFuZChjb250ZXh0LnRhcmdldCkgJiYgY29udGV4dC5kcm9wUG9zaXRpb24gIT09IFRoeVRyZWVEcm9wUG9zaXRpb24uaW4pXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgcHVibGljIF9zZWxlY3Rpb25Nb2RlbDogU2VsZWN0aW9uTW9kZWw8VGh5VHJlZU5vZGU+O1xuXG4gICAgcHVibGljIGdldCB0cmVlTm9kZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeVRyZWVTZXJ2aWNlLnRyZWVOb2RlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZmxhdHRlblRyZWVOb2RlczogVGh5VHJlZU5vZGVbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICog6Jma5ouf5YyW5rua5Yqo55qE6KeG5Y+jXG4gICAgICovXG4gICAgQE91dHB1dCgpIEBWaWV3Q2hpbGQoJ3ZpZXdwb3J0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgICAvKipcbiAgICAgKiBUcmVlTm9kZSDlsZXnjrDmiYDpnIDnmoTmlbDmja5cbiAgICAgKiBAdHlwZSBUaHlUcmVlTm9kZURhdGFbXVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeU5vZGVzOiBUaHlUcmVlTm9kZURhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9riBUcmVlTm9kZSDmmK/lkKbmlK/mjIHlsZXlvIBcbiAgICAgKiBAdHlwZSBib29sZWFuIHwgRnVuY3Rpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlTaG93RXhwYW5kOiBib29sZWFuIHwgKChfOiBUaHlUcmVlTm9kZURhdGEpID0+IGJvb2xlYW4pID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9ruaYr+WQpuaUr+aMgeWkmumAieiKgueCuVxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZyhgY2xhc3MudGh5LW11bHRpcGxlLXNlbGVjdGlvbi1saXN0YClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KVxuICAgIHRoeU11bHRpcGxlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva4gVHJlZU5vZGUg5piv5ZCm5pSv5oyB5ouW5ou95o6S5bqPXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRoeS10cmVlLWRyYWdnYWJsZScpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSlcbiAgICBzZXQgdGh5RHJhZ2dhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCB0aHlEcmFnZ2FibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2FibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572uIFRyZWVOb2RlIOaYr+WQpuaUr+aMgSBDaGVja2JveCDpgInmi6lcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeUNoZWNrYWJsZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIOeCueWHu+iKgueCueeahOihjOS4uu+8jGBkZWZhdWx0YCDkuLrpgInkuK3lvZPliY3oioLngrnvvIxgc2VsZWN0Q2hlY2tib3hgIOS4uumAieS4reiKgueCueeahCBDaGVja2JveO+8jCBgdGh5Q2hlY2thYmxlYCDkuLogdHJ1ZSDml7bnlJ/mlYjjgIJcbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlDbGlja0JlaGF2aW9yOiBUaHlDbGlja0JlaGF2aW9yID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqXG4gICAgICog6K6+572uIGNoZWNrIOeKtuaAgeeahOiuoeeul+etlueVpVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCB0aHlDaGVja1N0YXRlUmVzb2x2ZShyZXNvbHZlOiAobm9kZTogVGh5VHJlZU5vZGUpID0+IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZSkge1xuICAgICAgICBpZiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5zZXRDaGVja1N0YXRlUmVzb2x2ZShyZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9riBUcmVlTm9kZSDmmK/lkKbmlK/mjIHlvILmraXliqDovb1cbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlBc3luYyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfdGh5VHlwZTogVGh5VHJlZVR5cGUgPSAnZGVmYXVsdCc7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7kuI3lkIzlsZXnpLrnsbvlnovnmoQgVHJlZe+8jGBkZWZhdWx0YCDkuLrlsI/nrq3lpLTlsZXnpLrvvIwgYGVzcGVjaWFsYCDkuLog5Yqg5YeP5Y+35Zu+5qCH5bGV56S6XG4gICAgICogQHR5cGUgVGh5VHJlZVR5cGVcbiAgICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgdGh5VHlwZSh0eXBlOiBUaHlUcmVlVHlwZSkge1xuICAgICAgICB0aGlzLl90aHlUeXBlID0gdHlwZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdlc3BlY2lhbCcpIHtcbiAgICAgICAgICAgIHRoaXMudGh5SWNvbnMgPSB7IGV4cGFuZDogJ21pbnVzLXNxdWFyZScsIGNvbGxhcHNlOiAncGx1cy1zcXVhcmUnIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgdGh5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RoeVR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u5LiN5ZCMIFRyZWUg5bGV5byA5oqY5Y+g55qE5Zu+5qCH77yMYGV4cGFuZGAg5Li65bGV5byA54q25oCB55qE5Zu+5qCH77yMYGNvbGxhcHNlYCDkuLrmipjlj6DnirbmgIHnmoTlm77moIdcbiAgICAgKiBAdHlwZSB7IGV4cGFuZDogc3RyaW5nLCBjb2xsYXBzZTogc3RyaW5nIH1cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlJY29uczogVGh5VHJlZUljb25zID0ge307XG5cbiAgICBwcml2YXRlIF90aHlTaXplOiBUaHlUcmVlU2l6ZSA9ICdkZWZhdWx0JztcbiAgICAvKipcbiAgICAgKiDmlK/mjIEgYHNtYCB8IGBkZWZhdWx0YCDkuKTnp43lpKflsI/vvIzpu5jorqTlgLzkuLogYGRlZmF1bHRgXG4gICAgICogQHR5cGUgVGh5VHJlZVNpemVcbiAgICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgdGh5U2l6ZShzaXplOiBUaHlUcmVlU2l6ZSkge1xuICAgICAgICB0aGlzLl90aHlTaXplID0gc2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuX3RoeVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RoeUl0ZW1TaXplID0gdHJlZUl0ZW1TaXplTWFwW3RoaXMuX3RoeVNpemVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdGh5SXRlbVNpemUgPSB0cmVlSXRlbVNpemVNYXAuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCB0aHlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGh5U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mmK/lkKblvIDlkK/omZrmi5/mu5rliqhcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRoeS12aXJ0dWFsLXNjcm9sbGluZy10cmVlJylcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KVxuICAgIHRoeVZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX3RoeUl0ZW1TaXplID0gNDQ7XG5cbiAgICAvKipcbiAgICAgKiDlvIDlkK/omZrmi5/mu5rliqjml7bvvIzljZXooYzoioLngrnnmoTpq5jluqbvvIzlvZNgdGh5U2l6ZWDkuLpgZGVmYXVsdGDml7bvvIzor6Xlj4LmlbDmiY3nlJ/mlYhcbiAgICAgKiBAZGVmYXVsdCA0NFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gICAgc2V0IHRoeUl0ZW1TaXplKGl0ZW1TaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudGh5U2l6ZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldHRpbmcgdGh5U2l6ZSBhbmQgdGh5SXRlbVNpemUgYXQgdGhlIHNhbWUgdGltZSBpcyBub3QgYWxsb3dlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RoeUl0ZW1TaXplID0gaXRlbVNpemU7XG4gICAgfVxuXG4gICAgZ2V0IHRoeUl0ZW1TaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGh5SXRlbVNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u6IqC54K55ZCN56ew5piv5ZCm5pSv5oyB6LaF5Ye65oiq5Y+WXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeVRpdGxlVHJ1bmNhdGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICog5bey6YCJ5Lit55qEIG5vZGUg6IqC54K56ZuG5ZCIXG4gICAgICogQGRlZmF1bHQgW11cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlTZWxlY3RlZEtleXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICog6K6+572u57yp6L+b6Led56a777yM57yp6L+b6Led56a7ID0gdGh5SW5kZW50ICogbm9kZS5sZXZlbFxuICAgICAqIEB0eXBlIG51bWJlclxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHRoeUluZGVudCA9IDI1O1xuXG4gICAgLyoqXG4gICAgICog5ouW5ou95LmL5YmN55qE5Zue6LCD77yM5Ye95pWw6L+U5ZueIGZhbHNlIOWImemYu+atouaLluaLvVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeUJlZm9yZURyYWdTdGFydDogKGNvbnRleHQ6IFRoeVRyZWVCZWZvcmVEcmFnU3RhcnRDb250ZXh0KSA9PiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICog5ouW5pS+5Yiw5YWD57Sg5pe25Zue6LCD77yM5Ye95pWw6L+U5ZueIGZhbHNlIOWImemYu+atouaLluaUvuWIsOW9k+WJjeWFg+e0oFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeUJlZm9yZURyYWdEcm9wOiAoY29udGV4dDogVGh5VHJlZUJlZm9yZURyYWdEcm9wQ29udGV4dCkgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIOiuvue9ruWtkCBUcmVlTm9kZSDngrnlh7vkuovku7ZcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5T25DbGljazogRXZlbnRFbWl0dGVyPFRoeVRyZWVFbWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUaHlUcmVlRW1pdEV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICog6K6+572uIGNoZWNrIOmAieaLqeS6i+S7tlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlPbkNoZWNrYm94Q2hhbmdlOiBFdmVudEVtaXR0ZXI8VGh5VHJlZUVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRoeVRyZWVFbWl0RXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7ngrnlh7vlsZXlvIDop6blj5Hkuovku7ZcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5T25FeHBhbmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUaHlUcmVlRW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGh5VHJlZUVtaXRFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9riBUcmVlTm9kZSDmi5bmi73kuovku7ZcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5T25EcmFnRHJvcDogRXZlbnRFbWl0dGVyPFRoeVRyZWVEcmFnRHJvcEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGh5VHJlZURyYWdEcm9wRXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDlj4zlh7sgVHJlZU5vZGUg5LqL5Lu2XG4gICAgICovXG4gICAgQE91dHB1dCgpIHRoeURibENsaWNrOiBFdmVudEVtaXR0ZXI8VGh5VHJlZUVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRoeVRyZWVFbWl0RXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva4gVHJlZU5vZGUg55qE5riy5p+T5qih5p2/XG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZCgndHJlZU5vZGVUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgc2V0IHRlbXBsYXRlUmVmKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCB0ZW1wbGF0ZVJlZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlUmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9ruWtkOeahOepuuaVsOaNrua4suafk+aooeadv1xuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoJ2VtcHR5Q2hpbGRyZW5UZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIGVtcHR5Q2hpbGRyZW5UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBzZXQgZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmID0gdGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MudGh5LXRyZWUnKVxuICAgIHRoeVRyZWVDbGFzcyA9IHRydWU7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRoeS10cmVlLWRyYWdnaW5nJylcbiAgICBkcmFnZ2luZzogYm9vbGVhbjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oQ2RrRHJhZykgY2RrRHJhZ3M6IFF1ZXJ5TGlzdDxDZGtEcmFnPFRoeVRyZWVOb2RlPj47XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGh5VHJlZVNlcnZpY2U6IFRoeVRyZWVTZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50KSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2luaXRUaHlOb2RlcygpO1xuICAgICAgICB0aGlzLl9zZXRUcmVlVHlwZSgpO1xuICAgICAgICB0aGlzLl9zZXRUcmVlU2l6ZSgpO1xuICAgICAgICB0aGlzLl9pbnN0YW5jZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdFRyZWVOb2Rlcyh0aGlzLnRoeVNlbGVjdGVkS2V5cyk7XG5cbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5mbGF0dGVuTm9kZXMkLnN1YnNjcmliZShmbGF0dGVuVHJlZU5vZGVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmxhdHRlblRyZWVOb2RlcyA9IGZsYXR0ZW5UcmVlTm9kZXM7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNka0RyYWdzLmNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aCh0aGlzLmNka0RyYWdzKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZHJhZ3M6IFF1ZXJ5TGlzdDxDZGtEcmFnPFRoeVRyZWVOb2RlPj4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVEcmFnc01hcC5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGRyYWdzLmZvckVhY2goZHJhZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcmFnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNka0RyYWcg5Y+Y5YyW5pe277yM57yT5a2YIEVsZW1lbnQg5LiOIERyYWdSZWYg55qE5YWz57O777yM5pa55L6/IERyYWcgTW92ZSDml7bmn6Xmib5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZURyYWdzTWFwLnNldChkcmFnLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgZHJhZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubm9kZURyYWdNb3ZlZFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gYXVkaXRUaW1lKDMwKSxcbiAgICAgICAgICAgICAgICAvLyAgYXVkaXRUaW1lIOWPr+iDveS8muWvvOiHtOaLluWKqOe7k+adn+WQjuS7jeeEtuaJp+ihjCBtb3ZlZCDvvIzmiYDku6XpgJrov4fliKTmlq0gZHJhZ2dpbmcg54q25oCB5p2l6L+H5ruk5peg5pWIIG1vdmVkXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldmVudDogQ2RrRHJhZ01vdmUpID0+IGV2ZW50LnNvdXJjZS5fZHJhZ1JlZi5pc0RyYWdnaW5nKCkpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdNb3ZlZChldmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnRoeU5vZGVzICYmICFjaGFuZ2VzLnRoeU5vZGVzLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdFRoeU5vZGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXMudGh5VHlwZSAmJiAhY2hhbmdlcy50aHlUeXBlLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VHJlZVR5cGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy50aHlNdWx0aXBsZSAmJiAhY2hhbmdlcy50aHlNdWx0aXBsZS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLnRoeVNlbGVjdGVkS2V5cyAmJiAhY2hhbmdlcy50aHlTZWxlY3RlZEtleXMuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEtleXMgPSBjaGFuZ2VzLnRoeVNlbGVjdGVkS2V5cy5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RUcmVlTm9kZXMoY2hhbmdlcy50aHlTZWxlY3RlZEtleXMuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlclZpZXcgPSAoKSA9PiB7fTtcblxuICAgIGV2ZW50VHJpZ2dlckNoYW5nZWQoZXZlbnQ6IFRoeVRyZWVFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5ldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2V4cGFuZCc6XG4gICAgICAgICAgICAgICAgdGhpcy50aHlPbkV4cGFuZENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3hDaGFuZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMudGh5T25DaGVja2JveENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRUaHlOb2RlcygpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRLZXlzID0gdGhpcy5nZXRFeHBhbmRlZE5vZGVzKCkubWFwKG5vZGUgPT4gbm9kZS5rZXkpO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEtleXMgPSB0aGlzLmdldFNlbGVjdGVkTm9kZXMoKS5tYXAobm9kZSA9PiBub2RlLmtleSk7XG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuaW5pdGlhbGl6ZVRyZWVOb2Rlcyh0aGlzLnRoeU5vZGVzKTtcbiAgICAgICAgdGhpcy5mbGF0dGVuVHJlZU5vZGVzID0gdGhpcy50aHlUcmVlU2VydmljZS5mbGF0dGVuVHJlZU5vZGVzO1xuICAgICAgICB0aGlzLl9zZWxlY3RUcmVlTm9kZXModGhpcy5fc2VsZWN0ZWRLZXlzKTtcbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5leHBhbmRUcmVlTm9kZXModGhpcy5fZXhwYW5kZWRLZXlzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRUcmVlVHlwZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudGh5VHlwZSAmJiB0cmVlVHlwZUNsYXNzTWFwW3RoaXMudGh5VHlwZV0pIHtcbiAgICAgICAgICAgIHRyZWVUeXBlQ2xhc3NNYXBbdGhpcy50aHlUeXBlXS5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0UmVuZGVyZXIuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0VHJlZVNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnRoeVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuaG9zdFJlbmRlcmVyLmFkZENsYXNzKGB0aHktdHJlZS0ke3RoaXMudGh5U2l6ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2luc3RhbmNlU2VsZWN0aW9uTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy50aHlNdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VsZWN0VHJlZU5vZGVzKGtleXM6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICAgICAgKGtleXMgfHwgW10pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnRoeVRyZWVTZXJ2aWNlLmdldFRyZWVOb2RlKGtleSk7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VHJlZU5vZGUodGhpcy50aHlUcmVlU2VydmljZS5nZXRUcmVlTm9kZShrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNTZWxlY3RlZChub2RlOiBUaHlUcmVlTm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChub2RlKTtcbiAgICB9XG5cbiAgICB0b2dnbGVUcmVlTm9kZShub2RlOiBUaHlUcmVlTm9kZSkge1xuICAgICAgICBpZiAobm9kZSAmJiAhbm9kZS5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGUobm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5Rm4oaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSB7XG4gICAgICAgIHJldHVybiBpdGVtLmtleSB8fCBpbmRleDtcbiAgICB9XG5cbiAgICBpc1Nob3dFeHBhbmQobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICAgICAgaWYgKGhlbHBlcnMuaXNGdW5jdGlvbih0aGlzLnRoeVNob3dFeHBhbmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMudGh5U2hvd0V4cGFuZCBhcyBGdW5jdGlvbikobm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHlTaG93RXhwYW5kO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogVGh5VHJlZU5vZGVEYXRhW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRoeU5vZGVzID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9pbml0VGh5Tm9kZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgb25EcmFnU3RhcnRlZChldmVudDogQ2RrRHJhZ1N0YXJ0PFRoeVRyZWVOb2RlPikge1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGFydERyYWdOb2RlQ2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudC5zb3VyY2UuZGF0YSk7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UuZGF0YS5pc0V4cGFuZGVkKSB7XG4gICAgICAgICAgICBldmVudC5zb3VyY2UuZGF0YS5zZXRFeHBhbmRlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbWl0RHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZSkge1xuICAgICAgICB0aGlzLm5vZGVEcmFnTW92ZWQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgb25EcmFnTW92ZWQoZXZlbnQ6IENka0RyYWdNb3ZlPFRoeVRyZWVOb2RlPikge1xuICAgICAgICAvLyDpgJrov4fpvKDmoIfkvY3nva7mn6Xmib7lr7nlupTnmoTnm67moIcgSXRlbSDlhYPntKBcbiAgICAgICAgbGV0IGN1cnJlbnRQb2ludEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZlbnQucG9pbnRlclBvc2l0aW9uLngsIGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFjdXJyZW50UG9pbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBEcmFnQXJ0aWZhY3RzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRhcmdldEVsZW1lbnQgPSBjdXJyZW50UG9pbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygndGh5LXRyZWUtbm9kZScpXG4gICAgICAgICAgICA/IGN1cnJlbnRQb2ludEVsZW1lbnRcbiAgICAgICAgICAgIDogKGN1cnJlbnRQb2ludEVsZW1lbnQuY2xvc2VzdCgnLnRoeS10cmVlLW5vZGUnKSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIOe8k+WtmOaUvue9ruebruagh0lkIOW5tuiuoeeul+m8oOagh+ebuOWvueW6lOeahOS9jee9rlxuICAgICAgICB0aGlzLm5vZGVEcm9wVGFyZ2V0ID0ge1xuICAgICAgICAgICAga2V5OiB0aGlzLm5vZGVEcmFnc01hcC5nZXQodGFyZ2V0RWxlbWVudCk/LmRhdGEua2V5LFxuICAgICAgICAgICAgcG9zaXRpb246IHRoaXMuZ2V0VGFyZ2V0UG9zaXRpb24odGFyZ2V0RWxlbWVudCwgZXZlbnQpXG4gICAgICAgIH07XG4gICAgICAgIC8vIOaJp+ihjOWklumDqOS8oOWFpeeahCBkcm9wRW50ZXJQcmVkaWNhdGUg5Yik5pat5piv5ZCm5YWB6K645ouW5YWl55uu5qCH6aG5XG4gICAgICAgIGlmICh0aGlzLmRyb3BFbnRlclByZWRpY2F0ZSkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RHJhZ1JlZiA9IHRoaXMubm9kZURyYWdzTWFwLmdldCh0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BFbnRlclByZWRpY2F0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXZlbnQuc291cmNlLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0RHJhZ1JlZi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBkcm9wUG9zaXRpb246IHRoaXMubm9kZURyb3BUYXJnZXQucG9zaXRpb25cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZURyb3BUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Ryb3BQb3NpdGlvblBsYWNlaG9sZGVyKHRhcmdldEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EcmFnRW5kZWQoZXZlbnQ6IENka0RyYWdFbmQ8VGh5VHJlZU5vZGU+KSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8g5ouW5ou957uT5p2f5ZCO5oGi5aSN5Y6f5aeL55qE5bGV5byA54q25oCBXG4gICAgICAgIGV2ZW50LnNvdXJjZS5kYXRhLnNldEV4cGFuZGVkKHRoaXMuc3RhcnREcmFnTm9kZUNsb25lLmlzRXhwYW5kZWQpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnTm9kZUNsb25lID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25MaXN0RHJvcHBlZChldmVudDogQ2RrRHJhZ0Ryb3A8VGh5VHJlZU5vZGVbXSwgVGh5VHJlZU5vZGVbXSwgVGh5VHJlZU5vZGU+KSB7XG4gICAgICAgIGlmICghdGhpcy5ub2RlRHJvcFRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1Nob3dFeHBhbmQodGhpcy5zdGFydERyYWdOb2RlQ2xvbmUpICYmIHRoaXMubm9kZURyb3BUYXJnZXQucG9zaXRpb24gPT09IFRoeVRyZWVEcm9wUG9zaXRpb24uaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSB0aGlzLnN0YXJ0RHJhZ05vZGVDbG9uZTtcbiAgICAgICAgY29uc3Qgc291cmNlTm9kZVBhcmVudCA9IHNvdXJjZU5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0RHJhZ1JlZiA9IHRoaXMuY2RrRHJhZ3MuZmluZChpdGVtID0+IGl0ZW0uZGF0YT8ua2V5ID09PSB0aGlzLm5vZGVEcm9wVGFyZ2V0LmtleSk7XG4gICAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0YXJnZXREcmFnUmVmPy5kYXRhO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlUGFyZW50ID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgIGNvbnN0IGJlZm9yZURyYWdEcm9wQ29udGV4dDogVGh5VHJlZUJlZm9yZURyYWdEcm9wQ29udGV4dCA9IHtcbiAgICAgICAgICAgIHByZXZpb3VzSXRlbTogc291cmNlTm9kZSxcbiAgICAgICAgICAgIHByZXZpb3VzQ29udGFpbmVySXRlbXM6IHNvdXJjZU5vZGVQYXJlbnQ/LmNoaWxkcmVuLFxuICAgICAgICAgICAgaXRlbTogdGFyZ2V0Tm9kZSxcbiAgICAgICAgICAgIGNvbnRhaW5lckl0ZW1zOiB0YXJnZXROb2RlUGFyZW50Py5jaGlsZHJlbixcbiAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLm5vZGVEcm9wVGFyZ2V0LnBvc2l0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMudGh5QmVmb3JlRHJhZ0Ryb3AgJiYgIXRoaXMudGh5QmVmb3JlRHJhZ0Ryb3AoYmVmb3JlRHJhZ0Ryb3BDb250ZXh0KSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5kZWxldGVUcmVlTm9kZShzb3VyY2VOb2RlKTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMubm9kZURyb3BUYXJnZXQucG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2JlZm9yZSc6XG4gICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlSW5zZXJ0SW5kZXggPSAodGFyZ2V0Tm9kZVBhcmVudD8uY2hpbGRyZW4gfHwgdGhpcy50cmVlTm9kZXMpLmluZGV4T2YodGFyZ2V0Tm9kZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5hZGRUcmVlTm9kZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlUGFyZW50LCBiZWZvcmVJbnNlcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhZnRlcic6XG4gICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJJbnNlcnRJbmRleCA9ICh0YXJnZXROb2RlUGFyZW50Py5jaGlsZHJlbiB8fCB0aGlzLnRyZWVOb2RlcykuaW5kZXhPZih0YXJnZXROb2RlKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5hZGRUcmVlTm9kZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlUGFyZW50LCBhZnRlckluc2VydEluZGV4KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2luJzpcbiAgICAgICAgICAgICAgICB0aGlzLnRoeVRyZWVTZXJ2aWNlLmFkZFRyZWVOb2RlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuXG4gICAgICAgIGxldCBhZnRlcjogVGh5VHJlZU5vZGUgPSBudWxsO1xuICAgICAgICBsZXQgdGFyZ2U6IFRoeVRyZWVOb2RlID0gbnVsbDtcbiAgICAgICAgaWYgKGJlZm9yZURyYWdEcm9wQ29udGV4dC5wb3NpdGlvbiA9PT0gVGh5VHJlZURyb3BQb3NpdGlvbi5iZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lck5vZGVzID0gdGFyZ2V0Tm9kZVBhcmVudD8uY2hpbGRyZW4gfHwgdGhpcy50cmVlTm9kZXM7XG4gICAgICAgICAgICBhZnRlciA9IHRhcmdldENvbnRhaW5lck5vZGVzW3RhcmdldENvbnRhaW5lck5vZGVzLmluZGV4T2YodGFyZ2V0Tm9kZSkgLSAyXTtcbiAgICAgICAgICAgIHRhcmdlID0gdGFyZ2V0Tm9kZVBhcmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChiZWZvcmVEcmFnRHJvcENvbnRleHQucG9zaXRpb24gPT09IFRoeVRyZWVEcm9wUG9zaXRpb24uYWZ0ZXIpIHtcbiAgICAgICAgICAgIGFmdGVyID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgICAgIHRhcmdlID0gdGFyZ2V0Tm9kZVBhcmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFmdGVyID0gdGFyZ2V0Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoID4gMCA/IHRhcmdldE5vZGUuY2hpbGRyZW5bdGFyZ2V0Tm9kZS5jaGlsZHJlbi5sZW5ndGggLSAyXSA6IG51bGw7XG4gICAgICAgICAgICB0YXJnZSA9IHRhcmdldE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRoeU9uRHJhZ0Ryb3AuZW1pdCh7XG4gICAgICAgICAgICBkcmFnTm9kZTogdGhpcy50aHlUcmVlU2VydmljZS5nZXRUcmVlTm9kZShzb3VyY2VOb2RlLmtleSksXG4gICAgICAgICAgICB0YXJnZXROb2RlOiB0YXJnZSxcbiAgICAgICAgICAgIGFmdGVyTm9kZTogYWZ0ZXJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VGFyZ2V0UG9zaXRpb24odGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IENka0RyYWdNb3ZlKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZU9yQWZ0ZXJHYXAgPSB0YXJnZXRSZWN0LmhlaWdodCAqIDAuMztcbiAgICAgICAgLy8g5bCGIE5vZGUg6auY5bqm5YiG5Li65LiK5Lit5LiL5LiJ5q6177yM5YW25Lit5LiK5LiL55qEIEdhcCDkuLogaGVpZ2h0IOeahCAzMCXvvIzpgJrov4fliKTmlq3pvKDmoIfkvY3nva7lnKjlk6rkuIDmrrUgZ2FwIOadpeiuoeeul+WvueW6lOeahOS9jee9rlxuICAgICAgICBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgLSB0YXJnZXRSZWN0LnRvcCA8IGJlZm9yZU9yQWZ0ZXJHYXApIHtcbiAgICAgICAgICAgIHJldHVybiBUaHlUcmVlRHJvcFBvc2l0aW9uLmJlZm9yZTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5wb2ludGVyUG9zaXRpb24ueSA+PSB0YXJnZXRSZWN0LmJvdHRvbSAtIGJlZm9yZU9yQWZ0ZXJHYXApIHtcbiAgICAgICAgICAgIHJldHVybiBUaHlUcmVlRHJvcFBvc2l0aW9uLmFmdGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFRoeVRyZWVEcm9wUG9zaXRpb24uaW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dEcm9wUG9zaXRpb25QbGFjZWhvbGRlcih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLmNsZWFudXBEcm9wUG9zaXRpb25QbGFjZWhvbGRlcigpO1xuICAgICAgICBpZiAodGhpcy5ub2RlRHJvcFRhcmdldCAmJiB0YXJnZXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoYGRyb3AtcG9zaXRpb24tJHt0aGlzLm5vZGVEcm9wVGFyZ2V0LnBvc2l0aW9ufWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbnVwRHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIoKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3AtcG9zaXRpb24tYmVmb3JlJykuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcC1wb3NpdGlvbi1iZWZvcmUnKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyb3AtcG9zaXRpb24tYWZ0ZXInKS5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkcm9wLXBvc2l0aW9uLWFmdGVyJykpO1xuICAgICAgICB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLXBvc2l0aW9uLWluJykuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcC1wb3NpdGlvbi1pbicpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFudXBEcmFnQXJ0aWZhY3RzKCkge1xuICAgICAgICB0aGlzLm5vZGVEcm9wVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGVhbnVwRHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICAvLyByZWdpb24gUHVibGljIEZ1bmN0aW9uc1xuXG4gICAgc2VsZWN0VHJlZU5vZGUobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgIW5vZGUuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Um9vdE5vZGVzKCk6IFRoeVRyZWVOb2RlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy50cmVlTm9kZXM7XG4gICAgfVxuXG4gICAgZ2V0VHJlZU5vZGUoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh5VHJlZVNlcnZpY2UuZ2V0VHJlZU5vZGUoa2V5KTtcbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZE5vZGUoKTogVGh5VHJlZU5vZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwgPyB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0ZWROb2RlcygpOiBUaHlUcmVlTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQgOiBbXTtcbiAgICB9XG5cbiAgICBnZXRFeHBhbmRlZE5vZGVzKCk6IFRoeVRyZWVOb2RlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlUcmVlU2VydmljZS5nZXRFeHBhbmRlZE5vZGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0Q2hlY2tlZE5vZGVzKCk6IFRoeVRyZWVOb2RlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy50aHlUcmVlU2VydmljZS5nZXRDaGVja2VkTm9kZXMoKTtcbiAgICB9XG5cbiAgICBhZGRUcmVlTm9kZShub2RlOiBUaHlUcmVlTm9kZURhdGEsIHBhcmVudD86IFRoeVRyZWVOb2RlLCBpbmRleCA9IC0xKSB7XG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuYWRkVHJlZU5vZGUobmV3IFRoeVRyZWVOb2RlKG5vZGUsIG51bGwsIHRoaXMudGh5VHJlZVNlcnZpY2UpLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuICAgIH1cblxuICAgIGRlbGV0ZVRyZWVOb2RlKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQobm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRoeVRyZWVTZXJ2aWNlLmRlbGV0ZVRyZWVOb2RlKG5vZGUpO1xuICAgICAgICB0aGlzLnRoeVRyZWVTZXJ2aWNlLnN5bmNGbGF0dGVuVHJlZU5vZGVzKCk7XG4gICAgfVxuXG4gICAgZXhwYW5kQWxsTm9kZXMoKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5nZXRSb290Tm9kZXMoKTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaChuID0+IG4uc2V0RXhwYW5kZWQodHJ1ZSwgdHJ1ZSkpO1xuICAgIH1cblxuICAgIGNvbGxhcHNlZEFsbE5vZGVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuZ2V0Um9vdE5vZGVzKCk7XG4gICAgICAgIG5vZGVzLmZvckVhY2gobiA9PiBuLnNldEV4cGFuZGVkKGZhbHNlLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLy8gZW5kcmVnaW9uXG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICN2aWV3cG9ydFxuICAqbmdJZj1cInRoeVZpcnR1YWxTY3JvbGxcIlxuICBbaXRlbVNpemVdPVwidGh5SXRlbVNpemVcIlxuICBbc3R5bGUuaGVpZ2h0XT1cIicxMDAlJ1wiXG4gIGNka0Ryb3BMaXN0XG4gIFtjZGtEcm9wTGlzdEF1dG9TY3JvbGxTdGVwXT1cIjZcIlxuICBbY2RrRHJvcExpc3REYXRhXT1cImZsYXR0ZW5UcmVlTm9kZXNcIlxuICBbY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWRdPVwidHJ1ZVwiXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25MaXN0RHJvcHBlZCgkZXZlbnQpXCJcbiAgPlxuICA8ZGl2IGNsYXNzPVwidmlydHVhbC10cmVlcy1jb250YWluZXJcIj5cbiAgICA8dGh5LXRyZWUtbm9kZVxuICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm9kZSBvZiBmbGF0dGVuVHJlZU5vZGVzOyB0cmFja0J5OiB0cmFja0J5Rm47IGxldCBpID0gaW5kZXhcIlxuICAgICAgY2RrRHJhZ1xuICAgICAgW2Nka0RyYWdEYXRhXT1cIm5vZGVcIlxuICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCIhdGh5RHJhZ2dhYmxlIHx8ICEobm9kZSB8IHRyZWVOb2RlRHJhZ2dhYmxlIDogdGh5QmVmb3JlRHJhZ1N0YXJ0KVwiXG4gICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwib25EcmFnU3RhcnRlZCgkZXZlbnQpXCJcbiAgICAgIChjZGtEcmFnRW5kZWQpPVwib25EcmFnRW5kZWQoJGV2ZW50KVwiXG4gICAgICAoY2RrRHJhZ01vdmVkKT1cImVtaXREcmFnTW92ZWQoJGV2ZW50KVwiXG4gICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgIFt0ZW1wbGF0ZVJlZl09XCJ0ZW1wbGF0ZVJlZlwiXG4gICAgICBbZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmXT1cImVtcHR5Q2hpbGRyZW5UZW1wbGF0ZVwiXG4gICAgICBbdGh5QXN5bmNdPVwidGh5QXN5bmNcIlxuICAgICAgW3RoeURyYWdnYWJsZV09XCJ0aHlEcmFnZ2FibGVcIlxuICAgICAgW3RoeUNoZWNrYWJsZV09XCJ0aHlDaGVja2FibGVcIlxuICAgICAgW3RoeU11bHRpcGxlXT1cInRoeU11bHRpcGxlXCJcbiAgICAgIFt0aHlDbGlja0JlaGF2aW9yXT1cInRoeUNsaWNrQmVoYXZpb3JcIlxuICAgICAgW3RoeVRpdGxlVHJ1bmNhdGVdPVwidGh5VGl0bGVUcnVuY2F0ZVwiXG4gICAgICBbdGh5SXRlbVNpemVdPVwidGh5SXRlbVNpemVcIlxuICAgICAgW3RoeUluZGVudF09XCJ0aHlJbmRlbnRcIlxuICAgICAgKHRoeU9uQ2xpY2spPVwidGh5T25DbGljay5lbWl0KCRldmVudClcIlxuICAgICAgKHRoeURibENsaWNrKT1cInRoeURibENsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAodGh5T25FeHBhbmRDaGFuZ2UpPVwiZXZlbnRUcmlnZ2VyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICh0aHlPbkNoZWNrYm94Q2hhbmdlKT1cImV2ZW50VHJpZ2dlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgIDwvdGh5LXRyZWUtbm9kZT5cbiAgPC9kaXY+XG48L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuPGRpdlxuICAqbmdJZj1cIiF0aHlWaXJ0dWFsU2Nyb2xsXCJcbiAgY2RrRHJvcExpc3RcbiAgW2Nka0Ryb3BMaXN0QXV0b1Njcm9sbFN0ZXBdPVwiNlwiXG4gIFtjZGtEcm9wTGlzdERhdGFdPVwiZmxhdHRlblRyZWVOb2Rlc1wiXG4gIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcbiAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkxpc3REcm9wcGVkKCRldmVudClcIj5cbiAgPHRoeS10cmVlLW5vZGVcbiAgICAqbmdGb3I9XCJsZXQgbm9kZSBvZiBmbGF0dGVuVHJlZU5vZGVzOyB0cmFja0J5OiB0cmFja0J5Rm47IGxldCBpID0gaW5kZXhcIlxuICAgIGNka0RyYWdcbiAgICBbY2RrRHJhZ0RhdGFdPVwibm9kZVwiXG4gICAgW2Nka0RyYWdEaXNhYmxlZF09XCIhdGh5RHJhZ2dhYmxlIHx8ICEobm9kZSB8IHRyZWVOb2RlRHJhZ2dhYmxlIDogdGh5QmVmb3JlRHJhZ1N0YXJ0KVwiXG4gICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgKGNka0RyYWdFbmRlZCk9XCJvbkRyYWdFbmRlZCgkZXZlbnQpXCJcbiAgICAoY2RrRHJhZ01vdmVkKT1cImVtaXREcmFnTW92ZWQoJGV2ZW50KVwiXG4gICAgW25vZGVdPVwibm9kZVwiXG4gICAgW3RlbXBsYXRlUmVmXT1cInRlbXBsYXRlUmVmXCJcbiAgICBbZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmXT1cImVtcHR5Q2hpbGRyZW5UZW1wbGF0ZVwiXG4gICAgW3RoeUFzeW5jXT1cInRoeUFzeW5jXCJcbiAgICBbdGh5RHJhZ2dhYmxlXT1cInRoeURyYWdnYWJsZVwiXG4gICAgW3RoeUNoZWNrYWJsZV09XCJ0aHlDaGVja2FibGVcIlxuICAgIFt0aHlNdWx0aXBsZV09XCJ0aHlNdWx0aXBsZVwiXG4gICAgW3RoeVRpdGxlVHJ1bmNhdGVdPVwidGh5VGl0bGVUcnVuY2F0ZVwiXG4gICAgW3RoeUl0ZW1TaXplXT1cInRoeUl0ZW1TaXplXCJcbiAgICBbdGh5Q2xpY2tCZWhhdmlvcl09XCJ0aHlDbGlja0JlaGF2aW9yXCJcbiAgICBbdGh5SW5kZW50XT1cInRoeUluZGVudFwiXG4gICAgKHRoeU9uQ2xpY2spPVwidGh5T25DbGljay5lbWl0KCRldmVudClcIlxuICAgICh0aHlEYmxDbGljayk9XCJ0aHlEYmxDbGljay5lbWl0KCRldmVudClcIlxuICAgICh0aHlPbkV4cGFuZENoYW5nZSk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICh0aHlPbkNoZWNrYm94Q2hhbmdlKT1cInRoeU9uQ2hlY2tib3hDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gIDwvdGh5LXRyZWUtbm9kZT5cbjwvZGl2PlxuIl19
654
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJlZS90cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy90cmVlL3RyZWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlHLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBSWYsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsRUFDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBS0gsbUJBQW1CLEVBRW5CLFlBQVksRUFHZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxF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cnR5LCBoZWxwZXJzIH0gZnJvbSAnbmd4LXRldGh5cy91dGlsJztcbmltcG9ydCB7IHVzZUhvc3RSZW5kZXJlciB9IGZyb20gJ0B0ZXRoeXMvY2RrL2RvbSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwsIENka1ZpcnR1YWxGb3JPZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIG51bWJlckF0dHJpYnV0ZSxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRIWV9UUkVFX0FCU1RSQUNUX1RPS0VOIH0gZnJvbSAnLi90cmVlLWFic3RyYWN0JztcbmltcG9ydCB7IFRoeVRyZWVOb2RlIH0gZnJvbSAnLi90cmVlLW5vZGUuY2xhc3MnO1xuaW1wb3J0IHtcbiAgICBUaHlUcmVlQmVmb3JlRHJhZ0Ryb3BDb250ZXh0LFxuICAgIFRoeVRyZWVCZWZvcmVEcmFnU3RhcnRDb250ZXh0LFxuICAgIFRoeUNsaWNrQmVoYXZpb3IsXG4gICAgVGh5VHJlZURyYWdEcm9wRXZlbnQsXG4gICAgVGh5VHJlZURyb3BQb3NpdGlvbixcbiAgICBUaHlUcmVlRW1pdEV2ZW50LFxuICAgIFRoeVRyZWVJY29ucyxcbiAgICBUaHlUcmVlTm9kZUNoZWNrU3RhdGUsXG4gICAgVGh5VHJlZU5vZGVEYXRhXG59IGZyb20gJy4vdHJlZS5jbGFzcyc7XG5pbXBvcnQgeyBUaHlUcmVlU2VydmljZSB9IGZyb20gJy4vdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRoeVRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi90cmVlLW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IE5nSWYsIE5nRm9yLCBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJhZ0VuZCwgQ2RrRHJhZ01vdmUsIENka0RyYWdTdGFydCwgQ2RrRHJvcExpc3QgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgZmlsdGVyLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRoeVRyZWVOb2RlRHJhZ2dhYmxlUGlwZSB9IGZyb20gJy4vdHJlZS5waXBlJztcblxudHlwZSBUaHlUcmVlU2l6ZSA9ICdzbScgfCAnZGVmYXVsdCc7XG5cbnR5cGUgVGh5VHJlZVR5cGUgPSAnZGVmYXVsdCcgfCAnZXNwZWNpYWwnO1xuXG5jb25zdCB0cmVlVHlwZUNsYXNzTWFwID0ge1xuICAgIGRlZmF1bHQ6IFsndGh5LXRyZWUtZGVmYXVsdCddLFxuICAgIGVzcGVjaWFsOiBbJ3RoeS10cmVlLWVzcGVjaWFsJ11cbn07XG5cbmNvbnN0IHRyZWVJdGVtU2l6ZU1hcCA9IHtcbiAgICBkZWZhdWx0OiA0NCxcbiAgICBzbTogNDJcbn07XG5cbi8qKlxuICog5qCR5b2i5o6n5Lu257uE5Lu2XG4gKiBAbmFtZSB0aHktdHJlZVxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoeS10cmVlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaHlUcmVlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIWV9UUkVFX0FCU1RSQUNUX1RPS0VOLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGh5VHJlZSlcbiAgICAgICAgfSxcbiAgICAgICAgVGh5VHJlZVNlcnZpY2VcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBDZGtEcmFnLFxuICAgICAgICBDZGtEcm9wTGlzdCxcbiAgICAgICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxuICAgICAgICBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsLFxuICAgICAgICBDZGtWaXJ0dWFsRm9yT2YsXG4gICAgICAgIFRoeVRyZWVOb2RlQ29tcG9uZW50LFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgVGh5VHJlZU5vZGVEcmFnZ2FibGVQaXBlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaHlUcmVlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfZW1wdHlDaGlsZHJlblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfZHJhZ2dhYmxlID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIF9leHBhbmRlZEtleXM6IChzdHJpbmcgfCBudW1iZXIpW107XG5cbiAgICBwcml2YXRlIF9zZWxlY3RlZEtleXM6IChzdHJpbmcgfCBudW1iZXIpW107XG5cbiAgICBwcml2YXRlIGhvc3RSZW5kZXJlciA9IHVzZUhvc3RSZW5kZXJlcigpO1xuXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoXzogYW55KSA9PiB7fTtcblxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgLy8g57yT5a2YIEVsZW1lbnQg5ZKMIERyYWdSZWYg55qE5YWz57O777yM5pa55L6/5ZyoIEl0ZW0g5ouW5Yqo5pe25p+l5om+XG4gICAgcHJpdmF0ZSBub2RlRHJhZ3NNYXAgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCBDZGtEcmFnPFRoeVRyZWVOb2RlPj4oKTtcblxuICAgIHByaXZhdGUgbm9kZURyYWdNb3ZlZCA9IG5ldyBTdWJqZWN0PENka0RyYWdNb3ZlPigpO1xuXG4gICAgLy8gcHJpdmF0ZSBzdGFydERyYWdOb2RlRXhwYW5kZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHN0YXJ0RHJhZ05vZGVDbG9uZTogVGh5VHJlZU5vZGU7XG5cbiAgICAvLyBOb2RlIOaLluWKqOe7j+i/h+ebruagh+aXtuS4tOaXtuiusOW9leebruagh2lk5Lul5Y+K55u45a+55bqU55uu5qCH55qE5L2N572uXG4gICAgcHJpdmF0ZSBub2RlRHJvcFRhcmdldDoge1xuICAgICAgICBwb3NpdGlvbj86IFRoeVRyZWVEcm9wUG9zaXRpb247XG4gICAgICAgIGtleT86IG51bWJlciB8IHN0cmluZztcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkcm9wRW50ZXJQcmVkaWNhdGU/OiAoY29udGV4dDogeyBzb3VyY2U6IFRoeVRyZWVOb2RlOyB0YXJnZXQ6IFRoeVRyZWVOb2RlOyBkcm9wUG9zaXRpb246IFRoeVRyZWVEcm9wUG9zaXRpb24gfSkgPT4gYm9vbGVhbiA9XG4gICAgICAgIGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2hvd0V4cGFuZChjb250ZXh0LnRhcmdldCkgfHwgKCF0aGlzLmlzU2hvd0V4cGFuZChjb250ZXh0LnRhcmdldCkgJiYgY29udGV4dC5kcm9wUG9zaXRpb24gIT09IFRoeVRyZWVEcm9wUG9zaXRpb24uaW4pXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgcHVibGljIF9zZWxlY3Rpb25Nb2RlbDogU2VsZWN0aW9uTW9kZWw8VGh5VHJlZU5vZGU+O1xuXG4gICAgcHVibGljIGdldCB0cmVlTm9kZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeVRyZWVTZXJ2aWNlLnRyZWVOb2RlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZmxhdHRlblRyZWVOb2RlczogVGh5VHJlZU5vZGVbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICog6Jma5ouf5YyW5rua5Yqo55qE6KeG5Y+jXG4gICAgICovXG4gICAgQE91dHB1dCgpIEBWaWV3Q2hpbGQoJ3ZpZXdwb3J0JywgeyBzdGF0aWM6IGZhbHNlIH0pIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgICAvKipcbiAgICAgKiBUcmVlTm9kZSDlsZXnjrDmiYDpnIDnmoTmlbDmja5cbiAgICAgKiBAdHlwZSBUaHlUcmVlTm9kZURhdGFbXVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHRoeU5vZGVzOiBUaHlUcmVlTm9kZURhdGFbXTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9riBUcmVlTm9kZSDmmK/lkKbmlK/mjIHlsZXlvIBcbiAgICAgKiBAdHlwZSBib29sZWFuIHwgRnVuY3Rpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlTaG93RXhwYW5kOiBib29sZWFuIHwgKChfOiBUaHlUcmVlTm9kZURhdGEpID0+IGJvb2xlYW4pID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9ruaYr+WQpuaUr+aMgeWkmumAieiKgueCuVxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZyhgY2xhc3MudGh5LW11bHRpcGxlLXNlbGVjdGlvbi1saXN0YClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KVxuICAgIHRoeU11bHRpcGxlID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva4gVHJlZU5vZGUg5piv5ZCm5pSv5oyB5ouW5ou95o6S5bqPXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRoeS10cmVlLWRyYWdnYWJsZScpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSlcbiAgICBzZXQgdGh5RHJhZ2dhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCB0aHlEcmFnZ2FibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2FibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572uIFRyZWVOb2RlIOaYr+WQpuaUr+aMgSBDaGVja2JveCDpgInmi6lcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeUNoZWNrYWJsZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIOeCueWHu+iKgueCueeahOihjOS4uu+8jGBkZWZhdWx0YCDkuLrpgInkuK3lvZPliY3oioLngrnvvIxgc2VsZWN0Q2hlY2tib3hgIOS4uumAieS4reiKgueCueeahCBDaGVja2JveO+8jCBgdGh5Q2hlY2thYmxlYCDkuLogdHJ1ZSDml7bnlJ/mlYjjgIJcbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlDbGlja0JlaGF2aW9yOiBUaHlDbGlja0JlaGF2aW9yID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqXG4gICAgICog6K6+572uIGNoZWNrIOeKtuaAgeeahOiuoeeul+etlueVpVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCB0aHlDaGVja1N0YXRlUmVzb2x2ZShyZXNvbHZlOiAobm9kZTogVGh5VHJlZU5vZGUpID0+IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZSkge1xuICAgICAgICBpZiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5zZXRDaGVja1N0YXRlUmVzb2x2ZShyZXNvbHZlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuvue9riBUcmVlTm9kZSDmmK/lkKbmlK/mjIHlvILmraXliqDovb1cbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KSB0aHlBc3luYyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfdGh5VHlwZTogVGh5VHJlZVR5cGUgPSAnZGVmYXVsdCc7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7kuI3lkIzlsZXnpLrnsbvlnovnmoQgVHJlZe+8jGBkZWZhdWx0YCDkuLrlsI/nrq3lpLTlsZXnpLrvvIwgYGVzcGVjaWFsYCDkuLog5Yqg5YeP5Y+35Zu+5qCH5bGV56S6XG4gICAgICogQHR5cGUgVGh5VHJlZVR5cGVcbiAgICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgdGh5VHlwZSh0eXBlOiBUaHlUcmVlVHlwZSkge1xuICAgICAgICB0aGlzLl90aHlUeXBlID0gdHlwZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdlc3BlY2lhbCcpIHtcbiAgICAgICAgICAgIHRoaXMudGh5SWNvbnMgPSB7IGV4cGFuZDogJ21pbnVzLXNxdWFyZScsIGNvbGxhcHNlOiAncGx1cy1zcXVhcmUnIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgdGh5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RoeVR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u5LiN5ZCMIFRyZWUg5bGV5byA5oqY5Y+g55qE5Zu+5qCH77yMYGV4cGFuZGAg5Li65bGV5byA54q25oCB55qE5Zu+5qCH77yMYGNvbGxhcHNlYCDkuLrmipjlj6DnirbmgIHnmoTlm77moIdcbiAgICAgKiBAdHlwZSB7IGV4cGFuZDogc3RyaW5nLCBjb2xsYXBzZTogc3RyaW5nIH1cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlJY29uczogVGh5VHJlZUljb25zID0ge307XG5cbiAgICBwcml2YXRlIF90aHlTaXplOiBUaHlUcmVlU2l6ZSA9ICdkZWZhdWx0JztcbiAgICAvKipcbiAgICAgKiDmlK/mjIEgYHNtYCB8IGBkZWZhdWx0YCDkuKTnp43lpKflsI/vvIzpu5jorqTlgLzkuLogYGRlZmF1bHRgXG4gICAgICogQHR5cGUgVGh5VHJlZVNpemVcbiAgICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzZXQgdGh5U2l6ZShzaXplOiBUaHlUcmVlU2l6ZSkge1xuICAgICAgICB0aGlzLl90aHlTaXplID0gc2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuX3RoeVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RoeUl0ZW1TaXplID0gdHJlZUl0ZW1TaXplTWFwW3RoaXMuX3RoeVNpemVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdGh5SXRlbVNpemUgPSB0cmVlSXRlbVNpemVNYXAuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCB0aHlTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGh5U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7mmK/lkKblvIDlkK/omZrmi5/mu5rliqhcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnRoeS12aXJ0dWFsLXNjcm9sbGluZy10cmVlJylcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9KVxuICAgIHRoeVZpcnR1YWxTY3JvbGwgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX3RoeUl0ZW1TaXplID0gNDQ7XG5cbiAgICAvKipcbiAgICAgKiDlvIDlkK/omZrmi5/mu5rliqjml7bvvIzljZXooYzoioLngrnnmoTpq5jluqbvvIzlvZNgdGh5U2l6ZWDkuLpgZGVmYXVsdGDml7bvvIzor6Xlj4LmlbDmiY3nlJ/mlYhcbiAgICAgKiBAZGVmYXVsdCA0NFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gICAgc2V0IHRoeUl0ZW1TaXplKGl0ZW1TaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudGh5U2l6ZSAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldHRpbmcgdGh5U2l6ZSBhbmQgdGh5SXRlbVNpemUgYXQgdGhlIHNhbWUgdGltZSBpcyBub3QgYWxsb3dlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RoeUl0ZW1TaXplID0gaXRlbVNpemU7XG4gICAgfVxuXG4gICAgZ2V0IHRoeUl0ZW1TaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGh5SXRlbVNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u6IqC54K55ZCN56ew5piv5ZCm5pSv5oyB6LaF5Ye65oiq5Y+WXG4gICAgICogQHR5cGUgYm9vbGVhblxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogY29lcmNlQm9vbGVhblByb3BlcnR5IH0pIHRoeVRpdGxlVHJ1bmNhdGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICog5bey6YCJ5Lit55qEIG5vZGUg6IqC54K56ZuG5ZCIXG4gICAgICogQGRlZmF1bHQgW11cbiAgICAgKi9cbiAgICBASW5wdXQoKSB0aHlTZWxlY3RlZEtleXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICog5bGV5byA5oyH5a6a55qE5qCR6IqC54K5XG4gICAgICovXG4gICAgQElucHV0KCkgdGh5RXhwYW5kZWRLZXlzOiAoc3RyaW5nIHwgbnVtYmVyKVtdO1xuXG4gICAgLyoqXG4gICAgICog5piv5ZCm5bGV5byA5omA5pyJ5qCR6IqC54K5XG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSkgdGh5RXhwYW5kQWxsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva7nvKnov5vot53nprvvvIznvKnov5vot53nprsgPSB0aHlJbmRlbnQgKiBub2RlLmxldmVsXG4gICAgICogQHR5cGUgbnVtYmVyXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgdGh5SW5kZW50ID0gMjU7XG5cbiAgICAvKipcbiAgICAgKiDmi5bmi73kuYvliY3nmoTlm57osIPvvIzlh73mlbDov5Tlm54gZmFsc2Ug5YiZ6Zi75q2i5ouW5ou9XG4gICAgICovXG4gICAgQElucHV0KCkgdGh5QmVmb3JlRHJhZ1N0YXJ0OiAoY29udGV4dDogVGh5VHJlZUJlZm9yZURyYWdTdGFydENvbnRleHQpID0+IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiDmi5bmlL7liLDlhYPntKDml7blm57osIPvvIzlh73mlbDov5Tlm54gZmFsc2Ug5YiZ6Zi75q2i5ouW5pS+5Yiw5b2T5YmN5YWD57SgXG4gICAgICovXG4gICAgQElucHV0KCkgdGh5QmVmb3JlRHJhZ0Ryb3A6IChjb250ZXh0OiBUaHlUcmVlQmVmb3JlRHJhZ0Ryb3BDb250ZXh0KSA9PiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICog6K6+572u5a2QIFRyZWVOb2RlIOeCueWHu+S6i+S7tlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlPbkNsaWNrOiBFdmVudEVtaXR0ZXI8VGh5VHJlZUVtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRoeVRyZWVFbWl0RXZlbnQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDorr7nva4gY2hlY2sg6YCJ5oup5LqL5Lu2XG4gICAgICovXG4gICAgQE91dHB1dCgpIHRoeU9uQ2hlY2tib3hDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUaHlUcmVlRW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGh5VHJlZUVtaXRFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9rueCueWHu+WxleW8gOinpuWPkeS6i+S7tlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlPbkV4cGFuZENoYW5nZTogRXZlbnRFbWl0dGVyPFRoeVRyZWVFbWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUaHlUcmVlRW1pdEV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICog6K6+572uIFRyZWVOb2RlIOaLluaLveS6i+S7tlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0aHlPbkRyYWdEcm9wOiBFdmVudEVtaXR0ZXI8VGh5VHJlZURyYWdEcm9wRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUaHlUcmVlRHJhZ0Ryb3BFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIOWPjOWHuyBUcmVlTm9kZSDkuovku7ZcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgdGh5RGJsQ2xpY2s6IEV2ZW50RW1pdHRlcjxUaHlUcmVlRW1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8VGh5VHJlZUVtaXRFdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIOiuvue9riBUcmVlTm9kZSDnmoTmuLLmn5PmqKHmnb9cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKCd0cmVlTm9kZVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBzZXQgdGVtcGxhdGVSZWYodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZVJlZiA9IHRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHRlbXBsYXRlUmVmKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6+572u5a2Q55qE56m65pWw5o2u5riy5p+T5qih5p2/XG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZCgnZW1wdHlDaGlsZHJlblRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgZW1wdHlDaGlsZHJlblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHNldCBlbXB0eUNoaWxkcmVuVGVtcGxhdGVSZWYodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9lbXB0eUNoaWxkcmVuVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBlbXB0eUNoaWxkcmVuVGVtcGxhdGVSZWYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUNoaWxkcmVuVGVtcGxhdGVSZWY7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy50aHktdHJlZScpXG4gICAgdGh5VHJlZUNsYXNzID0gdHJ1ZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MudGh5LXRyZWUtZHJhZ2dpbmcnKVxuICAgIGRyYWdnaW5nOiBib29sZWFuO1xuXG4gICAgQFZpZXdDaGlsZHJlbihDZGtEcmFnKSBjZGtEcmFnczogUXVlcnlMaXN0PENka0RyYWc8VGh5VHJlZU5vZGU+PjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0aHlUcmVlU2VydmljZTogVGh5VHJlZVNlcnZpY2UsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQpIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faW5pdFRoeU5vZGVzKCk7XG4gICAgICAgIHRoaXMuX3NldFRyZWVUeXBlKCk7XG4gICAgICAgIHRoaXMuX3NldFRyZWVTaXplKCk7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0VHJlZU5vZGVzKHRoaXMudGh5U2VsZWN0ZWRLZXlzKTtcblxuICAgICAgICB0aGlzLnRoeVRyZWVTZXJ2aWNlLmZsYXR0ZW5Ob2RlcyQuc3Vic2NyaWJlKGZsYXR0ZW5UcmVlTm9kZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5mbGF0dGVuVHJlZU5vZGVzID0gZmxhdHRlblRyZWVOb2RlcztcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2RrRHJhZ3MuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuY2RrRHJhZ3MpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkcmFnczogUXVlcnlMaXN0PENka0RyYWc8VGh5VHJlZU5vZGU+PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZURyYWdzTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgZHJhZ3MuZm9yRWFjaChkcmFnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYWcuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2RrRHJhZyDlj5jljJbml7bvvIznvJPlrZggRWxlbWVudCDkuI4gRHJhZ1JlZiDnmoTlhbPns7vvvIzmlrnkvr8gRHJhZyBNb3ZlIOaXtuafpeaJvlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlRHJhZ3NNYXAuc2V0KGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBkcmFnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ub2RlRHJhZ01vdmVkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBhdWRpdFRpbWUoMzApLFxuICAgICAgICAgICAgICAgIC8vICBhdWRpdFRpbWUg5Y+v6IO95Lya5a+86Ie05ouW5Yqo57uT5p2f5ZCO5LuN54S25omn6KGMIG1vdmVkIO+8jOaJgOS7pemAmui/h+WIpOaWrSBkcmFnZ2luZyDnirbmgIHmnaXov4fmu6Tml6DmlYggbW92ZWRcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBDZGtEcmFnTW92ZSkgPT4gZXZlbnQuc291cmNlLl9kcmFnUmVmLmlzRHJhZ2dpbmcoKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ01vdmVkKGV2ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMudGh5Tm9kZXMgJiYgIWNoYW5nZXMudGh5Tm9kZXMuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0VGh5Tm9kZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy50aHlUeXBlICYmICFjaGFuZ2VzLnRoeVR5cGUuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRUcmVlVHlwZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLnRoeU11bHRpcGxlICYmICFjaGFuZ2VzLnRoeU11bHRpcGxlLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2VTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMudGh5U2VsZWN0ZWRLZXlzICYmICFjaGFuZ2VzLnRoeVNlbGVjdGVkS2V5cy5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkS2V5cyA9IGNoYW5nZXMudGh5U2VsZWN0ZWRLZXlzLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdFRyZWVOb2RlcyhjaGFuZ2VzLnRoeVNlbGVjdGVkS2V5cy5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMudGh5RXhwYW5kZWRLZXlzICYmICFjaGFuZ2VzLnRoeUV4cGFuZGVkS2V5cy5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUV4cGFuZGVkS2V5cygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLnRoeUV4cGFuZEFsbCAmJiAhY2hhbmdlcy50aHlFeHBhbmRBbGwuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFeHBhbmRlZEtleXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlclZpZXcgPSAoKSA9PiB7fTtcblxuICAgIGV2ZW50VHJpZ2dlckNoYW5nZWQoZXZlbnQ6IFRoeVRyZWVFbWl0RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5ldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2V4cGFuZCc6XG4gICAgICAgICAgICAgICAgdGhpcy50aHlPbkV4cGFuZENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3hDaGFuZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMudGh5T25DaGVja2JveENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRUaHlOb2RlcygpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRLZXlzID0gdGhpcy5nZXRFeHBhbmRlZE5vZGVzKCkubWFwKG5vZGUgPT4gbm9kZS5rZXkpO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEtleXMgPSB0aGlzLmdldFNlbGVjdGVkTm9kZXMoKS5tYXAobm9kZSA9PiBub2RlLmtleSk7XG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuaW5pdGlhbGl6ZVRyZWVOb2Rlcyh0aGlzLnRoeU5vZGVzKTtcbiAgICAgICAgdGhpcy5mbGF0dGVuVHJlZU5vZGVzID0gdGhpcy50aHlUcmVlU2VydmljZS5mbGF0dGVuVHJlZU5vZGVzO1xuICAgICAgICB0aGlzLl9zZWxlY3RUcmVlTm9kZXModGhpcy5fc2VsZWN0ZWRLZXlzKTtcbiAgICAgICAgdGhpcy5faGFuZGxlRXhwYW5kZWRLZXlzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlRXhwYW5kZWRLZXlzKCkge1xuICAgICAgICBpZiAodGhpcy50aHlFeHBhbmRlZEtleXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRLZXlzID0gaGVscGVycy5jb25jYXRBcnJheShcbiAgICAgICAgICAgICAgICB0aGlzLnRoeUV4cGFuZGVkS2V5cy5maWx0ZXIoa2V5ID0+ICF0aGlzLl9leHBhbmRlZEtleXMuaW5jbHVkZXMoa2V5KSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWRLZXlzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuZXhwYW5kVHJlZU5vZGVzKHRoaXMudGh5RXhwYW5kQWxsIHx8IHRoaXMuX2V4cGFuZGVkS2V5cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0VHJlZVR5cGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnRoeVR5cGUgJiYgdHJlZVR5cGVDbGFzc01hcFt0aGlzLnRoeVR5cGVdKSB7XG4gICAgICAgICAgICB0cmVlVHlwZUNsYXNzTWFwW3RoaXMudGh5VHlwZV0uZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdFJlbmRlcmVyLmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NldFRyZWVTaXplKCkge1xuICAgICAgICBpZiAodGhpcy50aHlTaXplKSB7XG4gICAgICAgICAgICB0aGlzLmhvc3RSZW5kZXJlci5hZGRDbGFzcyhgdGh5LXRyZWUtJHt0aGlzLnRoeVNpemV9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbnN0YW5jZVNlbGVjdGlvbk1vZGVsKCkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRoaXMudGh5TXVsdGlwbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NlbGVjdFRyZWVOb2RlcyhrZXlzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKSB7XG4gICAgICAgIChrZXlzIHx8IFtdKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy50aHlUcmVlU2VydmljZS5nZXRUcmVlTm9kZShrZXkpO1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRyZWVOb2RlKHRoaXMudGh5VHJlZVNlcnZpY2UuZ2V0VHJlZU5vZGUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQobm9kZSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlVHJlZU5vZGUobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgJiYgIW5vZGUuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXkgfHwgaW5kZXg7XG4gICAgfVxuXG4gICAgaXNTaG93RXhwYW5kKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIGlmIChoZWxwZXJzLmlzRnVuY3Rpb24odGhpcy50aHlTaG93RXhwYW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLnRoeVNob3dFeHBhbmQgYXMgRnVuY3Rpb24pKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh5U2hvd0V4cGFuZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IFRoeVRyZWVOb2RlRGF0YVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aHlOb2RlcyA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5faW5pdFRoeU5vZGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIG9uRHJhZ1N0YXJ0ZWQoZXZlbnQ6IENka0RyYWdTdGFydDxUaHlUcmVlTm9kZT4pIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnREcmFnTm9kZUNsb25lID0gT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQuc291cmNlLmRhdGEpO1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlLmRhdGEuaXNFeHBhbmRlZCkge1xuICAgICAgICAgICAgZXZlbnQuc291cmNlLmRhdGEuc2V0RXhwYW5kZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1pdERyYWdNb3ZlZChldmVudDogQ2RrRHJhZ01vdmUpIHtcbiAgICAgICAgdGhpcy5ub2RlRHJhZ01vdmVkLm5leHQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZTxUaHlUcmVlTm9kZT4pIHtcbiAgICAgICAgLy8g6YCa6L+H6byg5qCH5L2N572u5p+l5om+5a+55bqU55qE55uu5qCHIEl0ZW0g5YWD57SgXG4gICAgICAgIGxldCBjdXJyZW50UG9pbnRFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54LCBldmVudC5wb2ludGVyUG9zaXRpb24ueSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghY3VycmVudFBvaW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwRHJhZ0FydGlmYWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0YXJnZXRFbGVtZW50ID0gY3VycmVudFBvaW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3RoeS10cmVlLW5vZGUnKVxuICAgICAgICAgICAgPyBjdXJyZW50UG9pbnRFbGVtZW50XG4gICAgICAgICAgICA6IChjdXJyZW50UG9pbnRFbGVtZW50LmNsb3Nlc3QoJy50aHktdHJlZS1ub2RlJykgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyDnvJPlrZjmlL7nva7nm67moIdJZCDlubborqHnrpfpvKDmoIfnm7jlr7nlupTnmoTkvY3nva5cbiAgICAgICAgdGhpcy5ub2RlRHJvcFRhcmdldCA9IHtcbiAgICAgICAgICAgIGtleTogdGhpcy5ub2RlRHJhZ3NNYXAuZ2V0KHRhcmdldEVsZW1lbnQpPy5kYXRhLmtleSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLmdldFRhcmdldFBvc2l0aW9uKHRhcmdldEVsZW1lbnQsIGV2ZW50KVxuICAgICAgICB9O1xuICAgICAgICAvLyDmiafooYzlpJbpg6jkvKDlhaXnmoQgZHJvcEVudGVyUHJlZGljYXRlIOWIpOaWreaYr+WQpuWFgeiuuOaLluWFpeebruagh+mhuVxuICAgICAgICBpZiAodGhpcy5kcm9wRW50ZXJQcmVkaWNhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldERyYWdSZWYgPSB0aGlzLm5vZGVEcmFnc01hcC5nZXQodGFyZ2V0RWxlbWVudCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wRW50ZXJQcmVkaWNhdGUoe1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LnNvdXJjZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldERyYWdSZWYuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZHJvcFBvc2l0aW9uOiB0aGlzLm5vZGVEcm9wVGFyZ2V0LnBvc2l0aW9uXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Ryb3BQb3NpdGlvblBsYWNlaG9sZGVyKHRhcmdldEVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVEcm9wVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFudXBEcmFnQXJ0aWZhY3RzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEcm9wUG9zaXRpb25QbGFjZWhvbGRlcih0YXJnZXRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRHJhZ0VuZGVkKGV2ZW50OiBDZGtEcmFnRW5kPFRoeVRyZWVOb2RlPikge1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIOaLluaLvee7k+adn+WQjuaBouWkjeWOn+Wni+eahOWxleW8gOeKtuaAgVxuICAgICAgICBldmVudC5zb3VyY2UuZGF0YS5zZXRFeHBhbmRlZCh0aGlzLnN0YXJ0RHJhZ05vZGVDbG9uZS5pc0V4cGFuZGVkKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RHJhZ05vZGVDbG9uZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uTGlzdERyb3BwZWQoZXZlbnQ6IENka0RyYWdEcm9wPFRoeVRyZWVOb2RlW10sIFRoeVRyZWVOb2RlW10sIFRoeVRyZWVOb2RlPikge1xuICAgICAgICBpZiAoIXRoaXMubm9kZURyb3BUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNTaG93RXhwYW5kKHRoaXMuc3RhcnREcmFnTm9kZUNsb25lKSAmJiB0aGlzLm5vZGVEcm9wVGFyZ2V0LnBvc2l0aW9uID09PSBUaHlUcmVlRHJvcFBvc2l0aW9uLmluKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBEcmFnQXJ0aWZhY3RzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VOb2RlID0gdGhpcy5zdGFydERyYWdOb2RlQ2xvbmU7XG4gICAgICAgIGNvbnN0IHNvdXJjZU5vZGVQYXJlbnQgPSBzb3VyY2VOb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IHRhcmdldERyYWdSZWYgPSB0aGlzLmNka0RyYWdzLmZpbmQoaXRlbSA9PiBpdGVtLmRhdGE/LmtleSA9PT0gdGhpcy5ub2RlRHJvcFRhcmdldC5rZXkpO1xuICAgICAgICBjb25zdCB0YXJnZXROb2RlID0gdGFyZ2V0RHJhZ1JlZj8uZGF0YTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Tm9kZVBhcmVudCA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICBjb25zdCBiZWZvcmVEcmFnRHJvcENvbnRleHQ6IFRoeVRyZWVCZWZvcmVEcmFnRHJvcENvbnRleHQgPSB7XG4gICAgICAgICAgICBwcmV2aW91c0l0ZW06IHNvdXJjZU5vZGUsXG4gICAgICAgICAgICBwcmV2aW91c0NvbnRhaW5lckl0ZW1zOiBzb3VyY2VOb2RlUGFyZW50Py5jaGlsZHJlbixcbiAgICAgICAgICAgIGl0ZW06IHRhcmdldE5vZGUsXG4gICAgICAgICAgICBjb250YWluZXJJdGVtczogdGFyZ2V0Tm9kZVBhcmVudD8uY2hpbGRyZW4sXG4gICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5ub2RlRHJvcFRhcmdldC5wb3NpdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnRoeUJlZm9yZURyYWdEcm9wICYmICF0aGlzLnRoeUJlZm9yZURyYWdEcm9wKGJlZm9yZURyYWdEcm9wQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuZGVsZXRlVHJlZU5vZGUoc291cmNlTm9kZSk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm5vZGVEcm9wVGFyZ2V0LnBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdiZWZvcmUnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUluc2VydEluZGV4ID0gKHRhcmdldE5vZGVQYXJlbnQ/LmNoaWxkcmVuIHx8IHRoaXMudHJlZU5vZGVzKS5pbmRleE9mKHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuYWRkVHJlZU5vZGUoc291cmNlTm9kZSwgdGFyZ2V0Tm9kZVBhcmVudCwgYmVmb3JlSW5zZXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYWZ0ZXInOlxuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVySW5zZXJ0SW5kZXggPSAodGFyZ2V0Tm9kZVBhcmVudD8uY2hpbGRyZW4gfHwgdGhpcy50cmVlTm9kZXMpLmluZGV4T2YodGFyZ2V0Tm9kZSkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2UuYWRkVHJlZU5vZGUoc291cmNlTm9kZSwgdGFyZ2V0Tm9kZVBhcmVudCwgYWZ0ZXJJbnNlcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpbic6XG4gICAgICAgICAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5hZGRUcmVlTm9kZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2Uuc3luY0ZsYXR0ZW5UcmVlTm9kZXMoKTtcblxuICAgICAgICBsZXQgYWZ0ZXI6IFRoeVRyZWVOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IHRhcmdlOiBUaHlUcmVlTm9kZSA9IG51bGw7XG4gICAgICAgIGlmIChiZWZvcmVEcmFnRHJvcENvbnRleHQucG9zaXRpb24gPT09IFRoeVRyZWVEcm9wUG9zaXRpb24uYmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRDb250YWluZXJOb2RlcyA9IHRhcmdldE5vZGVQYXJlbnQ/LmNoaWxkcmVuIHx8IHRoaXMudHJlZU5vZGVzO1xuICAgICAgICAgICAgYWZ0ZXIgPSB0YXJnZXRDb250YWluZXJOb2Rlc1t0YXJnZXRDb250YWluZXJOb2Rlcy5pbmRleE9mKHRhcmdldE5vZGUpIC0gMl07XG4gICAgICAgICAgICB0YXJnZSA9IHRhcmdldE5vZGVQYXJlbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoYmVmb3JlRHJhZ0Ryb3BDb250ZXh0LnBvc2l0aW9uID09PSBUaHlUcmVlRHJvcFBvc2l0aW9uLmFmdGVyKSB7XG4gICAgICAgICAgICBhZnRlciA9IHRhcmdldE5vZGU7XG4gICAgICAgICAgICB0YXJnZSA9IHRhcmdldE5vZGVQYXJlbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZnRlciA9IHRhcmdldE5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA+IDAgPyB0YXJnZXROb2RlLmNoaWxkcmVuW3RhcmdldE5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMl0gOiBudWxsO1xuICAgICAgICAgICAgdGFyZ2UgPSB0YXJnZXROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aHlPbkRyYWdEcm9wLmVtaXQoe1xuICAgICAgICAgICAgZHJhZ05vZGU6IHRoaXMudGh5VHJlZVNlcnZpY2UuZ2V0VHJlZU5vZGUoc291cmNlTm9kZS5rZXkpLFxuICAgICAgICAgICAgdGFyZ2V0Tm9kZTogdGFyZ2UsXG4gICAgICAgICAgICBhZnRlck5vZGU6IGFmdGVyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xlYW51cERyYWdBcnRpZmFjdHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRhcmdldFBvc2l0aW9uKHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBDZGtEcmFnTW92ZSkge1xuICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBiZWZvcmVPckFmdGVyR2FwID0gdGFyZ2V0UmVjdC5oZWlnaHQgKiAwLjM7XG4gICAgICAgIC8vIOWwhiBOb2RlIOmrmOW6puWIhuS4uuS4iuS4reS4i+S4ieaute+8jOWFtuS4reS4iuS4i+eahCBHYXAg5Li6IGhlaWdodCDnmoQgMzAl77yM6YCa6L+H5Yik5pat6byg5qCH5L2N572u5Zyo5ZOq5LiA5q61IGdhcCDmnaXorqHnrpflr7nlupTnmoTkvY3nva5cbiAgICAgICAgaWYgKGV2ZW50LnBvaW50ZXJQb3NpdGlvbi55IC0gdGFyZ2V0UmVjdC50b3AgPCBiZWZvcmVPckFmdGVyR2FwKSB7XG4gICAgICAgICAgICByZXR1cm4gVGh5VHJlZURyb3BQb3NpdGlvbi5iZWZvcmU7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucG9pbnRlclBvc2l0aW9uLnkgPj0gdGFyZ2V0UmVjdC5ib3R0b20gLSBiZWZvcmVPckFmdGVyR2FwKSB7XG4gICAgICAgICAgICByZXR1cm4gVGh5VHJlZURyb3BQb3NpdGlvbi5hZnRlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBUaHlUcmVlRHJvcFBvc2l0aW9uLmluO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93RHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIodGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwRHJvcFBvc2l0aW9uUGxhY2Vob2xkZXIoKTtcbiAgICAgICAgaWYgKHRoaXMubm9kZURyb3BUYXJnZXQgJiYgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGBkcm9wLXBvc2l0aW9uLSR7dGhpcy5ub2RlRHJvcFRhcmdldC5wb3NpdGlvbn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW51cERyb3BQb3NpdGlvblBsYWNlaG9sZGVyKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLXBvc2l0aW9uLWJlZm9yZScpLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3AtcG9zaXRpb24tYmVmb3JlJykpO1xuICAgICAgICB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcm9wLXBvc2l0aW9uLWFmdGVyJykuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZHJvcC1wb3NpdGlvbi1hZnRlcicpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJvcC1wb3NpdGlvbi1pbicpLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3AtcG9zaXRpb24taW4nKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbnVwRHJhZ0FydGlmYWN0cygpIHtcbiAgICAgICAgdGhpcy5ub2RlRHJvcFRhcmdldCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2xlYW51cERyb3BQb3NpdGlvblBsYWNlaG9sZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gcmVnaW9uIFB1YmxpYyBGdW5jdGlvbnNcblxuICAgIHNlbGVjdFRyZWVOb2RlKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIGlmIChub2RlICYmICFub2RlLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChub2RlKTtcbiAgICAgICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2Uuc3luY0ZsYXR0ZW5UcmVlTm9kZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJvb3ROb2RlcygpOiBUaHlUcmVlTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVzO1xuICAgIH1cblxuICAgIGdldFRyZWVOb2RlKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoeVRyZWVTZXJ2aWNlLmdldFRyZWVOb2RlKGtleSk7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0ZWROb2RlKCk6IFRoeVRyZWVOb2RlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkTm9kZXMoKTogVGh5VHJlZU5vZGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbCA/IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkIDogW107XG4gICAgfVxuXG4gICAgZ2V0RXhwYW5kZWROb2RlcygpOiBUaHlUcmVlTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh5VHJlZVNlcnZpY2UuZ2V0RXhwYW5kZWROb2RlcygpO1xuICAgIH1cblxuICAgIGdldENoZWNrZWROb2RlcygpOiBUaHlUcmVlTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh5VHJlZVNlcnZpY2UuZ2V0Q2hlY2tlZE5vZGVzKCk7XG4gICAgfVxuXG4gICAgYWRkVHJlZU5vZGUobm9kZTogVGh5VHJlZU5vZGVEYXRhLCBwYXJlbnQ/OiBUaHlUcmVlTm9kZSwgaW5kZXggPSAtMSkge1xuICAgICAgICB0aGlzLnRoeVRyZWVTZXJ2aWNlLmFkZFRyZWVOb2RlKG5ldyBUaHlUcmVlTm9kZShub2RlLCBudWxsLCB0aGlzLnRoeVRyZWVTZXJ2aWNlKSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIHRoaXMudGh5VHJlZVNlcnZpY2Uuc3luY0ZsYXR0ZW5UcmVlTm9kZXMoKTtcbiAgICB9XG5cbiAgICBkZWxldGVUcmVlTm9kZShub2RlOiBUaHlUcmVlTm9kZSkge1xuICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC50b2dnbGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5kZWxldGVUcmVlTm9kZShub2RlKTtcbiAgICAgICAgdGhpcy50aHlUcmVlU2VydmljZS5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuICAgIH1cblxuICAgIGV4cGFuZEFsbE5vZGVzKCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuZ2V0Um9vdE5vZGVzKCk7XG4gICAgICAgIG5vZGVzLmZvckVhY2gobiA9PiBuLnNldEV4cGFuZGVkKHRydWUsIHRydWUpKTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZWRBbGxOb2RlcygpIHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmdldFJvb3ROb2RlcygpO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKG4gPT4gbi5zZXRFeHBhbmRlZChmYWxzZSwgdHJ1ZSkpO1xuICAgIH1cblxuICAgIC8vIGVuZHJlZ2lvblxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIiwiPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAjdmlld3BvcnRcbiAgKm5nSWY9XCJ0aHlWaXJ0dWFsU2Nyb2xsXCJcbiAgW2l0ZW1TaXplXT1cInRoeUl0ZW1TaXplXCJcbiAgW3N0eWxlLmhlaWdodF09XCInMTAwJSdcIlxuICBjZGtEcm9wTGlzdFxuICBbY2RrRHJvcExpc3RBdXRvU2Nyb2xsU3RlcF09XCI2XCJcbiAgW2Nka0Ryb3BMaXN0RGF0YV09XCJmbGF0dGVuVHJlZU5vZGVzXCJcbiAgW2Nka0Ryb3BMaXN0U29ydGluZ0Rpc2FibGVkXT1cInRydWVcIlxuICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uTGlzdERyb3BwZWQoJGV2ZW50KVwiXG4gID5cbiAgPGRpdiBjbGFzcz1cInZpcnR1YWwtdHJlZXMtY29udGFpbmVyXCI+XG4gICAgPHRoeS10cmVlLW5vZGVcbiAgICAgICpjZGtWaXJ0dWFsRm9yPVwibGV0IG5vZGUgb2YgZmxhdHRlblRyZWVOb2RlczsgdHJhY2tCeTogdHJhY2tCeUZuOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgIGNka0RyYWdcbiAgICAgIFtjZGtEcmFnRGF0YV09XCJub2RlXCJcbiAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiIXRoeURyYWdnYWJsZSB8fCAhKG5vZGUgfCB0cmVlTm9kZURyYWdnYWJsZSA6IHRoeUJlZm9yZURyYWdTdGFydClcIlxuICAgICAgKGNka0RyYWdTdGFydGVkKT1cIm9uRHJhZ1N0YXJ0ZWQoJGV2ZW50KVwiXG4gICAgICAoY2RrRHJhZ0VuZGVkKT1cIm9uRHJhZ0VuZGVkKCRldmVudClcIlxuICAgICAgKGNka0RyYWdNb3ZlZCk9XCJlbWl0RHJhZ01vdmVkKCRldmVudClcIlxuICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICBbdGVtcGxhdGVSZWZdPVwidGVtcGxhdGVSZWZcIlxuICAgICAgW2VtcHR5Q2hpbGRyZW5UZW1wbGF0ZVJlZl09XCJlbXB0eUNoaWxkcmVuVGVtcGxhdGVcIlxuICAgICAgW3RoeUFzeW5jXT1cInRoeUFzeW5jXCJcbiAgICAgIFt0aHlEcmFnZ2FibGVdPVwidGh5RHJhZ2dhYmxlXCJcbiAgICAgIFt0aHlDaGVja2FibGVdPVwidGh5Q2hlY2thYmxlXCJcbiAgICAgIFt0aHlNdWx0aXBsZV09XCJ0aHlNdWx0aXBsZVwiXG4gICAgICBbdGh5Q2xpY2tCZWhhdmlvcl09XCJ0aHlDbGlja0JlaGF2aW9yXCJcbiAgICAgIFt0aHlUaXRsZVRydW5jYXRlXT1cInRoeVRpdGxlVHJ1bmNhdGVcIlxuICAgICAgW3RoeUl0ZW1TaXplXT1cInRoeUl0ZW1TaXplXCJcbiAgICAgIFt0aHlJbmRlbnRdPVwidGh5SW5kZW50XCJcbiAgICAgICh0aHlPbkNsaWNrKT1cInRoeU9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICh0aHlEYmxDbGljayk9XCJ0aHlEYmxDbGljay5lbWl0KCRldmVudClcIlxuICAgICAgKHRoeU9uRXhwYW5kQ2hhbmdlKT1cImV2ZW50VHJpZ2dlckNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAodGh5T25DaGVja2JveENoYW5nZSk9XCJldmVudFRyaWdnZXJDaGFuZ2VkKCRldmVudClcIj5cbiAgICA8L3RoeS10cmVlLW5vZGU+XG4gIDwvZGl2PlxuPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbjxkaXZcbiAgKm5nSWY9XCIhdGh5VmlydHVhbFNjcm9sbFwiXG4gIGNka0Ryb3BMaXN0XG4gIFtjZGtEcm9wTGlzdEF1dG9TY3JvbGxTdGVwXT1cIjZcIlxuICBbY2RrRHJvcExpc3REYXRhXT1cImZsYXR0ZW5UcmVlTm9kZXNcIlxuICBbY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWRdPVwidHJ1ZVwiXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25MaXN0RHJvcHBlZCgkZXZlbnQpXCI+XG4gIDx0aHktdHJlZS1ub2RlXG4gICAgKm5nRm9yPVwibGV0IG5vZGUgb2YgZmxhdHRlblRyZWVOb2RlczsgdHJhY2tCeTogdHJhY2tCeUZuOyBsZXQgaSA9IGluZGV4XCJcbiAgICBjZGtEcmFnXG4gICAgW2Nka0RyYWdEYXRhXT1cIm5vZGVcIlxuICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiIXRoeURyYWdnYWJsZSB8fCAhKG5vZGUgfCB0cmVlTm9kZURyYWdnYWJsZSA6IHRoeUJlZm9yZURyYWdTdGFydClcIlxuICAgIChjZGtEcmFnU3RhcnRlZCk9XCJvbkRyYWdTdGFydGVkKCRldmVudClcIlxuICAgIChjZGtEcmFnRW5kZWQpPVwib25EcmFnRW5kZWQoJGV2ZW50KVwiXG4gICAgKGNka0RyYWdNb3ZlZCk9XCJlbWl0RHJhZ01vdmVkKCRldmVudClcIlxuICAgIFtub2RlXT1cIm5vZGVcIlxuICAgIFt0ZW1wbGF0ZVJlZl09XCJ0ZW1wbGF0ZVJlZlwiXG4gICAgW2VtcHR5Q2hpbGRyZW5UZW1wbGF0ZVJlZl09XCJlbXB0eUNoaWxkcmVuVGVtcGxhdGVcIlxuICAgIFt0aHlBc3luY109XCJ0aHlBc3luY1wiXG4gICAgW3RoeURyYWdnYWJsZV09XCJ0aHlEcmFnZ2FibGVcIlxuICAgIFt0aHlDaGVja2FibGVdPVwidGh5Q2hlY2thYmxlXCJcbiAgICBbdGh5TXVsdGlwbGVdPVwidGh5TXVsdGlwbGVcIlxuICAgIFt0aHlUaXRsZVRydW5jYXRlXT1cInRoeVRpdGxlVHJ1bmNhdGVcIlxuICAgIFt0aHlJdGVtU2l6ZV09XCJ0aHlJdGVtU2l6ZVwiXG4gICAgW3RoeUNsaWNrQmVoYXZpb3JdPVwidGh5Q2xpY2tCZWhhdmlvclwiXG4gICAgW3RoeUluZGVudF09XCJ0aHlJbmRlbnRcIlxuICAgICh0aHlPbkNsaWNrKT1cInRoeU9uQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAodGh5RGJsQ2xpY2spPVwidGh5RGJsQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAodGh5T25FeHBhbmRDaGFuZ2UpPVwiZXZlbnRUcmlnZ2VyQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAodGh5T25DaGVja2JveENoYW5nZSk9XCJ0aHlPbkNoZWNrYm94Q2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICA8L3RoeS10cmVlLW5vZGU+XG48L2Rpdj5cbiJdfQ==
@@ -122,9 +122,9 @@ export class ThyTreeService {
122
122
  }
123
123
  }
124
124
  expandTreeNodes(keyOrKeys) {
125
- const keys = coerceArray(keyOrKeys);
125
+ const keys = keyOrKeys === true ? [] : coerceArray(keyOrKeys);
126
126
  const needExpandNodes = this.getParallelTreeNodes(this.treeNodes).filter(node => {
127
- return keys.indexOf(node.key) > -1;
127
+ return keys.indexOf(node.key) > -1 || keyOrKeys === true;
128
128
  });
129
129
  needExpandNodes.forEach(node => {
130
130
  node.setExpanded(true);
@@ -184,4 +184,4 @@ export class ThyTreeService {
184
184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: ThyTreeService, decorators: [{
185
185
  type: Injectable
186
186
  }], ctorParameters: () => [] });
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyZWUvdHJlZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFtQixNQUFNLGNBQWMsQ0FBQzs7QUFFdEUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFpQjtJQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUsscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xHLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDO0lBQ3pDLENBQUM7U0FBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4RCxPQUFPLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8scUJBQXFCLENBQUMsYUFBYSxDQUFDO0lBQy9DLENBQUM7QUFD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Q0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7OEdBL0tRLGNBQWM7a0hBQWQsY0FBYzs7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUFycmF5LCBpc0Z1bmN0aW9uIH0gZnJvbSAnbmd4LXRldGh5cy91dGlsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHlUcmVlTm9kZSB9IGZyb20gJy4vdHJlZS1ub2RlLmNsYXNzJztcbmltcG9ydCB7IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZSwgVGh5VHJlZU5vZGVEYXRhIH0gZnJvbSAnLi90cmVlLmNsYXNzJztcblxuZnVuY3Rpb24gY2hlY2tTdGF0ZVJlc29sdmUobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICBjb25zdCBjaGVja2VkTm9kZXMgPSBub2RlLmNoaWxkcmVuLmZpbHRlcihuID0+IG4uaXNDaGVja2VkID09PSBUaHlUcmVlTm9kZUNoZWNrU3RhdGUuY2hlY2tlZCk7XG4gICAgY29uc3QgdW5DaGVja2VkTm9kZXMgPSBub2RlLmNoaWxkcmVuLmZpbHRlcihuID0+IG4uaXNDaGVja2VkID09PSBUaHlUcmVlTm9kZUNoZWNrU3RhdGUudW5jaGVja2VkKTtcbiAgICBpZiAoY2hlY2tlZE5vZGVzLmxlbmd0aCA9PT0gbm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5jaGVja2VkO1xuICAgIH0gZWxzZSBpZiAodW5DaGVja2VkTm9kZXMubGVuZ3RoID09PSBub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gVGh5VHJlZU5vZGVDaGVja1N0YXRlLnVuY2hlY2tlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVGh5VHJlZU5vZGVDaGVja1N0YXRlLmluZGV0ZXJtaW5hdGU7XG4gICAgfVxufVxuXG50eXBlIEZsYXR0ZW5BbGxOb2Rlc0NiID0gKHRyZWVOb2RlOiBUaHlUcmVlTm9kZSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGludGVyZmFjZSBUaHlUcmVlRm9ybWF0RW1pdEV2ZW50IHtcbiAgICBldmVudE5hbWU6IHN0cmluZztcbiAgICBub2RlOiBUaHlUcmVlTm9kZTtcbiAgICBldmVudD86IE1vdXNlRXZlbnQgfCBEcmFnRXZlbnQ7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaHlUcmVlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgc2VsZWN0ZWROb2RlITogVGh5VHJlZU5vZGU7XG5cbiAgICBmbGF0dGVuTm9kZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaHlUcmVlTm9kZVtdPihbXSk7XG5cbiAgICBmbGF0dGVuVHJlZU5vZGVzOiBUaHlUcmVlTm9kZVtdID0gW107XG5cbiAgICBwcml2YXRlIG9yaWdpblRyZWVOb2RlczogVGh5VHJlZU5vZGVEYXRhW10gPSBbXTtcblxuICAgIHB1YmxpYyB0cmVlTm9kZXM6IFRoeVRyZWVOb2RlW10gPSBbXTtcblxuICAgIHB1YmxpYyBjaGVja1N0YXRlUmVzb2x2ZTogKG5vZGU6IFRoeVRyZWVOb2RlKSA9PiBUaHlUcmVlTm9kZUNoZWNrU3RhdGUgPSBjaGVja1N0YXRlUmVzb2x2ZTtcblxuICAgIHN0YXR1c0NoYW5nZSQgPSBuZXcgU3ViamVjdDxUaHlUcmVlRm9ybWF0RW1pdEV2ZW50PigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzQ2hhbmdlJC5waXBlKCkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3luY0ZsYXR0ZW5UcmVlTm9kZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc3luY05vZGVDaGVja1N0YXRlKGV2ZW50Lm5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRyZWVOb2Rlcyhyb290Tm9kZXM6IFRoeVRyZWVOb2RlRGF0YVtdKSB7XG4gICAgICAgIHRoaXMub3JpZ2luVHJlZU5vZGVzID0gcm9vdE5vZGVzIHx8IFtdO1xuICAgICAgICB0aGlzLnRyZWVOb2RlcyA9IChyb290Tm9kZXMgfHwgW10pLm1hcChub2RlID0+IG5ldyBUaHlUcmVlTm9kZShub2RlLCBudWxsLCB0aGlzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN5bmNGbGF0dGVuVHJlZU5vZGVzKCkge1xuICAgICAgICB0aGlzLmZsYXR0ZW5UcmVlTm9kZXMgPSB0aGlzLmdldFBhcmFsbGVsVHJlZU5vZGVzKHRoaXMudHJlZU5vZGVzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZmxhdHRlbk5vZGVzJC5uZXh0KHRoaXMuZmxhdHRlblRyZWVOb2Rlcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYXR0ZW5UcmVlTm9kZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQYXJhbGxlbFRyZWVOb2Rlcyhyb290VHJlZXM6IFRoeVRyZWVOb2RlW10gPSB0aGlzLnRyZWVOb2RlcywgZmxhdHRlbkFsbE5vZGVzOiBib29sZWFuIHwgRmxhdHRlbkFsbE5vZGVzQ2IgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGZsYXR0ZW5UcmVlRGF0YTogVGh5VHJlZU5vZGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBfZ2V0UGFyYWxsZWxUcmVlTm9kZXMobGlzdDogVGh5VHJlZU5vZGVbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3QuZm9yRWFjaCgodHJlZU5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgZmxhdHRlblRyZWVEYXRhLnB1c2godHJlZU5vZGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5BbGxOb2Rlc0ZsYWcgPSBpc0Z1bmN0aW9uKGZsYXR0ZW5BbGxOb2RlcykgPyBmbGF0dGVuQWxsTm9kZXModHJlZU5vZGUpIDogZmxhdHRlbkFsbE5vZGVzO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0dGVuQWxsTm9kZXNGbGFnIHx8IHRyZWVOb2RlLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2dldFBhcmFsbGVsVHJlZU5vZGVzKHRyZWVOb2RlLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfZ2V0UGFyYWxsZWxUcmVlTm9kZXMocm9vdFRyZWVzKTtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5UcmVlRGF0YTtcbiAgICB9XG5cbiAgICBzZXRDaGVja1N0YXRlUmVzb2x2ZShyZXNvbHZlOiAobm9kZTogVGh5VHJlZU5vZGUpID0+IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZSA9IGNoZWNrU3RhdGVSZXNvbHZlKSB7XG4gICAgICAgIHRoaXMuY2hlY2tTdGF0ZVJlc29sdmUgPSByZXNvbHZlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldFNvcnRlZFRyZWVOb2Rlcyh0cmVlTm9kZXM6IFRoeVRyZWVOb2RlW10sIHBhcmVudD86IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIHRyZWVOb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgbm9kZS5sZXZlbCA9IG5vZGUucGFyZW50Tm9kZSA/IG5vZGUucGFyZW50Tm9kZS5sZXZlbCArIDEgOiAwO1xuICAgICAgICAgICAgbm9kZS5vcmlnaW4uY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLm1hcChuID0+IG4ub3JpZ2luKTtcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZSA9IHBhcmVudDtcbiAgICAgICAgICAgIHRoaXMucmVzZXRTb3J0ZWRUcmVlTm9kZXMobm9kZS5jaGlsZHJlbiwgbm9kZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmVlTm9kZShrZXk6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBjb25zdCBhbGxOb2RlcyA9IHRoaXMuZ2V0UGFyYWxsZWxUcmVlTm9kZXModGhpcy50cmVlTm9kZXMpO1xuICAgICAgICByZXR1cm4gYWxsTm9kZXMuZmluZChuID0+IG4ua2V5ID09PSBrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFeHBhbmRlZE5vZGVzKCk6IFRoeVRyZWVOb2RlW10ge1xuICAgICAgICBjb25zdCBhbGxOb2RlcyA9IHRoaXMuZ2V0UGFyYWxsZWxUcmVlTm9kZXModGhpcy50cmVlTm9kZXMpO1xuICAgICAgICByZXR1cm4gYWxsTm9kZXMuZmlsdGVyKG4gPT4gbi5pc0V4cGFuZGVkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2hlY2tlZE5vZGVzKCk6IFRoeVRyZWVOb2RlW10ge1xuICAgICAgICBjb25zdCBhbGxOb2RlcyA9IHRoaXMuZ2V0UGFyYWxsZWxUcmVlTm9kZXModGhpcy50cmVlTm9kZXMpO1xuICAgICAgICByZXR1cm4gYWxsTm9kZXMuZmlsdGVyKG4gPT4gbi5pc0NoZWNrZWQgPT09IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5jaGVja2VkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlVHJlZU5vZGUobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLnBhcmVudE5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNoaWxkcmVuLmZpbmRJbmRleChuID0+IG4ua2V5ID09PSBub2RlLmtleSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLm9yaWdpbi5jaGlsZHJlbiA9IGNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0ub3JpZ2luKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNOb2RlQ2hlY2tTdGF0ZShub2RlLnBhcmVudE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyZWVOb2Rlcy5maW5kSW5kZXgobiA9PiBuLmtleSA9PT0gbm9kZS5rZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVOb2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luVHJlZU5vZGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkVHJlZU5vZGUobm9kZTogVGh5VHJlZU5vZGUsIHBhcmVudD86IFRoeVRyZWVOb2RlLCBpbmRleCA9IC0xKSB7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydE5vZGUgPSBuZXcgVGh5VHJlZU5vZGUobm9kZS5vcmlnaW4sIHBhcmVudCwgdGhpcyk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGluc2VydE5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChpbnNlcnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC5vcmlnaW4uY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRyZW4ubWFwKGl0ZW0gPT4gaXRlbS5vcmlnaW4pO1xuICAgICAgICAgICAgdGhpcy5zeW5jTm9kZUNoZWNrU3RhdGUocGFyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydE5vZGUgPSBuZXcgVGh5VHJlZU5vZGUobm9kZS5vcmlnaW4sIG51bGwsIHRoaXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVOb2Rlcy5zcGxpY2UoaW5kZXgsIDAsIGluc2VydE5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyZWVOb2Rlcy5wdXNoKGluc2VydE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5UcmVlTm9kZXMgPSB0aGlzLnRyZWVOb2Rlcy5tYXAoaXRlbSA9PiBpdGVtLm9yaWdpbik7XG4gICAgICAgICAgICAvLyB0aGlzLnN5bmNOb2RlQ2hlY2tTdGF0ZShpbnNlcnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBhbmRUcmVlTm9kZXMoa2V5T3JLZXlzOiBzdHJpbmcgfCBudW1iZXIgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBjb2VyY2VBcnJheShrZXlPcktleXMpO1xuICAgICAgICBjb25zdCBuZWVkRXhwYW5kTm9kZXMgPSB0aGlzLmdldFBhcmFsbGVsVHJlZU5vZGVzKHRoaXMudHJlZU5vZGVzKS5maWx0ZXIobm9kZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5pbmRleE9mKG5vZGUua2V5KSA+IC0xO1xuICAgICAgICB9KTtcbiAgICAgICAgbmVlZEV4cGFuZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBub2RlLnNldEV4cGFuZGVkKHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuICAgIH1cblxuICAgIC8vIOiuvue9ruiKgueCuemAieS4reeKtuaAgVxuICAgIHB1YmxpYyBzZXROb2RlQ2hlY2tlZChub2RlOiBUaHlUcmVlTm9kZSwgY2hlY2tlZDogYm9vbGVhbiwgcHJvcGFnYXRlVXAgPSB0cnVlLCBwcm9wYWdhdGVEb3duID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLl9zZXROb2RlQ2hlY2tlZChub2RlLCBjaGVja2VkLCBwcm9wYWdhdGVVcCwgcHJvcGFnYXRlRG93bik7XG4gICAgICAgIHRoaXMuc3luY0ZsYXR0ZW5UcmVlTm9kZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXROb2RlQ2hlY2tlZChub2RlOiBUaHlUcmVlTm9kZSwgY2hlY2tlZDogYm9vbGVhbiwgcHJvcGFnYXRlVXAgPSB0cnVlLCBwcm9wYWdhdGVEb3duID0gdHJ1ZSkge1xuICAgICAgICBpZiAocHJvcGFnYXRlRG93biAmJiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goc3ViTm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0Tm9kZUNoZWNrZWQoc3ViTm9kZSwgY2hlY2tlZCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub2RlLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQWxsQ2hpbGRyZW5DaGVja2VkID0gbm9kZS5jaGlsZHJlbi5ldmVyeShpdGVtID0+IGl0ZW0uaXNDaGVja2VkID09PSBUaHlUcmVlTm9kZUNoZWNrU3RhdGUuY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuaXNDaGVja2VkID0gaXNBbGxDaGlsZHJlbkNoZWNrZWQgPyBUaHlUcmVlTm9kZUNoZWNrU3RhdGUuY2hlY2tlZCA6IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5pbmRldGVybWluYXRlO1xuICAgICAgICAgICAgICAgICAgICBub2RlLm9yaWdpbi5jaGVja2VkID0gaXNBbGxDaGlsZHJlbkNoZWNrZWQgJiYgY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0FsbENoaWxkcmVuVW5DaGVja2VkID0gbm9kZS5jaGlsZHJlbi5ldmVyeShpdGVtID0+IGl0ZW0uaXNDaGVja2VkID09PSBUaHlUcmVlTm9kZUNoZWNrU3RhdGUudW5jaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBpc0FsbENoaWxkcmVuVW5DaGVja2VkID8gVGh5VHJlZU5vZGVDaGVja1N0YXRlLnVuY2hlY2tlZCA6IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5pbmRldGVybWluYXRlO1xuICAgICAgICAgICAgICAgICAgICBub2RlLm9yaWdpbi5jaGVja2VkID0gaXNBbGxDaGlsZHJlblVuQ2hlY2tlZCAmJiBjaGVja2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBjaGVja2VkID8gVGh5VHJlZU5vZGVDaGVja1N0YXRlLmNoZWNrZWQgOiBUaHlUcmVlTm9kZUNoZWNrU3RhdGUudW5jaGVja2VkO1xuICAgICAgICAgICAgICAgIG5vZGUub3JpZ2luLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wYWdhdGVVcCkge1xuICAgICAgICAgICAgdGhpcy5fc3luY05vZGVDaGVja1N0YXRlKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3luY05vZGVDaGVja1N0YXRlKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIHRoaXMuX3N5bmNOb2RlQ2hlY2tTdGF0ZShub2RlKTtcbiAgICAgICAgdGhpcy5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3N5bmNOb2RlQ2hlY2tTdGF0ZShub2RlOiBUaHlUcmVlTm9kZSkge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSB0aGlzLmNoZWNrU3RhdGVSZXNvbHZlKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5fc3luY05vZGVDaGVja1N0YXRlKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXNDaGFuZ2UkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuc3RhdHVzQ2hhbmdlJCA9IG51bGw7XG4gICAgfVxufVxuIl19
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyZWUvdHJlZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFtQixNQUFNLGNBQWMsQ0FBQzs7QUFFdEUsU0FBUyxpQkFBaUIsQ0FBQyxJQUFpQjtJQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUsscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xHLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDO0lBQ3pDLENBQUM7U0FBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4RCxPQUFPLHFCQUFxQixDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8scUJBQXFCLENBQUMsYUFBYSxDQUFDO0lBQy9DLENBQUM7QUFD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SUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDOzhHQS9LUSxjQUFjO2tIQUFkLGNBQWM7OzJGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VBcnJheSwgaXNGdW5jdGlvbiB9IGZyb20gJ25neC10ZXRoeXMvdXRpbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGh5VHJlZU5vZGUgfSBmcm9tICcuL3RyZWUtbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBUaHlUcmVlTm9kZUNoZWNrU3RhdGUsIFRoeVRyZWVOb2RlRGF0YSB9IGZyb20gJy4vdHJlZS5jbGFzcyc7XG5cbmZ1bmN0aW9uIGNoZWNrU3RhdGVSZXNvbHZlKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgY29uc3QgY2hlY2tlZE5vZGVzID0gbm9kZS5jaGlsZHJlbi5maWx0ZXIobiA9PiBuLmlzQ2hlY2tlZCA9PT0gVGh5VHJlZU5vZGVDaGVja1N0YXRlLmNoZWNrZWQpO1xuICAgIGNvbnN0IHVuQ2hlY2tlZE5vZGVzID0gbm9kZS5jaGlsZHJlbi5maWx0ZXIobiA9PiBuLmlzQ2hlY2tlZCA9PT0gVGh5VHJlZU5vZGVDaGVja1N0YXRlLnVuY2hlY2tlZCk7XG4gICAgaWYgKGNoZWNrZWROb2Rlcy5sZW5ndGggPT09IG5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBUaHlUcmVlTm9kZUNoZWNrU3RhdGUuY2hlY2tlZDtcbiAgICB9IGVsc2UgaWYgKHVuQ2hlY2tlZE5vZGVzLmxlbmd0aCA9PT0gbm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS51bmNoZWNrZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5pbmRldGVybWluYXRlO1xuICAgIH1cbn1cblxudHlwZSBGbGF0dGVuQWxsTm9kZXNDYiA9ICh0cmVlTm9kZTogVGh5VHJlZU5vZGUpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGh5VHJlZUZvcm1hdEVtaXRFdmVudCB7XG4gICAgZXZlbnROYW1lOiBzdHJpbmc7XG4gICAgbm9kZTogVGh5VHJlZU5vZGU7XG4gICAgZXZlbnQ/OiBNb3VzZUV2ZW50IHwgRHJhZ0V2ZW50O1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGh5VHJlZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHNlbGVjdGVkTm9kZSE6IFRoeVRyZWVOb2RlO1xuXG4gICAgZmxhdHRlbk5vZGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGh5VHJlZU5vZGVbXT4oW10pO1xuXG4gICAgZmxhdHRlblRyZWVOb2RlczogVGh5VHJlZU5vZGVbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBvcmlnaW5UcmVlTm9kZXM6IFRoeVRyZWVOb2RlRGF0YVtdID0gW107XG5cbiAgICBwdWJsaWMgdHJlZU5vZGVzOiBUaHlUcmVlTm9kZVtdID0gW107XG5cbiAgICBwdWJsaWMgY2hlY2tTdGF0ZVJlc29sdmU6IChub2RlOiBUaHlUcmVlTm9kZSkgPT4gVGh5VHJlZU5vZGVDaGVja1N0YXRlID0gY2hlY2tTdGF0ZVJlc29sdmU7XG5cbiAgICBzdGF0dXNDaGFuZ2UkID0gbmV3IFN1YmplY3Q8VGh5VHJlZUZvcm1hdEVtaXRFdmVudD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXR1c0NoYW5nZSQucGlwZSgpLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnN5bmNGbGF0dGVuVHJlZU5vZGVzKCk7XG4gICAgICAgICAgICB0aGlzLnN5bmNOb2RlQ2hlY2tTdGF0ZShldmVudC5ub2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRpYWxpemVUcmVlTm9kZXMocm9vdE5vZGVzOiBUaHlUcmVlTm9kZURhdGFbXSkge1xuICAgICAgICB0aGlzLm9yaWdpblRyZWVOb2RlcyA9IHJvb3ROb2RlcyB8fCBbXTtcbiAgICAgICAgdGhpcy50cmVlTm9kZXMgPSAocm9vdE5vZGVzIHx8IFtdKS5tYXAobm9kZSA9PiBuZXcgVGh5VHJlZU5vZGUobm9kZSwgbnVsbCwgdGhpcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzeW5jRmxhdHRlblRyZWVOb2RlcygpIHtcbiAgICAgICAgdGhpcy5mbGF0dGVuVHJlZU5vZGVzID0gdGhpcy5nZXRQYXJhbGxlbFRyZWVOb2Rlcyh0aGlzLnRyZWVOb2RlcywgZmFsc2UpO1xuICAgICAgICB0aGlzLmZsYXR0ZW5Ob2RlcyQubmV4dCh0aGlzLmZsYXR0ZW5UcmVlTm9kZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0dGVuVHJlZU5vZGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyYWxsZWxUcmVlTm9kZXMocm9vdFRyZWVzOiBUaHlUcmVlTm9kZVtdID0gdGhpcy50cmVlTm9kZXMsIGZsYXR0ZW5BbGxOb2RlczogYm9vbGVhbiB8IEZsYXR0ZW5BbGxOb2Rlc0NiID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBmbGF0dGVuVHJlZURhdGE6IFRoeVRyZWVOb2RlW10gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gX2dldFBhcmFsbGVsVHJlZU5vZGVzKGxpc3Q6IFRoeVRyZWVOb2RlW10pIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0LmZvckVhY2goKHRyZWVOb2RlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5UcmVlRGF0YS5wdXNoKHRyZWVOb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0dGVuQWxsTm9kZXNGbGFnID0gaXNGdW5jdGlvbihmbGF0dGVuQWxsTm9kZXMpID8gZmxhdHRlbkFsbE5vZGVzKHRyZWVOb2RlKSA6IGZsYXR0ZW5BbGxOb2RlcztcbiAgICAgICAgICAgICAgICBpZiAoZmxhdHRlbkFsbE5vZGVzRmxhZyB8fCB0cmVlTm9kZS5pc0V4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9nZXRQYXJhbGxlbFRyZWVOb2Rlcyh0cmVlTm9kZS5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgX2dldFBhcmFsbGVsVHJlZU5vZGVzKHJvb3RUcmVlcyk7XG4gICAgICAgIHJldHVybiBmbGF0dGVuVHJlZURhdGE7XG4gICAgfVxuXG4gICAgc2V0Q2hlY2tTdGF0ZVJlc29sdmUocmVzb2x2ZTogKG5vZGU6IFRoeVRyZWVOb2RlKSA9PiBUaHlUcmVlTm9kZUNoZWNrU3RhdGUgPSBjaGVja1N0YXRlUmVzb2x2ZSkge1xuICAgICAgICB0aGlzLmNoZWNrU3RhdGVSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRTb3J0ZWRUcmVlTm9kZXModHJlZU5vZGVzOiBUaHlUcmVlTm9kZVtdLCBwYXJlbnQ/OiBUaHlUcmVlTm9kZSkge1xuICAgICAgICB0cmVlTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIG5vZGUubGV2ZWwgPSBub2RlLnBhcmVudE5vZGUgPyBub2RlLnBhcmVudE5vZGUubGV2ZWwgKyAxIDogMDtcbiAgICAgICAgICAgIG5vZGUub3JpZ2luLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5tYXAobiA9PiBuLm9yaWdpbik7XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUgPSBwYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLnJlc2V0U29ydGVkVHJlZU5vZGVzKG5vZGUuY2hpbGRyZW4sIG5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJlZU5vZGUoa2V5OiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYWxsTm9kZXMgPSB0aGlzLmdldFBhcmFsbGVsVHJlZU5vZGVzKHRoaXMudHJlZU5vZGVzKTtcbiAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmZpbmQobiA9PiBuLmtleSA9PT0ga2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RXhwYW5kZWROb2RlcygpOiBUaHlUcmVlTm9kZVtdIHtcbiAgICAgICAgY29uc3QgYWxsTm9kZXMgPSB0aGlzLmdldFBhcmFsbGVsVHJlZU5vZGVzKHRoaXMudHJlZU5vZGVzKTtcbiAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmZpbHRlcihuID0+IG4uaXNFeHBhbmRlZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENoZWNrZWROb2RlcygpOiBUaHlUcmVlTm9kZVtdIHtcbiAgICAgICAgY29uc3QgYWxsTm9kZXMgPSB0aGlzLmdldFBhcmFsbGVsVHJlZU5vZGVzKHRoaXMudHJlZU5vZGVzKTtcbiAgICAgICAgcmV0dXJuIGFsbE5vZGVzLmZpbHRlcihuID0+IG4uaXNDaGVja2VkID09PSBUaHlUcmVlTm9kZUNoZWNrU3RhdGUuY2hlY2tlZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZVRyZWVOb2RlKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5wYXJlbnROb2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgobiA9PiBuLmtleSA9PT0gbm9kZS5rZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5vcmlnaW4uY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoaXRlbSA9PiBpdGVtLm9yaWdpbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jTm9kZUNoZWNrU3RhdGUobm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmVlTm9kZXMuZmluZEluZGV4KG4gPT4gbi5rZXkgPT09IG5vZGUua2V5KTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlTm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpblRyZWVOb2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFRyZWVOb2RlKG5vZGU6IFRoeVRyZWVOb2RlLCBwYXJlbnQ/OiBUaHlUcmVlTm9kZSwgaW5kZXggPSAtMSkge1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnROb2RlID0gbmV3IFRoeVRyZWVOb2RlKG5vZGUub3JpZ2luLCBwYXJlbnQsIHRoaXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAwLCBpbnNlcnROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goaW5zZXJ0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQub3JpZ2luLmNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0ub3JpZ2luKTtcbiAgICAgICAgICAgIHRoaXMuc3luY05vZGVDaGVja1N0YXRlKHBhcmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnROb2RlID0gbmV3IFRoeVRyZWVOb2RlKG5vZGUub3JpZ2luLCBudWxsLCB0aGlzKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlTm9kZXMuc3BsaWNlKGluZGV4LCAwLCBpbnNlcnROb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmVlTm9kZXMucHVzaChpbnNlcnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3JpZ2luVHJlZU5vZGVzID0gdGhpcy50cmVlTm9kZXMubWFwKGl0ZW0gPT4gaXRlbS5vcmlnaW4pO1xuICAgICAgICAgICAgLy8gdGhpcy5zeW5jTm9kZUNoZWNrU3RhdGUoaW5zZXJ0Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwYW5kVHJlZU5vZGVzKGtleU9yS2V5czogc3RyaW5nIHwgbnVtYmVyIHwgKHN0cmluZyB8IG51bWJlcilbXSB8IHRydWUpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGtleU9yS2V5cyA9PT0gdHJ1ZSA/IFtdIDogY29lcmNlQXJyYXkoa2V5T3JLZXlzKTtcbiAgICAgICAgY29uc3QgbmVlZEV4cGFuZE5vZGVzID0gdGhpcy5nZXRQYXJhbGxlbFRyZWVOb2Rlcyh0aGlzLnRyZWVOb2RlcykuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGtleXMuaW5kZXhPZihub2RlLmtleSkgPiAtMSB8fCBrZXlPcktleXMgPT09IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBuZWVkRXhwYW5kTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIG5vZGUuc2V0RXhwYW5kZWQodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN5bmNGbGF0dGVuVHJlZU5vZGVzKCk7XG4gICAgfVxuXG4gICAgLy8g6K6+572u6IqC54K56YCJ5Lit54q25oCBXG4gICAgcHVibGljIHNldE5vZGVDaGVja2VkKG5vZGU6IFRoeVRyZWVOb2RlLCBjaGVja2VkOiBib29sZWFuLCBwcm9wYWdhdGVVcCA9IHRydWUsIHByb3BhZ2F0ZURvd24gPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3NldE5vZGVDaGVja2VkKG5vZGUsIGNoZWNrZWQsIHByb3BhZ2F0ZVVwLCBwcm9wYWdhdGVEb3duKTtcbiAgICAgICAgdGhpcy5zeW5jRmxhdHRlblRyZWVOb2RlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldE5vZGVDaGVja2VkKG5vZGU6IFRoeVRyZWVOb2RlLCBjaGVja2VkOiBib29sZWFuLCBwcm9wYWdhdGVVcCA9IHRydWUsIHByb3BhZ2F0ZURvd24gPSB0cnVlKSB7XG4gICAgICAgIGlmIChwcm9wYWdhdGVEb3duICYmIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChzdWJOb2RlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXROb2RlQ2hlY2tlZChzdWJOb2RlLCBjaGVja2VkLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vZGUuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNBbGxDaGlsZHJlbkNoZWNrZWQgPSBub2RlLmNoaWxkcmVuLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5pc0NoZWNrZWQgPT09IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5jaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pc0NoZWNrZWQgPSBpc0FsbENoaWxkcmVuQ2hlY2tlZCA/IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS5jaGVja2VkIDogVGh5VHJlZU5vZGVDaGVja1N0YXRlLmluZGV0ZXJtaW5hdGU7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUub3JpZ2luLmNoZWNrZWQgPSBpc0FsbENoaWxkcmVuQ2hlY2tlZCAmJiBjaGVja2VkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQWxsQ2hpbGRyZW5VbkNoZWNrZWQgPSBub2RlLmNoaWxkcmVuLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5pc0NoZWNrZWQgPT09IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS51bmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IGlzQWxsQ2hpbGRyZW5VbkNoZWNrZWQgPyBUaHlUcmVlTm9kZUNoZWNrU3RhdGUudW5jaGVja2VkIDogVGh5VHJlZU5vZGVDaGVja1N0YXRlLmluZGV0ZXJtaW5hdGU7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUub3JpZ2luLmNoZWNrZWQgPSBpc0FsbENoaWxkcmVuVW5DaGVja2VkICYmIGNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IGNoZWNrZWQgPyBUaHlUcmVlTm9kZUNoZWNrU3RhdGUuY2hlY2tlZCA6IFRoeVRyZWVOb2RlQ2hlY2tTdGF0ZS51bmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgbm9kZS5vcmlnaW4uY2hlY2tlZCA9IGNoZWNrZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BhZ2F0ZVVwKSB7XG4gICAgICAgICAgICB0aGlzLl9zeW5jTm9kZUNoZWNrU3RhdGUobm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzeW5jTm9kZUNoZWNrU3RhdGUobm9kZTogVGh5VHJlZU5vZGUpIHtcbiAgICAgICAgdGhpcy5fc3luY05vZGVDaGVja1N0YXRlKG5vZGUpO1xuICAgICAgICB0aGlzLnN5bmNGbGF0dGVuVHJlZU5vZGVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3luY05vZGVDaGVja1N0YXRlKG5vZGU6IFRoeVRyZWVOb2RlKSB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBub2RlLmlzQ2hlY2tlZCA9IHRoaXMuY2hlY2tTdGF0ZVJlc29sdmUobm9kZSk7XG4gICAgICAgICAgICB0aGlzLl9zeW5jTm9kZUNoZWNrU3RhdGUobm9kZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1c0NoYW5nZSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5zdGF0dXNDaGFuZ2UkID0gbnVsbDtcbiAgICB9XG59XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  import { Version } from '@angular/core';
2
- export const VERSION = new Version('17.0.12');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVyc2lvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IG5ldyBWZXJzaW9uKCcxNy4wLjEyJyk7XG4iXX0=
2
+ export const VERSION = new Version('17.0.13');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmVyc2lvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IG5ldyBWZXJzaW9uKCcxNy4wLjEzJyk7XG4iXX0=
@@ -244,9 +244,9 @@ class ThyTreeService {
244
244
  }
245
245
  }
246
246
  expandTreeNodes(keyOrKeys) {
247
- const keys = coerceArray(keyOrKeys);
247
+ const keys = keyOrKeys === true ? [] : coerceArray(keyOrKeys);
248
248
  const needExpandNodes = this.getParallelTreeNodes(this.treeNodes).filter(node => {
249
- return keys.indexOf(node.key) > -1;
249
+ return keys.indexOf(node.key) > -1 || keyOrKeys === true;
250
250
  });
251
251
  needExpandNodes.forEach(node => {
252
252
  node.setExpanded(true);
@@ -681,6 +681,10 @@ class ThyTree {
681
681
  * @type boolean
682
682
  */
683
683
  this.thyTitleTruncate = true;
684
+ /**
685
+ * 是否展开所有树节点
686
+ */
687
+ this.thyExpandAll = false;
684
688
  /**
685
689
  * 设置缩进距离,缩进距离 = thyIndent * node.level
686
690
  * @type number
@@ -755,6 +759,12 @@ class ThyTree {
755
759
  this._selectedKeys = changes.thySelectedKeys.currentValue;
756
760
  this._selectTreeNodes(changes.thySelectedKeys.currentValue);
757
761
  }
762
+ if (changes.thyExpandedKeys && !changes.thyExpandedKeys.isFirstChange()) {
763
+ this._handleExpandedKeys();
764
+ }
765
+ if (changes.thyExpandAll && !changes.thyExpandAll.isFirstChange()) {
766
+ this._handleExpandedKeys();
767
+ }
758
768
  }
759
769
  eventTriggerChanged(event) {
760
770
  switch (event.eventName) {
@@ -772,7 +782,13 @@ class ThyTree {
772
782
  this.thyTreeService.initializeTreeNodes(this.thyNodes);
773
783
  this.flattenTreeNodes = this.thyTreeService.flattenTreeNodes;
774
784
  this._selectTreeNodes(this._selectedKeys);
775
- this.thyTreeService.expandTreeNodes(this._expandedKeys);
785
+ this._handleExpandedKeys();
786
+ }
787
+ _handleExpandedKeys() {
788
+ if (this.thyExpandedKeys?.length) {
789
+ this._expandedKeys = helpers.concatArray(this.thyExpandedKeys.filter(key => !this._expandedKeys.includes(key)), this._expandedKeys);
790
+ }
791
+ this.thyTreeService.expandTreeNodes(this.thyExpandAll || this._expandedKeys);
776
792
  }
777
793
  _setTreeType() {
778
794
  if (this.thyType && treeTypeClassMap[this.thyType]) {
@@ -1024,7 +1040,7 @@ class ThyTree {
1024
1040
  this.destroy$.complete();
1025
1041
  }
1026
1042
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: ThyTree, deps: [{ token: ThyTreeService }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
1027
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.2.3", type: ThyTree, isStandalone: true, selector: "thy-tree", inputs: { thyNodes: "thyNodes", thyShowExpand: "thyShowExpand", thyMultiple: ["thyMultiple", "thyMultiple", coerceBooleanProperty], thyDraggable: ["thyDraggable", "thyDraggable", coerceBooleanProperty], thyCheckable: ["thyCheckable", "thyCheckable", coerceBooleanProperty], thyClickBehavior: "thyClickBehavior", thyCheckStateResolve: "thyCheckStateResolve", thyAsync: ["thyAsync", "thyAsync", coerceBooleanProperty], thyType: "thyType", thyIcons: "thyIcons", thySize: "thySize", thyVirtualScroll: ["thyVirtualScroll", "thyVirtualScroll", coerceBooleanProperty], thyItemSize: ["thyItemSize", "thyItemSize", numberAttribute], thyTitleTruncate: ["thyTitleTruncate", "thyTitleTruncate", coerceBooleanProperty], thySelectedKeys: "thySelectedKeys", thyIndent: ["thyIndent", "thyIndent", numberAttribute], thyBeforeDragStart: "thyBeforeDragStart", thyBeforeDragDrop: "thyBeforeDragDrop" }, outputs: { viewport: "viewport", thyOnClick: "thyOnClick", thyOnCheckboxChange: "thyOnCheckboxChange", thyOnExpandChange: "thyOnExpandChange", thyOnDragDrop: "thyOnDragDrop", thyDblClick: "thyDblClick" }, host: { properties: { "class.thy-multiple-selection-list": "this.thyMultiple", "class.thy-tree-draggable": "this.thyDraggable", "class.thy-virtual-scrolling-tree": "this.thyVirtualScroll", "class.thy-tree": "this.thyTreeClass", "class.thy-tree-dragging": "this.dragging" } }, providers: [
1043
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.2.3", type: ThyTree, isStandalone: true, selector: "thy-tree", inputs: { thyNodes: "thyNodes", thyShowExpand: "thyShowExpand", thyMultiple: ["thyMultiple", "thyMultiple", coerceBooleanProperty], thyDraggable: ["thyDraggable", "thyDraggable", coerceBooleanProperty], thyCheckable: ["thyCheckable", "thyCheckable", coerceBooleanProperty], thyClickBehavior: "thyClickBehavior", thyCheckStateResolve: "thyCheckStateResolve", thyAsync: ["thyAsync", "thyAsync", coerceBooleanProperty], thyType: "thyType", thyIcons: "thyIcons", thySize: "thySize", thyVirtualScroll: ["thyVirtualScroll", "thyVirtualScroll", coerceBooleanProperty], thyItemSize: ["thyItemSize", "thyItemSize", numberAttribute], thyTitleTruncate: ["thyTitleTruncate", "thyTitleTruncate", coerceBooleanProperty], thySelectedKeys: "thySelectedKeys", thyExpandedKeys: "thyExpandedKeys", thyExpandAll: ["thyExpandAll", "thyExpandAll", coerceBooleanProperty], thyIndent: ["thyIndent", "thyIndent", numberAttribute], thyBeforeDragStart: "thyBeforeDragStart", thyBeforeDragDrop: "thyBeforeDragDrop" }, outputs: { viewport: "viewport", thyOnClick: "thyOnClick", thyOnCheckboxChange: "thyOnCheckboxChange", thyOnExpandChange: "thyOnExpandChange", thyOnDragDrop: "thyOnDragDrop", thyDblClick: "thyDblClick" }, host: { properties: { "class.thy-multiple-selection-list": "this.thyMultiple", "class.thy-tree-draggable": "this.thyDraggable", "class.thy-virtual-scrolling-tree": "this.thyVirtualScroll", "class.thy-tree": "this.thyTreeClass", "class.thy-tree-dragging": "this.dragging" } }, providers: [
1028
1044
  {
1029
1045
  provide: NG_VALUE_ACCESSOR,
1030
1046
  useExisting: forwardRef(() => ThyTree),
@@ -1115,6 +1131,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
1115
1131
  args: [{ transform: coerceBooleanProperty }]
1116
1132
  }], thySelectedKeys: [{
1117
1133
  type: Input
1134
+ }], thyExpandedKeys: [{
1135
+ type: Input
1136
+ }], thyExpandAll: [{
1137
+ type: Input,
1138
+ args: [{ transform: coerceBooleanProperty }]
1118
1139
  }], thyIndent: [{
1119
1140
  type: Input,
1120
1141
  args: [{ transform: numberAttribute }]
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-tethys-tree.mjs","sources":["../../../src/tree/tree-abstract.ts","../../../src/tree/tree.class.ts","../../../src/tree/tree-node.class.ts","../../../src/tree/tree.service.ts","../../../src/tree/tree-node.component.ts","../../../src/tree/tree-node.component.html","../../../src/tree/tree.pipe.ts","../../../src/tree/tree.component.ts","../../../src/tree/tree.component.html","../../../src/tree/tree.module.ts","../../../src/tree/ngx-tethys-tree.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeBeforeDragDropContext, ThyTreeBeforeDragStartContext, ThyTreeDragDropEvent, ThyTreeIcons } from './tree.class';\n\nexport interface ThyTreeAbstractComponent {\n thyMultiple: boolean;\n thyDraggable: boolean;\n thyShowExpand: boolean;\n treeNodes: ThyTreeNode[];\n thyIcons: ThyTreeIcons;\n thyBeforeDragStart(e: ThyTreeBeforeDragStartContext): boolean;\n thyBeforeDragDrop(e: ThyTreeBeforeDragDropContext): boolean;\n onDragDrop(event: ThyTreeDragDropEvent): void;\n selectTreeNode(node: ThyTreeNode): void;\n toggleTreeNode(node: ThyTreeNode): void;\n isShowExpand(node: ThyTreeNode): boolean;\n trackByFn(number: string, node: ThyTreeNode): string | number;\n isSelected(node: ThyTreeNode): boolean;\n}\n\nexport const THY_TREE_ABSTRACT_TOKEN = new InjectionToken<ThyTreeAbstractComponent>('thy-tree-abstract-token');\n","import { ThyTreeNode } from './tree-node.class';\n\nexport enum ThyTreeNodeCheckState {\n unchecked = 0,\n checked = 1,\n indeterminate = 2\n}\n\nexport enum ThyTreeDropPosition {\n in = 'in',\n before = 'before',\n after = 'after'\n}\n\nexport interface ThyTreeNodeData<T = any> {\n key?: number | string;\n\n title?: string;\n\n icon?: string;\n\n iconStyle?: {\n [key: string]: any;\n };\n\n children?: ThyTreeNodeData<T>[];\n\n origin?: any;\n\n expanded?: boolean;\n\n disabled?: boolean;\n\n checked?: boolean;\n\n data?: T;\n\n itemClass?: string | string[];\n\n [key: string]: any;\n}\n\nexport interface ThyTreeEmitEvent<T = any> {\n eventName: string;\n\n node?: ThyTreeNode<T>;\n\n event?: Event | any;\n\n dragNode?: ThyTreeNode<T>;\n\n targetNode?: ThyTreeNode<T>;\n}\n\nexport interface ThyTreeBeforeDragStartContext {\n item: ThyTreeNode;\n}\n\nexport interface ThyTreeBeforeDragDropContext {\n item?: ThyTreeNode;\n containerItems?: ThyTreeNode[];\n previousItem?: ThyTreeNode;\n previousContainerItems?: ThyTreeNode[];\n position?: ThyTreeDropPosition;\n}\n\nexport interface ThyTreeDragDropEvent<T = any> {\n dragNode?: ThyTreeNode<T>;\n\n targetNode?: ThyTreeNode<T>;\n\n afterNode?: ThyTreeNode<T>;\n}\n\nexport class ThyTreeIcons {\n expand?: string;\n collapse?: string;\n}\n\nexport type ThyClickBehavior = 'default' | 'selectCheckbox';\n","import { helpers, isArray } from 'ngx-tethys/util';\n\nimport { ThyTreeNodeCheckState, ThyTreeNodeData } from './tree.class';\nimport { ThyTreeService } from './tree.service';\n\nexport class ThyTreeNode<T = any> {\n key?: number | string;\n\n title?: string;\n\n children: ThyTreeNode[];\n\n parentNode: ThyTreeNode;\n\n level = 0;\n\n origin: ThyTreeNodeData<T>;\n\n isExpanded: boolean;\n\n isChecked: ThyTreeNodeCheckState;\n\n isLoading: boolean;\n\n isDisabled: boolean;\n\n itemClass?: string[];\n\n private readonly service: ThyTreeService;\n\n get treeService(): ThyTreeService {\n if (this.service) {\n return this.service;\n } else if (this.parentNode) {\n return this.parentNode.treeService;\n }\n }\n\n constructor(node: ThyTreeNodeData, parent: ThyTreeNode = null, service?: ThyTreeService) {\n this.title = node.title;\n this.key = node.key;\n this.children = [];\n this.parentNode = parent;\n this.level = parent ? parent.level + 1 : this.level;\n this.origin = node;\n this.isDisabled = node.disabled || false;\n this.isExpanded = node.expanded || false;\n this.isChecked = node.checked ? ThyTreeNodeCheckState.checked : ThyTreeNodeCheckState.unchecked;\n this.isLoading = false;\n if (node.itemClass) {\n this.itemClass = isArray(node.itemClass) ? node.itemClass : [node.itemClass];\n }\n if (node.children) {\n node.children.forEach(childNode => {\n this.children.push(new ThyTreeNode(childNode, this, service));\n });\n }\n this.service = service;\n if (node.children && node.children.length && service) {\n this.isChecked = service.checkStateResolve(this);\n }\n }\n\n public setKey(key: string) {\n this.origin.key = key;\n this.key = key;\n }\n\n public setTitle(title: string) {\n this.origin.title = title;\n this.title = title;\n }\n\n public setLevel(level: number) {\n this.level = level;\n }\n\n private _setExpanded(expanded: boolean, propagate = false) {\n this.origin.expanded = expanded;\n this.isExpanded = expanded;\n if (propagate && this.children) {\n this.children.forEach(n => n._setExpanded(expanded, propagate));\n }\n }\n\n public setExpanded(expanded: boolean, propagate = false) {\n this._setExpanded(expanded, propagate);\n this.treeService.syncFlattenTreeNodes();\n }\n\n public setLoading(loading: boolean): void {\n this.isLoading = loading;\n this.treeService.syncFlattenTreeNodes();\n }\n\n public setChecked(checked: boolean, propagateUp = true, propagateDown = true) {\n this.treeService.setNodeChecked(this, checked, propagateUp, propagateDown);\n }\n\n public syncNodeCheckState() {\n this.treeService.syncNodeCheckState(this);\n }\n\n public getParentNode(): ThyTreeNode {\n return this.parentNode;\n }\n\n public getChildren(): ThyTreeNode[] {\n return this.children;\n }\n\n public addChildren(children: ThyTreeNodeData | ThyTreeNodeData[], index: number = -1): void {\n children = helpers.coerceArray(children);\n ((children as ThyTreeNodeData[]) || []).forEach((childNode: ThyTreeNodeData, i: number) => {\n if (index === -1) {\n this.children.push(new ThyTreeNode(childNode, this));\n } else {\n this.children.splice(index + i, 0, new ThyTreeNode(childNode, this, this.treeService));\n }\n });\n\n this.origin.children = this.getChildren().map(n => n.origin);\n this.setLoading(false);\n this.treeService.statusChange$.next({\n eventName: 'addChildren',\n node: this\n });\n }\n}\n","import { coerceArray, isFunction } from 'ngx-tethys/util';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeNodeCheckState, ThyTreeNodeData } from './tree.class';\n\nfunction checkStateResolve(node: ThyTreeNode) {\n const checkedNodes = node.children.filter(n => n.isChecked === ThyTreeNodeCheckState.checked);\n const unCheckedNodes = node.children.filter(n => n.isChecked === ThyTreeNodeCheckState.unchecked);\n if (checkedNodes.length === node.children.length) {\n return ThyTreeNodeCheckState.checked;\n } else if (unCheckedNodes.length === node.children.length) {\n return ThyTreeNodeCheckState.unchecked;\n } else {\n return ThyTreeNodeCheckState.indeterminate;\n }\n}\n\ntype FlattenAllNodesCb = (treeNode: ThyTreeNode) => boolean;\n\nexport interface ThyTreeFormatEmitEvent {\n eventName: string;\n node: ThyTreeNode;\n event?: MouseEvent | DragEvent;\n}\n\n/**\n * @internal\n */\n@Injectable()\nexport class ThyTreeService implements OnDestroy {\n selectedNode!: ThyTreeNode;\n\n flattenNodes$ = new BehaviorSubject<ThyTreeNode[]>([]);\n\n flattenTreeNodes: ThyTreeNode[] = [];\n\n private originTreeNodes: ThyTreeNodeData[] = [];\n\n public treeNodes: ThyTreeNode[] = [];\n\n public checkStateResolve: (node: ThyTreeNode) => ThyTreeNodeCheckState = checkStateResolve;\n\n statusChange$ = new Subject<ThyTreeFormatEmitEvent>();\n\n constructor() {\n this.statusChange$.pipe().subscribe(event => {\n this.syncFlattenTreeNodes();\n this.syncNodeCheckState(event.node);\n });\n }\n\n public initializeTreeNodes(rootNodes: ThyTreeNodeData[]) {\n this.originTreeNodes = rootNodes || [];\n this.treeNodes = (rootNodes || []).map(node => new ThyTreeNode(node, null, this));\n }\n\n public syncFlattenTreeNodes() {\n this.flattenTreeNodes = this.getParallelTreeNodes(this.treeNodes, false);\n this.flattenNodes$.next(this.flattenTreeNodes);\n return this.flattenTreeNodes;\n }\n\n private getParallelTreeNodes(rootTrees: ThyTreeNode[] = this.treeNodes, flattenAllNodes: boolean | FlattenAllNodesCb = true) {\n const flattenTreeData: ThyTreeNode[] = [];\n function _getParallelTreeNodes(list: ThyTreeNode[]) {\n return list.forEach((treeNode, index) => {\n flattenTreeData.push(treeNode);\n const flattenAllNodesFlag = isFunction(flattenAllNodes) ? flattenAllNodes(treeNode) : flattenAllNodes;\n if (flattenAllNodesFlag || treeNode.isExpanded) {\n _getParallelTreeNodes(treeNode.children);\n }\n });\n }\n _getParallelTreeNodes(rootTrees);\n return flattenTreeData;\n }\n\n setCheckStateResolve(resolve: (node: ThyTreeNode) => ThyTreeNodeCheckState = checkStateResolve) {\n this.checkStateResolve = resolve;\n }\n\n public resetSortedTreeNodes(treeNodes: ThyTreeNode[], parent?: ThyTreeNode) {\n treeNodes.forEach(node => {\n node.level = node.parentNode ? node.parentNode.level + 1 : 0;\n node.origin.children = node.children.map(n => n.origin);\n node.parentNode = parent;\n this.resetSortedTreeNodes(node.children, node);\n });\n }\n\n public getTreeNode(key: string | number) {\n const allNodes = this.getParallelTreeNodes(this.treeNodes);\n return allNodes.find(n => n.key === key);\n }\n\n public getExpandedNodes(): ThyTreeNode[] {\n const allNodes = this.getParallelTreeNodes(this.treeNodes);\n return allNodes.filter(n => n.isExpanded);\n }\n\n public getCheckedNodes(): ThyTreeNode[] {\n const allNodes = this.getParallelTreeNodes(this.treeNodes);\n return allNodes.filter(n => n.isChecked === ThyTreeNodeCheckState.checked);\n }\n\n public deleteTreeNode(node: ThyTreeNode) {\n if (node.parentNode) {\n const children = node.parentNode.children;\n const index = children.findIndex(n => n.key === node.key);\n if (index > -1) {\n children.splice(index, 1);\n node.parentNode.origin.children = children.map(item => item.origin);\n this.syncNodeCheckState(node.parentNode);\n }\n } else {\n const index = this.treeNodes.findIndex(n => n.key === node.key);\n if (index > -1) {\n this.treeNodes.splice(index, 1);\n this.originTreeNodes.splice(index, 1);\n }\n }\n }\n\n public addTreeNode(node: ThyTreeNode, parent?: ThyTreeNode, index = -1) {\n if (parent) {\n const insertNode = new ThyTreeNode(node.origin, parent, this);\n if (index > -1) {\n parent.children.splice(index, 0, insertNode);\n } else {\n parent.children.push(insertNode);\n }\n parent.origin.children = parent.children.map(item => item.origin);\n this.syncNodeCheckState(parent);\n } else {\n const insertNode = new ThyTreeNode(node.origin, null, this);\n if (index > -1) {\n this.treeNodes.splice(index, 0, insertNode);\n } else {\n this.treeNodes.push(insertNode);\n }\n this.originTreeNodes = this.treeNodes.map(item => item.origin);\n // this.syncNodeCheckState(insertNode);\n }\n }\n\n public expandTreeNodes(keyOrKeys: string | number | (string | number)[]) {\n const keys = coerceArray(keyOrKeys);\n const needExpandNodes = this.getParallelTreeNodes(this.treeNodes).filter(node => {\n return keys.indexOf(node.key) > -1;\n });\n needExpandNodes.forEach(node => {\n node.setExpanded(true);\n });\n this.syncFlattenTreeNodes();\n }\n\n // 设置节点选中状态\n public setNodeChecked(node: ThyTreeNode, checked: boolean, propagateUp = true, propagateDown = true) {\n this._setNodeChecked(node, checked, propagateUp, propagateDown);\n this.syncFlattenTreeNodes();\n }\n\n private _setNodeChecked(node: ThyTreeNode, checked: boolean, propagateUp = true, propagateDown = true) {\n if (propagateDown && node.children) {\n node.children.forEach(subNode => {\n this._setNodeChecked(subNode, checked, false, true);\n });\n }\n if (!node.isDisabled) {\n if (node.children.length) {\n if (checked) {\n const isAllChildrenChecked = node.children.every(item => item.isChecked === ThyTreeNodeCheckState.checked);\n node.isChecked = isAllChildrenChecked ? ThyTreeNodeCheckState.checked : ThyTreeNodeCheckState.indeterminate;\n node.origin.checked = isAllChildrenChecked && checked;\n } else {\n const isAllChildrenUnChecked = node.children.every(item => item.isChecked === ThyTreeNodeCheckState.unchecked);\n node.isChecked = isAllChildrenUnChecked ? ThyTreeNodeCheckState.unchecked : ThyTreeNodeCheckState.indeterminate;\n node.origin.checked = isAllChildrenUnChecked && checked;\n }\n } else {\n node.isChecked = checked ? ThyTreeNodeCheckState.checked : ThyTreeNodeCheckState.unchecked;\n node.origin.checked = checked;\n }\n }\n if (propagateUp) {\n this._syncNodeCheckState(node.parentNode);\n }\n }\n\n public syncNodeCheckState(node: ThyTreeNode) {\n this._syncNodeCheckState(node);\n this.syncFlattenTreeNodes();\n }\n\n private _syncNodeCheckState(node: ThyTreeNode) {\n if (node) {\n node.isChecked = this.checkStateResolve(node);\n this._syncNodeCheckState(node.parentNode);\n }\n }\n\n ngOnDestroy(): void {\n this.statusChange$.complete();\n this.statusChange$ = null;\n }\n}\n","import { Subject } from 'rxjs';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport {\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n numberAttribute\n} from '@angular/core';\n\nimport { THY_TREE_ABSTRACT_TOKEN, ThyTreeAbstractComponent } from './tree-abstract';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeEmitEvent, ThyTreeNodeCheckState, ThyClickBehavior } from './tree.class';\nimport { ThyTreeService } from './tree.service';\nimport { ThyLoading } from 'ngx-tethys/loading';\nimport { ThyIcon } from 'ngx-tethys/icon';\nimport { NgIf, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { coerceBooleanProperty } from 'ngx-tethys/util';\n\nconst passiveEventListenerOptions = <AddEventListenerOptions>normalizePassiveListenerOptions({ passive: true });\n\n/**\n * 树形控件的节点组件\n * @private\n * @name thy-tree-node\n */\n@Component({\n selector: 'thy-tree-node',\n templateUrl: './tree-node.component.html',\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, ThyIcon, NgClass, NgStyle, NgTemplateOutlet, ThyLoading]\n})\nexport class ThyTreeNodeComponent implements OnDestroy, OnInit, OnChanges {\n /**\n * node 节点展现所需的数据\n */\n @Input() node: ThyTreeNode;\n\n /**\n * 设置 TreeNode 是否支持异步加载\n */\n @Input({ transform: coerceBooleanProperty }) thyAsync = false;\n\n /**\n * 设置 TreeNode 是否支持多选节点\n */\n @Input({ transform: coerceBooleanProperty }) thyMultiple = false;\n\n /**\n * 设置 TreeNode 是否支持拖拽排序\n */\n @Input({ transform: coerceBooleanProperty }) thyDraggable = false;\n\n /**\n * 设置 TreeNode 是否支持 Checkbox 选择\n */\n @Input({ transform: coerceBooleanProperty }) thyCheckable = false;\n\n /**\n * 点击节点的行为,`default` 为选中当前节点,`selectCheckbox` 为选中节点的 Checkbox, `thyCheckable` 为 true 时生效。\n * @default default\n */\n @Input() thyClickBehavior: ThyClickBehavior;\n\n /**\n * 设置节点名称是否支持超出截取\n * @default false\n */\n @Input({ transform: coerceBooleanProperty }) thyTitleTruncate: boolean;\n\n /**\n * 设置 TreeNode 的渲染模板\n */\n @Input() templateRef: TemplateRef<any>;\n\n /**\n * 设置子的空数据渲染模板\n */\n @Input() emptyChildrenTemplateRef: TemplateRef<any>;\n\n /**\n * 设置 node 点击事件\n */\n @Output() thyOnClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 双击 node 事件\n */\n @Output() thyDblClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 点击展开触发事件\n */\n @Output() thyOnExpandChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 check 选择事件\n */\n @Output() thyOnCheckboxChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 childrenTree 的渲染模板\n */\n @ContentChild('childrenTree') childrenTreeTemplateRef: TemplateRef<any>;\n\n /** The native `<div class=\"thy-tree-node-wrapper thy-sortable-item\"></div>` element. */\n @ViewChild('treeNodeWrapper', { static: true }) treeNodeWrapper: ElementRef<HTMLElement>;\n\n @HostBinding('class.thy-tree-node') thyTreeNodeClass = true;\n\n @HostBinding('class') itemClass: string;\n\n /**\n * 开启虚拟滚动时,单行节点的高度,当`thySize`为`default`时,该参数才生效\n */\n @Input({ transform: numberAttribute }) thyItemSize = 44;\n\n /**\n * 设置节点缩进距离,缩进距离 = thyIndent * node.level\n */\n @Input({ transform: numberAttribute }) thyIndent = 25;\n\n public get nodeIcon() {\n return this.node.origin.icon;\n }\n\n public get nodeIconStyle() {\n return this.node.origin.iconStyle;\n }\n\n private destroy$ = new Subject<void>();\n\n checkState = ThyTreeNodeCheckState;\n\n constructor(@Inject(THY_TREE_ABSTRACT_TOKEN) public root: ThyTreeAbstractComponent, public thyTreeService: ThyTreeService) {}\n\n public clickNode(event: Event) {\n if (this.node.isDisabled) {\n this.expandNode(event);\n } else {\n if (this.thyCheckable && this.thyClickBehavior === 'selectCheckbox') {\n this.clickNodeCheck(event);\n } else {\n if (this.root.thyMultiple) {\n this.root.toggleTreeNode(this.node);\n } else {\n this.root.selectTreeNode(this.node);\n }\n }\n }\n this.thyOnClick.emit({\n eventName: 'click',\n event: event,\n node: this.node\n });\n }\n\n public dbClickNode(event: Event) {\n this.thyDblClick.emit({\n eventName: 'dbclick',\n event: event,\n node: this.node\n });\n }\n\n public clickNodeCheck(event: Event) {\n event.stopPropagation();\n if (this.node.isChecked === ThyTreeNodeCheckState.unchecked) {\n this.node.setChecked(true);\n } else if (this.node.isChecked === ThyTreeNodeCheckState.checked) {\n this.node.setChecked(false);\n } else if (this.node.isChecked === ThyTreeNodeCheckState.indeterminate) {\n if (this.node.children?.length) {\n const activeChildren = this.node.children.filter(item => !item.isDisabled);\n const isAllActiveChildrenChecked = activeChildren.every(item => item.isChecked);\n this.node.setChecked(!isAllActiveChildrenChecked);\n } else {\n this.node.setChecked(true);\n }\n }\n this.thyOnCheckboxChange.emit({\n eventName: 'checkboxChange',\n event: event,\n node: this.node\n });\n }\n\n public expandNode(event: Event) {\n event.stopPropagation();\n this.node.setExpanded(!this.node.isExpanded);\n if (this.root.thyShowExpand) {\n this.thyOnExpandChange.emit({\n eventName: 'expand',\n event: event,\n node: this.node\n });\n if (this.thyAsync && this.node.children.length === 0) {\n this.node.setLoading(true);\n }\n }\n }\n\n public isShowExpand(node: ThyTreeNode) {\n return this.root.isShowExpand(node);\n }\n\n ngOnInit(): void {\n this.itemClass = this.node?.itemClass?.join(' ');\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.node && !changes.node.isFirstChange()) {\n this.itemClass = changes?.node?.currentValue.itemClass?.join(' ');\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<div\n #treeNodeWrapper\n class=\"thy-tree-node-wrapper\"\n [class.active]=\"root.isSelected(node)\"\n [class.disabled]=\"node.isDisabled\"\n [class.expand]=\"node.children.length\"\n [style.height]=\"thyItemSize + 'px'\"\n (click)=\"clickNode($event)\"\n>\n <span class=\"thy-tree-index\" [style.width.px]=\"node.level * thyIndent\"></span>\n <span class=\"thy-tree-drag-icon\">\n <thy-icon thyIconName=\"drag\"></thy-icon>\n </span>\n <span class=\"thy-tree-expand\" (click)=\"expandNode($event)\">\n <ng-container *ngIf=\"isShowExpand(node)\">\n <ng-container *ngIf=\"(node.children && node.children.length > 0) || thyAsync || emptyChildrenTemplateRef\">\n <thy-icon\n *ngIf=\"root.thyIcons?.expand && root.thyIcons?.collapse; else defaultIcon\"\n class=\"thy-tree-expand-icon\"\n [thyIconName]=\"node.isExpanded ? root.thyIcons.expand : root.thyIcons.collapse\"\n ></thy-icon>\n <ng-template #defaultIcon>\n <thy-icon class=\"thy-tree-expand-icon\" [class.collapse]=\"!node.isExpanded\" thyIconName=\"caret-right-down\"></thy-icon>\n </ng-template>\n </ng-container>\n </ng-container>\n </span>\n\n <span class=\"thy-tree-node-content\" (dblclick)=\"dbClickNode($event)\">\n <input\n *ngIf=\"thyCheckable\"\n type=\"checkbox\"\n class=\"thy-tree-node-check\"\n [class.form-check-indeterminate]=\"node.isChecked === checkState.indeterminate\"\n [class.form-unchecked]=\"node.isChecked === checkState.unchecked\"\n [checked]=\"node.isChecked === checkState.checked\"\n [disabled]=\"node.isDisabled\"\n (click)=\"clickNodeCheck($event)\"\n />\n <ng-container *ngIf=\"!templateRef\">\n <ng-container *ngIf=\"nodeIcon\">\n <span class=\"thy-tree-node-icon\"> <i [ngClass]=\"nodeIcon\" [ngStyle]=\"nodeIconStyle\"></i></span>\n </ng-container>\n <span [title]=\"node.title\" class=\"thy-tree-node-title\" [class.truncate]=\"thyTitleTruncate\"> {{ node.title }}</span>\n </ng-container>\n <ng-container *ngIf=\"templateRef\">\n <ng-template\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node, origin: node?.origin }\"\n ></ng-template>\n </ng-container>\n </span>\n</div>\n<ng-container *ngIf=\"thyAsync\">\n <thy-loading *ngIf=\"node.isLoading\" [thyDone]=\"!node.isLoading\"></thy-loading>\n</ng-container>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeBeforeDragStartContext } from './tree.class';\n\n/**\n * @private\n */\n@Pipe({\n name: 'treeNodeDraggable',\n standalone: true\n})\nexport class ThyTreeNodeDraggablePipe implements PipeTransform {\n transform(node: ThyTreeNode, beforeDragStart: (e: ThyTreeBeforeDragStartContext) => boolean): boolean {\n if (beforeDragStart) {\n const draggable = beforeDragStart({ item: node } as ThyTreeBeforeDragStartContext);\n return draggable;\n } else {\n return true;\n }\n }\n}\n","import { coerceBooleanProperty, helpers } from 'ngx-tethys/util';\nimport { useHostRenderer } from '@tethys/cdk/dom';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n numberAttribute,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewChildren,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { THY_TREE_ABSTRACT_TOKEN } from './tree-abstract';\nimport { ThyTreeNode } from './tree-node.class';\nimport {\n ThyTreeBeforeDragDropContext,\n ThyTreeBeforeDragStartContext,\n ThyClickBehavior,\n ThyTreeDragDropEvent,\n ThyTreeDropPosition,\n ThyTreeEmitEvent,\n ThyTreeIcons,\n ThyTreeNodeCheckState,\n ThyTreeNodeData\n} from './tree.class';\nimport { ThyTreeService } from './tree.service';\nimport { ThyTreeNodeComponent } from './tree-node.component';\nimport { NgIf, NgFor, DOCUMENT } from '@angular/common';\nimport { CdkDrag, CdkDragDrop, CdkDragEnd, CdkDragMove, CdkDragStart, CdkDropList } from '@angular/cdk/drag-drop';\nimport { auditTime, filter, startWith, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { ThyTreeNodeDraggablePipe } from './tree.pipe';\n\ntype ThyTreeSize = 'sm' | 'default';\n\ntype ThyTreeType = 'default' | 'especial';\n\nconst treeTypeClassMap = {\n default: ['thy-tree-default'],\n especial: ['thy-tree-especial']\n};\n\nconst treeItemSizeMap = {\n default: 44,\n sm: 42\n};\n\n/**\n * 树形控件组件\n * @name thy-tree\n */\n@Component({\n selector: 'thy-tree',\n templateUrl: './tree.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ThyTree),\n multi: true\n },\n {\n provide: THY_TREE_ABSTRACT_TOKEN,\n useExisting: forwardRef(() => ThyTree)\n },\n ThyTreeService\n ],\n standalone: true,\n imports: [\n NgIf,\n CdkDrag,\n CdkDropList,\n CdkVirtualScrollViewport,\n CdkFixedSizeVirtualScroll,\n CdkVirtualForOf,\n ThyTreeNodeComponent,\n NgFor,\n ThyTreeNodeDraggablePipe\n ]\n})\nexport class ThyTree implements ControlValueAccessor, OnInit, OnChanges, AfterViewInit, OnDestroy {\n private _templateRef: TemplateRef<any>;\n\n private _emptyChildrenTemplateRef: TemplateRef<any>;\n\n private _draggable = false;\n\n private _expandedKeys: (string | number)[];\n\n private _selectedKeys: (string | number)[];\n\n private hostRenderer = useHostRenderer();\n\n private _onTouched: () => void = () => {};\n\n private _onChange: (value: any) => void = (_: any) => {};\n\n private destroy$ = new Subject();\n\n // 缓存 Element 和 DragRef 的关系,方便在 Item 拖动时查找\n private nodeDragsMap = new Map<HTMLElement, CdkDrag<ThyTreeNode>>();\n\n private nodeDragMoved = new Subject<CdkDragMove>();\n\n // private startDragNodeExpanded: boolean;\n\n private startDragNodeClone: ThyTreeNode;\n\n // Node 拖动经过目标时临时记录目标id以及相对应目标的位置\n private nodeDropTarget: {\n position?: ThyTreeDropPosition;\n key?: number | string;\n };\n\n private dropEnterPredicate?: (context: { source: ThyTreeNode; target: ThyTreeNode; dropPosition: ThyTreeDropPosition }) => boolean =\n context => {\n return (\n this.isShowExpand(context.target) || (!this.isShowExpand(context.target) && context.dropPosition !== ThyTreeDropPosition.in)\n );\n };\n\n public _selectionModel: SelectionModel<ThyTreeNode>;\n\n public get treeNodes() {\n return this.thyTreeService.treeNodes;\n }\n\n public flattenTreeNodes: ThyTreeNode[] = [];\n\n /**\n * 虚拟化滚动的视口\n */\n @Output() @ViewChild('viewport', { static: false }) viewport: CdkVirtualScrollViewport;\n\n /**\n * TreeNode 展现所需的数据\n * @type ThyTreeNodeData[]\n */\n @Input() thyNodes: ThyTreeNodeData[];\n\n /**\n * 设置 TreeNode 是否支持展开\n * @type boolean | Function\n */\n @Input() thyShowExpand: boolean | ((_: ThyTreeNodeData) => boolean) = true;\n\n /**\n * 设置是否支持多选节点\n */\n @HostBinding(`class.thy-multiple-selection-list`)\n @Input({ transform: coerceBooleanProperty })\n thyMultiple = false;\n\n /**\n * 设置 TreeNode 是否支持拖拽排序\n * @default false\n */\n @HostBinding('class.thy-tree-draggable')\n @Input({ transform: coerceBooleanProperty })\n set thyDraggable(value: boolean) {\n this._draggable = value;\n }\n\n get thyDraggable() {\n return this._draggable;\n }\n\n /**\n * 设置 TreeNode 是否支持 Checkbox 选择\n * @default false\n */\n @Input({ transform: coerceBooleanProperty }) thyCheckable: boolean;\n\n /**\n * 点击节点的行为,`default` 为选中当前节点,`selectCheckbox` 为选中节点的 Checkbox, `thyCheckable` 为 true 时生效。\n */\n @Input() thyClickBehavior: ThyClickBehavior = 'default';\n\n /**\n * 设置 check 状态的计算策略\n */\n @Input() set thyCheckStateResolve(resolve: (node: ThyTreeNode) => ThyTreeNodeCheckState) {\n if (resolve) {\n this.thyTreeService.setCheckStateResolve(resolve);\n }\n }\n\n /**\n * 设置 TreeNode 是否支持异步加载\n */\n @Input({ transform: coerceBooleanProperty }) thyAsync = false;\n\n private _thyType: ThyTreeType = 'default';\n\n /**\n * 设置不同展示类型的 Tree,`default` 为小箭头展示, `especial` 为 加减号图标展示\n * @type ThyTreeType\n * @default default\n */\n @Input()\n set thyType(type: ThyTreeType) {\n this._thyType = type;\n if (type === 'especial') {\n this.thyIcons = { expand: 'minus-square', collapse: 'plus-square' };\n }\n }\n\n get thyType() {\n return this._thyType;\n }\n\n /**\n * 设置不同 Tree 展开折叠的图标,`expand` 为展开状态的图标,`collapse` 为折叠状态的图标\n * @type { expand: string, collapse: string }\n */\n @Input() thyIcons: ThyTreeIcons = {};\n\n private _thySize: ThyTreeSize = 'default';\n /**\n * 支持 `sm` | `default` 两种大小,默认值为 `default`\n * @type ThyTreeSize\n * @default default\n */\n @Input()\n set thySize(size: ThyTreeSize) {\n this._thySize = size;\n if (this._thySize) {\n this._thyItemSize = treeItemSizeMap[this._thySize];\n } else {\n this._thyItemSize = treeItemSizeMap.default;\n }\n }\n\n get thySize() {\n return this._thySize;\n }\n\n /**\n * 设置是否开启虚拟滚动\n */\n @HostBinding('class.thy-virtual-scrolling-tree')\n @Input({ transform: coerceBooleanProperty })\n thyVirtualScroll = false;\n\n private _thyItemSize = 44;\n\n /**\n * 开启虚拟滚动时,单行节点的高度,当`thySize`为`default`时,该参数才生效\n * @default 44\n */\n @Input({ transform: numberAttribute })\n set thyItemSize(itemSize: number) {\n if (this.thySize !== 'default') {\n throw new Error('setting thySize and thyItemSize at the same time is not allowed');\n }\n this._thyItemSize = itemSize;\n }\n\n get thyItemSize() {\n return this._thyItemSize;\n }\n\n /**\n * 设置节点名称是否支持超出截取\n * @type boolean\n */\n @Input({ transform: coerceBooleanProperty }) thyTitleTruncate = true;\n\n /**\n * 已选中的 node 节点集合\n * @default []\n */\n @Input() thySelectedKeys: string[];\n\n /**\n * 设置缩进距离,缩进距离 = thyIndent * node.level\n * @type number\n */\n @Input({ transform: numberAttribute }) thyIndent = 25;\n\n /**\n * 拖拽之前的回调,函数返回 false 则阻止拖拽\n */\n @Input() thyBeforeDragStart: (context: ThyTreeBeforeDragStartContext) => boolean;\n\n /**\n * 拖放到元素时回调,函数返回 false 则阻止拖放到当前元素\n */\n @Input() thyBeforeDragDrop: (context: ThyTreeBeforeDragDropContext) => boolean;\n\n /**\n * 设置子 TreeNode 点击事件\n */\n @Output() thyOnClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 check 选择事件\n */\n @Output() thyOnCheckboxChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置点击展开触发事件\n */\n @Output() thyOnExpandChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 TreeNode 拖拽事件\n */\n @Output() thyOnDragDrop: EventEmitter<ThyTreeDragDropEvent> = new EventEmitter<ThyTreeDragDropEvent>();\n\n /**\n * 双击 TreeNode 事件\n */\n @Output() thyDblClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 TreeNode 的渲染模板\n */\n @ContentChild('treeNodeTemplate', { static: true })\n set templateRef(template: TemplateRef<any>) {\n if (template) {\n this._templateRef = template;\n }\n }\n\n get templateRef() {\n return this._templateRef;\n }\n\n /**\n * 设置子的空数据渲染模板\n */\n @ContentChild('emptyChildrenTemplate', { static: true }) emptyChildrenTemplate: TemplateRef<any>;\n set emptyChildrenTemplateRef(template: TemplateRef<any>) {\n if (template) {\n this._emptyChildrenTemplateRef = template;\n }\n }\n\n get emptyChildrenTemplateRef() {\n return this._emptyChildrenTemplateRef;\n }\n\n @HostBinding('class.thy-tree')\n thyTreeClass = true;\n\n @HostBinding('class.thy-tree-dragging')\n dragging: boolean;\n\n @ViewChildren(CdkDrag) cdkDrags: QueryList<CdkDrag<ThyTreeNode>>;\n\n constructor(public thyTreeService: ThyTreeService, private cdr: ChangeDetectorRef, @Inject(DOCUMENT) private document: Document) {}\n\n ngOnInit(): void {\n this._initThyNodes();\n this._setTreeType();\n this._setTreeSize();\n this._instanceSelectionModel();\n this._selectTreeNodes(this.thySelectedKeys);\n\n this.thyTreeService.flattenNodes$.subscribe(flattenTreeNodes => {\n this.flattenTreeNodes = flattenTreeNodes;\n this.cdr.markForCheck();\n });\n }\n\n ngAfterViewInit(): void {\n this.cdkDrags.changes\n .pipe(startWith(this.cdkDrags), takeUntil(this.destroy$))\n .subscribe((drags: QueryList<CdkDrag<ThyTreeNode>>) => {\n this.nodeDragsMap.clear();\n drags.forEach(drag => {\n if (drag.data) {\n // cdkDrag 变化时,缓存 Element 与 DragRef 的关系,方便 Drag Move 时查找\n this.nodeDragsMap.set(drag.element.nativeElement, drag);\n }\n });\n });\n\n this.nodeDragMoved\n .pipe(\n // auditTime(30),\n // auditTime 可能会导致拖动结束后仍然执行 moved ,所以通过判断 dragging 状态来过滤无效 moved\n filter((event: CdkDragMove) => event.source._dragRef.isDragging()),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n this.onDragMoved(event);\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.thyNodes && !changes.thyNodes.isFirstChange()) {\n this._initThyNodes();\n }\n if (changes.thyType && !changes.thyType.isFirstChange()) {\n this._setTreeType();\n }\n if (changes.thyMultiple && !changes.thyMultiple.isFirstChange()) {\n this._instanceSelectionModel();\n }\n\n if (changes.thySelectedKeys && !changes.thySelectedKeys.isFirstChange()) {\n this._selectedKeys = changes.thySelectedKeys.currentValue;\n this._selectTreeNodes(changes.thySelectedKeys.currentValue);\n }\n }\n\n renderView = () => {};\n\n eventTriggerChanged(event: ThyTreeEmitEvent): void {\n switch (event.eventName) {\n case 'expand':\n this.thyOnExpandChange.emit(event);\n break;\n\n case 'checkboxChange':\n this.thyOnCheckboxChange.emit(event);\n break;\n }\n }\n\n private _initThyNodes() {\n this._expandedKeys = this.getExpandedNodes().map(node => node.key);\n this._selectedKeys = this.getSelectedNodes().map(node => node.key);\n this.thyTreeService.initializeTreeNodes(this.thyNodes);\n this.flattenTreeNodes = this.thyTreeService.flattenTreeNodes;\n this._selectTreeNodes(this._selectedKeys);\n this.thyTreeService.expandTreeNodes(this._expandedKeys);\n }\n\n private _setTreeType() {\n if (this.thyType && treeTypeClassMap[this.thyType]) {\n treeTypeClassMap[this.thyType].forEach(className => {\n this.hostRenderer.addClass(className);\n });\n }\n }\n\n private _setTreeSize() {\n if (this.thySize) {\n this.hostRenderer.addClass(`thy-tree-${this.thySize}`);\n }\n }\n\n private _instanceSelectionModel() {\n this._selectionModel = new SelectionModel<any>(this.thyMultiple);\n }\n\n private _selectTreeNodes(keys: (string | number)[]) {\n (keys || []).forEach(key => {\n const node = this.thyTreeService.getTreeNode(key);\n if (node) {\n this.selectTreeNode(this.thyTreeService.getTreeNode(key));\n }\n });\n }\n\n isSelected(node: ThyTreeNode) {\n return this._selectionModel.isSelected(node);\n }\n\n toggleTreeNode(node: ThyTreeNode) {\n if (node && !node.isDisabled) {\n this._selectionModel.toggle(node);\n }\n }\n\n trackByFn(index: number, item: any) {\n return item.key || index;\n }\n\n isShowExpand(node: ThyTreeNode) {\n if (helpers.isFunction(this.thyShowExpand)) {\n return (this.thyShowExpand as Function)(node);\n } else {\n return this.thyShowExpand;\n }\n }\n\n writeValue(value: ThyTreeNodeData[]): void {\n if (value) {\n this.thyNodes = value;\n this._initThyNodes();\n }\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n onDragStarted(event: CdkDragStart<ThyTreeNode>) {\n this.dragging = true;\n this.startDragNodeClone = Object.assign({}, event.source.data);\n if (event.source.data.isExpanded) {\n event.source.data.setExpanded(false);\n }\n }\n\n emitDragMoved(event: CdkDragMove) {\n this.nodeDragMoved.next(event);\n }\n\n onDragMoved(event: CdkDragMove<ThyTreeNode>) {\n // 通过鼠标位置查找对应的目标 Item 元素\n let currentPointElement = this.document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y) as HTMLElement;\n if (!currentPointElement) {\n this.cleanupDragArtifacts();\n return;\n }\n let targetElement = currentPointElement.classList.contains('thy-tree-node')\n ? currentPointElement\n : (currentPointElement.closest('.thy-tree-node') as HTMLElement);\n if (!targetElement) {\n this.cleanupDragArtifacts();\n return;\n }\n // 缓存放置目标Id 并计算鼠标相对应的位置\n this.nodeDropTarget = {\n key: this.nodeDragsMap.get(targetElement)?.data.key,\n position: this.getTargetPosition(targetElement, event)\n };\n // 执行外部传入的 dropEnterPredicate 判断是否允许拖入目标项\n if (this.dropEnterPredicate) {\n const targetDragRef = this.nodeDragsMap.get(targetElement);\n if (\n this.dropEnterPredicate({\n source: event.source.data,\n target: targetDragRef.data,\n dropPosition: this.nodeDropTarget.position\n })\n ) {\n this.showDropPositionPlaceholder(targetElement);\n } else {\n this.nodeDropTarget = null;\n this.cleanupDragArtifacts();\n }\n } else {\n this.showDropPositionPlaceholder(targetElement);\n }\n }\n\n onDragEnded(event: CdkDragEnd<ThyTreeNode>) {\n this.dragging = false;\n // 拖拽结束后恢复原始的展开状态\n event.source.data.setExpanded(this.startDragNodeClone.isExpanded);\n setTimeout(() => {\n this.startDragNodeClone = null;\n });\n }\n\n onListDropped(event: CdkDragDrop<ThyTreeNode[], ThyTreeNode[], ThyTreeNode>) {\n if (!this.nodeDropTarget) {\n return;\n }\n if (!this.isShowExpand(this.startDragNodeClone) && this.nodeDropTarget.position === ThyTreeDropPosition.in) {\n this.cleanupDragArtifacts();\n return;\n }\n\n const sourceNode = this.startDragNodeClone;\n const sourceNodeParent = sourceNode.parentNode;\n const targetDragRef = this.cdkDrags.find(item => item.data?.key === this.nodeDropTarget.key);\n const targetNode = targetDragRef?.data;\n const targetNodeParent = targetNode.parentNode;\n\n const beforeDragDropContext: ThyTreeBeforeDragDropContext = {\n previousItem: sourceNode,\n previousContainerItems: sourceNodeParent?.children,\n item: targetNode,\n containerItems: targetNodeParent?.children,\n position: this.nodeDropTarget.position\n };\n\n if (this.thyBeforeDragDrop && !this.thyBeforeDragDrop(beforeDragDropContext)) {\n this.cleanupDragArtifacts();\n return;\n }\n\n this.thyTreeService.deleteTreeNode(sourceNode);\n\n switch (this.nodeDropTarget.position) {\n case 'before':\n const beforeInsertIndex = (targetNodeParent?.children || this.treeNodes).indexOf(targetNode);\n this.thyTreeService.addTreeNode(sourceNode, targetNodeParent, beforeInsertIndex);\n break;\n case 'after':\n const afterInsertIndex = (targetNodeParent?.children || this.treeNodes).indexOf(targetNode) + 1;\n this.thyTreeService.addTreeNode(sourceNode, targetNodeParent, afterInsertIndex);\n break;\n case 'in':\n this.thyTreeService.addTreeNode(sourceNode, targetNode);\n break;\n }\n\n this.thyTreeService.syncFlattenTreeNodes();\n\n let after: ThyTreeNode = null;\n let targe: ThyTreeNode = null;\n if (beforeDragDropContext.position === ThyTreeDropPosition.before) {\n const targetContainerNodes = targetNodeParent?.children || this.treeNodes;\n after = targetContainerNodes[targetContainerNodes.indexOf(targetNode) - 2];\n targe = targetNodeParent;\n } else if (beforeDragDropContext.position === ThyTreeDropPosition.after) {\n after = targetNode;\n targe = targetNodeParent;\n } else {\n after = targetNode.children?.length > 0 ? targetNode.children[targetNode.children.length - 2] : null;\n targe = targetNode;\n }\n\n this.thyOnDragDrop.emit({\n dragNode: this.thyTreeService.getTreeNode(sourceNode.key),\n targetNode: targe,\n afterNode: after\n });\n\n this.cleanupDragArtifacts();\n }\n\n private getTargetPosition(target: HTMLElement, event: CdkDragMove) {\n const targetRect = target.getBoundingClientRect();\n const beforeOrAfterGap = targetRect.height * 0.3;\n // 将 Node 高度分为上中下三段,其中上下的 Gap 为 height 的 30%,通过判断鼠标位置在哪一段 gap 来计算对应的位置\n if (event.pointerPosition.y - targetRect.top < beforeOrAfterGap) {\n return ThyTreeDropPosition.before;\n } else if (event.pointerPosition.y >= targetRect.bottom - beforeOrAfterGap) {\n return ThyTreeDropPosition.after;\n } else {\n return ThyTreeDropPosition.in;\n }\n }\n\n private showDropPositionPlaceholder(targetElement: HTMLElement) {\n this.cleanupDropPositionPlaceholder();\n if (this.nodeDropTarget && targetElement) {\n targetElement.classList.add(`drop-position-${this.nodeDropTarget.position}`);\n }\n }\n\n private cleanupDropPositionPlaceholder() {\n this.document.querySelectorAll('.drop-position-before').forEach(element => element.classList.remove('drop-position-before'));\n this.document.querySelectorAll('.drop-position-after').forEach(element => element.classList.remove('drop-position-after'));\n this.document.querySelectorAll('.drop-position-in').forEach(element => element.classList.remove('drop-position-in'));\n }\n\n private cleanupDragArtifacts() {\n this.nodeDropTarget = null;\n this.cleanupDropPositionPlaceholder();\n }\n\n // region Public Functions\n\n selectTreeNode(node: ThyTreeNode) {\n if (node && !node.isDisabled) {\n this._selectionModel.select(node);\n this.thyTreeService.syncFlattenTreeNodes();\n }\n }\n\n getRootNodes(): ThyTreeNode[] {\n return this.treeNodes;\n }\n\n getTreeNode(key: string) {\n return this.thyTreeService.getTreeNode(key);\n }\n\n getSelectedNode(): ThyTreeNode {\n return this._selectionModel ? this._selectionModel.selected[0] : null;\n }\n\n getSelectedNodes(): ThyTreeNode[] {\n return this._selectionModel ? this._selectionModel.selected : [];\n }\n\n getExpandedNodes(): ThyTreeNode[] {\n return this.thyTreeService.getExpandedNodes();\n }\n\n getCheckedNodes(): ThyTreeNode[] {\n return this.thyTreeService.getCheckedNodes();\n }\n\n addTreeNode(node: ThyTreeNodeData, parent?: ThyTreeNode, index = -1) {\n this.thyTreeService.addTreeNode(new ThyTreeNode(node, null, this.thyTreeService), parent, index);\n this.thyTreeService.syncFlattenTreeNodes();\n }\n\n deleteTreeNode(node: ThyTreeNode) {\n if (this.isSelected(node)) {\n this._selectionModel.toggle(node);\n }\n this.thyTreeService.deleteTreeNode(node);\n this.thyTreeService.syncFlattenTreeNodes();\n }\n\n expandAllNodes() {\n const nodes = this.getRootNodes();\n nodes.forEach(n => n.setExpanded(true, true));\n }\n\n collapsedAllNodes() {\n const nodes = this.getRootNodes();\n nodes.forEach(n => n.setExpanded(false, true));\n }\n\n // endregion\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<cdk-virtual-scroll-viewport\n #viewport\n *ngIf=\"thyVirtualScroll\"\n [itemSize]=\"thyItemSize\"\n [style.height]=\"'100%'\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"flattenTreeNodes\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\"\n >\n <div class=\"virtual-trees-container\">\n <thy-tree-node\n *cdkVirtualFor=\"let node of flattenTreeNodes; trackBy: trackByFn; let i = index\"\n cdkDrag\n [cdkDragData]=\"node\"\n [cdkDragDisabled]=\"!thyDraggable || !(node | treeNodeDraggable : thyBeforeDragStart)\"\n (cdkDragStarted)=\"onDragStarted($event)\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n (cdkDragMoved)=\"emitDragMoved($event)\"\n [node]=\"node\"\n [templateRef]=\"templateRef\"\n [emptyChildrenTemplateRef]=\"emptyChildrenTemplate\"\n [thyAsync]=\"thyAsync\"\n [thyDraggable]=\"thyDraggable\"\n [thyCheckable]=\"thyCheckable\"\n [thyMultiple]=\"thyMultiple\"\n [thyClickBehavior]=\"thyClickBehavior\"\n [thyTitleTruncate]=\"thyTitleTruncate\"\n [thyItemSize]=\"thyItemSize\"\n [thyIndent]=\"thyIndent\"\n (thyOnClick)=\"thyOnClick.emit($event)\"\n (thyDblClick)=\"thyDblClick.emit($event)\"\n (thyOnExpandChange)=\"eventTriggerChanged($event)\"\n (thyOnCheckboxChange)=\"eventTriggerChanged($event)\">\n </thy-tree-node>\n </div>\n</cdk-virtual-scroll-viewport>\n\n<div\n *ngIf=\"!thyVirtualScroll\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"flattenTreeNodes\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\">\n <thy-tree-node\n *ngFor=\"let node of flattenTreeNodes; trackBy: trackByFn; let i = index\"\n cdkDrag\n [cdkDragData]=\"node\"\n [cdkDragDisabled]=\"!thyDraggable || !(node | treeNodeDraggable : thyBeforeDragStart)\"\n (cdkDragStarted)=\"onDragStarted($event)\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n (cdkDragMoved)=\"emitDragMoved($event)\"\n [node]=\"node\"\n [templateRef]=\"templateRef\"\n [emptyChildrenTemplateRef]=\"emptyChildrenTemplate\"\n [thyAsync]=\"thyAsync\"\n [thyDraggable]=\"thyDraggable\"\n [thyCheckable]=\"thyCheckable\"\n [thyMultiple]=\"thyMultiple\"\n [thyTitleTruncate]=\"thyTitleTruncate\"\n [thyItemSize]=\"thyItemSize\"\n [thyClickBehavior]=\"thyClickBehavior\"\n [thyIndent]=\"thyIndent\"\n (thyOnClick)=\"thyOnClick.emit($event)\"\n (thyDblClick)=\"thyDblClick.emit($event)\"\n (thyOnExpandChange)=\"eventTriggerChanged($event)\"\n (thyOnCheckboxChange)=\"thyOnCheckboxChange.emit($event)\">\n </thy-tree-node>\n</div>\n","import { ThyButtonModule } from 'ngx-tethys/button';\nimport { ThyCheckboxModule } from 'ngx-tethys/checkbox';\nimport { ThyIconModule } from 'ngx-tethys/icon';\nimport { ThyInputModule } from 'ngx-tethys/input';\nimport { ThyListModule } from 'ngx-tethys/list';\nimport { ThyLoadingModule } from 'ngx-tethys/loading';\nimport { ThyOptionModule, ThySharedModule } from 'ngx-tethys/shared';\n\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ThyTreeNodeComponent } from './tree-node.component';\nimport { ThyTree } from './tree.component';\nimport { ThyTreeService } from './tree.service';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { ThyTreeNodeDraggablePipe } from './tree.pipe';\n\n@NgModule({\n imports: [\n DragDropModule,\n CommonModule,\n ThyInputModule,\n ThyButtonModule,\n ThySharedModule,\n FormsModule,\n ThyListModule,\n ThyOptionModule,\n ThyLoadingModule,\n ThyIconModule,\n ThyCheckboxModule,\n ScrollingModule,\n ThyTree,\n ThyTreeNodeComponent,\n ThyTreeNodeDraggablePipe\n ],\n exports: [ThyTree, ThyTreeNodeComponent],\n providers: [ThyTreeService]\n})\nexport class ThyTreeModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ThyTreeService"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-tethys-tree.mjs","sources":["../../../src/tree/tree-abstract.ts","../../../src/tree/tree.class.ts","../../../src/tree/tree-node.class.ts","../../../src/tree/tree.service.ts","../../../src/tree/tree-node.component.ts","../../../src/tree/tree-node.component.html","../../../src/tree/tree.pipe.ts","../../../src/tree/tree.component.ts","../../../src/tree/tree.component.html","../../../src/tree/tree.module.ts","../../../src/tree/ngx-tethys-tree.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeBeforeDragDropContext, ThyTreeBeforeDragStartContext, ThyTreeDragDropEvent, ThyTreeIcons } from './tree.class';\n\nexport interface ThyTreeAbstractComponent {\n thyMultiple: boolean;\n thyDraggable: boolean;\n thyShowExpand: boolean;\n treeNodes: ThyTreeNode[];\n thyIcons: ThyTreeIcons;\n thyBeforeDragStart(e: ThyTreeBeforeDragStartContext): boolean;\n thyBeforeDragDrop(e: ThyTreeBeforeDragDropContext): boolean;\n onDragDrop(event: ThyTreeDragDropEvent): void;\n selectTreeNode(node: ThyTreeNode): void;\n toggleTreeNode(node: ThyTreeNode): void;\n isShowExpand(node: ThyTreeNode): boolean;\n trackByFn(number: string, node: ThyTreeNode): string | number;\n isSelected(node: ThyTreeNode): boolean;\n}\n\nexport const THY_TREE_ABSTRACT_TOKEN = new InjectionToken<ThyTreeAbstractComponent>('thy-tree-abstract-token');\n","import { ThyTreeNode } from './tree-node.class';\n\nexport enum ThyTreeNodeCheckState {\n unchecked = 0,\n checked = 1,\n indeterminate = 2\n}\n\nexport enum ThyTreeDropPosition {\n in = 'in',\n before = 'before',\n after = 'after'\n}\n\nexport interface ThyTreeNodeData<T = any> {\n key?: number | string;\n\n title?: string;\n\n icon?: string;\n\n iconStyle?: {\n [key: string]: any;\n };\n\n children?: ThyTreeNodeData<T>[];\n\n origin?: any;\n\n expanded?: boolean;\n\n disabled?: boolean;\n\n checked?: boolean;\n\n data?: T;\n\n itemClass?: string | string[];\n\n [key: string]: any;\n}\n\nexport interface ThyTreeEmitEvent<T = any> {\n eventName: string;\n\n node?: ThyTreeNode<T>;\n\n event?: Event | any;\n\n dragNode?: ThyTreeNode<T>;\n\n targetNode?: ThyTreeNode<T>;\n}\n\nexport interface ThyTreeBeforeDragStartContext {\n item: ThyTreeNode;\n}\n\nexport interface ThyTreeBeforeDragDropContext {\n item?: ThyTreeNode;\n containerItems?: ThyTreeNode[];\n previousItem?: ThyTreeNode;\n previousContainerItems?: ThyTreeNode[];\n position?: ThyTreeDropPosition;\n}\n\nexport interface ThyTreeDragDropEvent<T = any> {\n dragNode?: ThyTreeNode<T>;\n\n targetNode?: ThyTreeNode<T>;\n\n afterNode?: ThyTreeNode<T>;\n}\n\nexport class ThyTreeIcons {\n expand?: string;\n collapse?: string;\n}\n\nexport type ThyClickBehavior = 'default' | 'selectCheckbox';\n","import { helpers, isArray } from 'ngx-tethys/util';\n\nimport { ThyTreeNodeCheckState, ThyTreeNodeData } from './tree.class';\nimport { ThyTreeService } from './tree.service';\n\nexport class ThyTreeNode<T = any> {\n key?: number | string;\n\n title?: string;\n\n children: ThyTreeNode[];\n\n parentNode: ThyTreeNode;\n\n level = 0;\n\n origin: ThyTreeNodeData<T>;\n\n isExpanded: boolean;\n\n isChecked: ThyTreeNodeCheckState;\n\n isLoading: boolean;\n\n isDisabled: boolean;\n\n itemClass?: string[];\n\n private readonly service: ThyTreeService;\n\n get treeService(): ThyTreeService {\n if (this.service) {\n return this.service;\n } else if (this.parentNode) {\n return this.parentNode.treeService;\n }\n }\n\n constructor(node: ThyTreeNodeData, parent: ThyTreeNode = null, service?: ThyTreeService) {\n this.title = node.title;\n this.key = node.key;\n this.children = [];\n this.parentNode = parent;\n this.level = parent ? parent.level + 1 : this.level;\n this.origin = node;\n this.isDisabled = node.disabled || false;\n this.isExpanded = node.expanded || false;\n this.isChecked = node.checked ? ThyTreeNodeCheckState.checked : ThyTreeNodeCheckState.unchecked;\n this.isLoading = false;\n if (node.itemClass) {\n this.itemClass = isArray(node.itemClass) ? node.itemClass : [node.itemClass];\n }\n if (node.children) {\n node.children.forEach(childNode => {\n this.children.push(new ThyTreeNode(childNode, this, service));\n });\n }\n this.service = service;\n if (node.children && node.children.length && service) {\n this.isChecked = service.checkStateResolve(this);\n }\n }\n\n public setKey(key: string) {\n this.origin.key = key;\n this.key = key;\n }\n\n public setTitle(title: string) {\n this.origin.title = title;\n this.title = title;\n }\n\n public setLevel(level: number) {\n this.level = level;\n }\n\n private _setExpanded(expanded: boolean, propagate = false) {\n this.origin.expanded = expanded;\n this.isExpanded = expanded;\n if (propagate && this.children) {\n this.children.forEach(n => n._setExpanded(expanded, propagate));\n }\n }\n\n public setExpanded(expanded: boolean, propagate = false) {\n this._setExpanded(expanded, propagate);\n this.treeService.syncFlattenTreeNodes();\n }\n\n public setLoading(loading: boolean): void {\n this.isLoading = loading;\n this.treeService.syncFlattenTreeNodes();\n }\n\n public setChecked(checked: boolean, propagateUp = true, propagateDown = true) {\n this.treeService.setNodeChecked(this, checked, propagateUp, propagateDown);\n }\n\n public syncNodeCheckState() {\n this.treeService.syncNodeCheckState(this);\n }\n\n public getParentNode(): ThyTreeNode {\n return this.parentNode;\n }\n\n public getChildren(): ThyTreeNode[] {\n return this.children;\n }\n\n public addChildren(children: ThyTreeNodeData | ThyTreeNodeData[], index: number = -1): void {\n children = helpers.coerceArray(children);\n ((children as ThyTreeNodeData[]) || []).forEach((childNode: ThyTreeNodeData, i: number) => {\n if (index === -1) {\n this.children.push(new ThyTreeNode(childNode, this));\n } else {\n this.children.splice(index + i, 0, new ThyTreeNode(childNode, this, this.treeService));\n }\n });\n\n this.origin.children = this.getChildren().map(n => n.origin);\n this.setLoading(false);\n this.treeService.statusChange$.next({\n eventName: 'addChildren',\n node: this\n });\n }\n}\n","import { coerceArray, isFunction } from 'ngx-tethys/util';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeNodeCheckState, ThyTreeNodeData } from './tree.class';\n\nfunction checkStateResolve(node: ThyTreeNode) {\n const checkedNodes = node.children.filter(n => n.isChecked === ThyTreeNodeCheckState.checked);\n const unCheckedNodes = node.children.filter(n => n.isChecked === ThyTreeNodeCheckState.unchecked);\n if (checkedNodes.length === node.children.length) {\n return ThyTreeNodeCheckState.checked;\n } else if (unCheckedNodes.length === node.children.length) {\n return ThyTreeNodeCheckState.unchecked;\n } else {\n return ThyTreeNodeCheckState.indeterminate;\n }\n}\n\ntype FlattenAllNodesCb = (treeNode: ThyTreeNode) => boolean;\n\nexport interface ThyTreeFormatEmitEvent {\n eventName: string;\n node: ThyTreeNode;\n event?: MouseEvent | DragEvent;\n}\n\n/**\n * @internal\n */\n@Injectable()\nexport class ThyTreeService implements OnDestroy {\n selectedNode!: ThyTreeNode;\n\n flattenNodes$ = new BehaviorSubject<ThyTreeNode[]>([]);\n\n flattenTreeNodes: ThyTreeNode[] = [];\n\n private originTreeNodes: ThyTreeNodeData[] = [];\n\n public treeNodes: ThyTreeNode[] = [];\n\n public checkStateResolve: (node: ThyTreeNode) => ThyTreeNodeCheckState = checkStateResolve;\n\n statusChange$ = new Subject<ThyTreeFormatEmitEvent>();\n\n constructor() {\n this.statusChange$.pipe().subscribe(event => {\n this.syncFlattenTreeNodes();\n this.syncNodeCheckState(event.node);\n });\n }\n\n public initializeTreeNodes(rootNodes: ThyTreeNodeData[]) {\n this.originTreeNodes = rootNodes || [];\n this.treeNodes = (rootNodes || []).map(node => new ThyTreeNode(node, null, this));\n }\n\n public syncFlattenTreeNodes() {\n this.flattenTreeNodes = this.getParallelTreeNodes(this.treeNodes, false);\n this.flattenNodes$.next(this.flattenTreeNodes);\n return this.flattenTreeNodes;\n }\n\n private getParallelTreeNodes(rootTrees: ThyTreeNode[] = this.treeNodes, flattenAllNodes: boolean | FlattenAllNodesCb = true) {\n const flattenTreeData: ThyTreeNode[] = [];\n function _getParallelTreeNodes(list: ThyTreeNode[]) {\n return list.forEach((treeNode, index) => {\n flattenTreeData.push(treeNode);\n const flattenAllNodesFlag = isFunction(flattenAllNodes) ? flattenAllNodes(treeNode) : flattenAllNodes;\n if (flattenAllNodesFlag || treeNode.isExpanded) {\n _getParallelTreeNodes(treeNode.children);\n }\n });\n }\n _getParallelTreeNodes(rootTrees);\n return flattenTreeData;\n }\n\n setCheckStateResolve(resolve: (node: ThyTreeNode) => ThyTreeNodeCheckState = checkStateResolve) {\n this.checkStateResolve = resolve;\n }\n\n public resetSortedTreeNodes(treeNodes: ThyTreeNode[], parent?: ThyTreeNode) {\n treeNodes.forEach(node => {\n node.level = node.parentNode ? node.parentNode.level + 1 : 0;\n node.origin.children = node.children.map(n => n.origin);\n node.parentNode = parent;\n this.resetSortedTreeNodes(node.children, node);\n });\n }\n\n public getTreeNode(key: string | number) {\n const allNodes = this.getParallelTreeNodes(this.treeNodes);\n return allNodes.find(n => n.key === key);\n }\n\n public getExpandedNodes(): ThyTreeNode[] {\n const allNodes = this.getParallelTreeNodes(this.treeNodes);\n return allNodes.filter(n => n.isExpanded);\n }\n\n public getCheckedNodes(): ThyTreeNode[] {\n const allNodes = this.getParallelTreeNodes(this.treeNodes);\n return allNodes.filter(n => n.isChecked === ThyTreeNodeCheckState.checked);\n }\n\n public deleteTreeNode(node: ThyTreeNode) {\n if (node.parentNode) {\n const children = node.parentNode.children;\n const index = children.findIndex(n => n.key === node.key);\n if (index > -1) {\n children.splice(index, 1);\n node.parentNode.origin.children = children.map(item => item.origin);\n this.syncNodeCheckState(node.parentNode);\n }\n } else {\n const index = this.treeNodes.findIndex(n => n.key === node.key);\n if (index > -1) {\n this.treeNodes.splice(index, 1);\n this.originTreeNodes.splice(index, 1);\n }\n }\n }\n\n public addTreeNode(node: ThyTreeNode, parent?: ThyTreeNode, index = -1) {\n if (parent) {\n const insertNode = new ThyTreeNode(node.origin, parent, this);\n if (index > -1) {\n parent.children.splice(index, 0, insertNode);\n } else {\n parent.children.push(insertNode);\n }\n parent.origin.children = parent.children.map(item => item.origin);\n this.syncNodeCheckState(parent);\n } else {\n const insertNode = new ThyTreeNode(node.origin, null, this);\n if (index > -1) {\n this.treeNodes.splice(index, 0, insertNode);\n } else {\n this.treeNodes.push(insertNode);\n }\n this.originTreeNodes = this.treeNodes.map(item => item.origin);\n // this.syncNodeCheckState(insertNode);\n }\n }\n\n public expandTreeNodes(keyOrKeys: string | number | (string | number)[] | true) {\n const keys = keyOrKeys === true ? [] : coerceArray(keyOrKeys);\n const needExpandNodes = this.getParallelTreeNodes(this.treeNodes).filter(node => {\n return keys.indexOf(node.key) > -1 || keyOrKeys === true;\n });\n needExpandNodes.forEach(node => {\n node.setExpanded(true);\n });\n this.syncFlattenTreeNodes();\n }\n\n // 设置节点选中状态\n public setNodeChecked(node: ThyTreeNode, checked: boolean, propagateUp = true, propagateDown = true) {\n this._setNodeChecked(node, checked, propagateUp, propagateDown);\n this.syncFlattenTreeNodes();\n }\n\n private _setNodeChecked(node: ThyTreeNode, checked: boolean, propagateUp = true, propagateDown = true) {\n if (propagateDown && node.children) {\n node.children.forEach(subNode => {\n this._setNodeChecked(subNode, checked, false, true);\n });\n }\n if (!node.isDisabled) {\n if (node.children.length) {\n if (checked) {\n const isAllChildrenChecked = node.children.every(item => item.isChecked === ThyTreeNodeCheckState.checked);\n node.isChecked = isAllChildrenChecked ? ThyTreeNodeCheckState.checked : ThyTreeNodeCheckState.indeterminate;\n node.origin.checked = isAllChildrenChecked && checked;\n } else {\n const isAllChildrenUnChecked = node.children.every(item => item.isChecked === ThyTreeNodeCheckState.unchecked);\n node.isChecked = isAllChildrenUnChecked ? ThyTreeNodeCheckState.unchecked : ThyTreeNodeCheckState.indeterminate;\n node.origin.checked = isAllChildrenUnChecked && checked;\n }\n } else {\n node.isChecked = checked ? ThyTreeNodeCheckState.checked : ThyTreeNodeCheckState.unchecked;\n node.origin.checked = checked;\n }\n }\n if (propagateUp) {\n this._syncNodeCheckState(node.parentNode);\n }\n }\n\n public syncNodeCheckState(node: ThyTreeNode) {\n this._syncNodeCheckState(node);\n this.syncFlattenTreeNodes();\n }\n\n private _syncNodeCheckState(node: ThyTreeNode) {\n if (node) {\n node.isChecked = this.checkStateResolve(node);\n this._syncNodeCheckState(node.parentNode);\n }\n }\n\n ngOnDestroy(): void {\n this.statusChange$.complete();\n this.statusChange$ = null;\n }\n}\n","import { Subject } from 'rxjs';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport {\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n HostBinding,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n numberAttribute\n} from '@angular/core';\n\nimport { THY_TREE_ABSTRACT_TOKEN, ThyTreeAbstractComponent } from './tree-abstract';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeEmitEvent, ThyTreeNodeCheckState, ThyClickBehavior } from './tree.class';\nimport { ThyTreeService } from './tree.service';\nimport { ThyLoading } from 'ngx-tethys/loading';\nimport { ThyIcon } from 'ngx-tethys/icon';\nimport { NgIf, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport { coerceBooleanProperty } from 'ngx-tethys/util';\n\nconst passiveEventListenerOptions = <AddEventListenerOptions>normalizePassiveListenerOptions({ passive: true });\n\n/**\n * 树形控件的节点组件\n * @private\n * @name thy-tree-node\n */\n@Component({\n selector: 'thy-tree-node',\n templateUrl: './tree-node.component.html',\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, ThyIcon, NgClass, NgStyle, NgTemplateOutlet, ThyLoading]\n})\nexport class ThyTreeNodeComponent implements OnDestroy, OnInit, OnChanges {\n /**\n * node 节点展现所需的数据\n */\n @Input() node: ThyTreeNode;\n\n /**\n * 设置 TreeNode 是否支持异步加载\n */\n @Input({ transform: coerceBooleanProperty }) thyAsync = false;\n\n /**\n * 设置 TreeNode 是否支持多选节点\n */\n @Input({ transform: coerceBooleanProperty }) thyMultiple = false;\n\n /**\n * 设置 TreeNode 是否支持拖拽排序\n */\n @Input({ transform: coerceBooleanProperty }) thyDraggable = false;\n\n /**\n * 设置 TreeNode 是否支持 Checkbox 选择\n */\n @Input({ transform: coerceBooleanProperty }) thyCheckable = false;\n\n /**\n * 点击节点的行为,`default` 为选中当前节点,`selectCheckbox` 为选中节点的 Checkbox, `thyCheckable` 为 true 时生效。\n * @default default\n */\n @Input() thyClickBehavior: ThyClickBehavior;\n\n /**\n * 设置节点名称是否支持超出截取\n * @default false\n */\n @Input({ transform: coerceBooleanProperty }) thyTitleTruncate: boolean;\n\n /**\n * 设置 TreeNode 的渲染模板\n */\n @Input() templateRef: TemplateRef<any>;\n\n /**\n * 设置子的空数据渲染模板\n */\n @Input() emptyChildrenTemplateRef: TemplateRef<any>;\n\n /**\n * 设置 node 点击事件\n */\n @Output() thyOnClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 双击 node 事件\n */\n @Output() thyDblClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 点击展开触发事件\n */\n @Output() thyOnExpandChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 check 选择事件\n */\n @Output() thyOnCheckboxChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 childrenTree 的渲染模板\n */\n @ContentChild('childrenTree') childrenTreeTemplateRef: TemplateRef<any>;\n\n /** The native `<div class=\"thy-tree-node-wrapper thy-sortable-item\"></div>` element. */\n @ViewChild('treeNodeWrapper', { static: true }) treeNodeWrapper: ElementRef<HTMLElement>;\n\n @HostBinding('class.thy-tree-node') thyTreeNodeClass = true;\n\n @HostBinding('class') itemClass: string;\n\n /**\n * 开启虚拟滚动时,单行节点的高度,当`thySize`为`default`时,该参数才生效\n */\n @Input({ transform: numberAttribute }) thyItemSize = 44;\n\n /**\n * 设置节点缩进距离,缩进距离 = thyIndent * node.level\n */\n @Input({ transform: numberAttribute }) thyIndent = 25;\n\n public get nodeIcon() {\n return this.node.origin.icon;\n }\n\n public get nodeIconStyle() {\n return this.node.origin.iconStyle;\n }\n\n private destroy$ = new Subject<void>();\n\n checkState = ThyTreeNodeCheckState;\n\n constructor(@Inject(THY_TREE_ABSTRACT_TOKEN) public root: ThyTreeAbstractComponent, public thyTreeService: ThyTreeService) {}\n\n public clickNode(event: Event) {\n if (this.node.isDisabled) {\n this.expandNode(event);\n } else {\n if (this.thyCheckable && this.thyClickBehavior === 'selectCheckbox') {\n this.clickNodeCheck(event);\n } else {\n if (this.root.thyMultiple) {\n this.root.toggleTreeNode(this.node);\n } else {\n this.root.selectTreeNode(this.node);\n }\n }\n }\n this.thyOnClick.emit({\n eventName: 'click',\n event: event,\n node: this.node\n });\n }\n\n public dbClickNode(event: Event) {\n this.thyDblClick.emit({\n eventName: 'dbclick',\n event: event,\n node: this.node\n });\n }\n\n public clickNodeCheck(event: Event) {\n event.stopPropagation();\n if (this.node.isChecked === ThyTreeNodeCheckState.unchecked) {\n this.node.setChecked(true);\n } else if (this.node.isChecked === ThyTreeNodeCheckState.checked) {\n this.node.setChecked(false);\n } else if (this.node.isChecked === ThyTreeNodeCheckState.indeterminate) {\n if (this.node.children?.length) {\n const activeChildren = this.node.children.filter(item => !item.isDisabled);\n const isAllActiveChildrenChecked = activeChildren.every(item => item.isChecked);\n this.node.setChecked(!isAllActiveChildrenChecked);\n } else {\n this.node.setChecked(true);\n }\n }\n this.thyOnCheckboxChange.emit({\n eventName: 'checkboxChange',\n event: event,\n node: this.node\n });\n }\n\n public expandNode(event: Event) {\n event.stopPropagation();\n this.node.setExpanded(!this.node.isExpanded);\n if (this.root.thyShowExpand) {\n this.thyOnExpandChange.emit({\n eventName: 'expand',\n event: event,\n node: this.node\n });\n if (this.thyAsync && this.node.children.length === 0) {\n this.node.setLoading(true);\n }\n }\n }\n\n public isShowExpand(node: ThyTreeNode) {\n return this.root.isShowExpand(node);\n }\n\n ngOnInit(): void {\n this.itemClass = this.node?.itemClass?.join(' ');\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.node && !changes.node.isFirstChange()) {\n this.itemClass = changes?.node?.currentValue.itemClass?.join(' ');\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<div\n #treeNodeWrapper\n class=\"thy-tree-node-wrapper\"\n [class.active]=\"root.isSelected(node)\"\n [class.disabled]=\"node.isDisabled\"\n [class.expand]=\"node.children.length\"\n [style.height]=\"thyItemSize + 'px'\"\n (click)=\"clickNode($event)\"\n>\n <span class=\"thy-tree-index\" [style.width.px]=\"node.level * thyIndent\"></span>\n <span class=\"thy-tree-drag-icon\">\n <thy-icon thyIconName=\"drag\"></thy-icon>\n </span>\n <span class=\"thy-tree-expand\" (click)=\"expandNode($event)\">\n <ng-container *ngIf=\"isShowExpand(node)\">\n <ng-container *ngIf=\"(node.children && node.children.length > 0) || thyAsync || emptyChildrenTemplateRef\">\n <thy-icon\n *ngIf=\"root.thyIcons?.expand && root.thyIcons?.collapse; else defaultIcon\"\n class=\"thy-tree-expand-icon\"\n [thyIconName]=\"node.isExpanded ? root.thyIcons.expand : root.thyIcons.collapse\"\n ></thy-icon>\n <ng-template #defaultIcon>\n <thy-icon class=\"thy-tree-expand-icon\" [class.collapse]=\"!node.isExpanded\" thyIconName=\"caret-right-down\"></thy-icon>\n </ng-template>\n </ng-container>\n </ng-container>\n </span>\n\n <span class=\"thy-tree-node-content\" (dblclick)=\"dbClickNode($event)\">\n <input\n *ngIf=\"thyCheckable\"\n type=\"checkbox\"\n class=\"thy-tree-node-check\"\n [class.form-check-indeterminate]=\"node.isChecked === checkState.indeterminate\"\n [class.form-unchecked]=\"node.isChecked === checkState.unchecked\"\n [checked]=\"node.isChecked === checkState.checked\"\n [disabled]=\"node.isDisabled\"\n (click)=\"clickNodeCheck($event)\"\n />\n <ng-container *ngIf=\"!templateRef\">\n <ng-container *ngIf=\"nodeIcon\">\n <span class=\"thy-tree-node-icon\"> <i [ngClass]=\"nodeIcon\" [ngStyle]=\"nodeIconStyle\"></i></span>\n </ng-container>\n <span [title]=\"node.title\" class=\"thy-tree-node-title\" [class.truncate]=\"thyTitleTruncate\"> {{ node.title }}</span>\n </ng-container>\n <ng-container *ngIf=\"templateRef\">\n <ng-template\n [ngTemplateOutlet]=\"templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: node, node: node, origin: node?.origin }\"\n ></ng-template>\n </ng-container>\n </span>\n</div>\n<ng-container *ngIf=\"thyAsync\">\n <thy-loading *ngIf=\"node.isLoading\" [thyDone]=\"!node.isLoading\"></thy-loading>\n</ng-container>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { ThyTreeNode } from './tree-node.class';\nimport { ThyTreeBeforeDragStartContext } from './tree.class';\n\n/**\n * @private\n */\n@Pipe({\n name: 'treeNodeDraggable',\n standalone: true\n})\nexport class ThyTreeNodeDraggablePipe implements PipeTransform {\n transform(node: ThyTreeNode, beforeDragStart: (e: ThyTreeBeforeDragStartContext) => boolean): boolean {\n if (beforeDragStart) {\n const draggable = beforeDragStart({ item: node } as ThyTreeBeforeDragStartContext);\n return draggable;\n } else {\n return true;\n }\n }\n}\n","import { coerceBooleanProperty, helpers } from 'ngx-tethys/util';\nimport { useHostRenderer } from '@tethys/cdk/dom';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n EventEmitter,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n numberAttribute,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewChildren,\n ViewEncapsulation\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { THY_TREE_ABSTRACT_TOKEN } from './tree-abstract';\nimport { ThyTreeNode } from './tree-node.class';\nimport {\n ThyTreeBeforeDragDropContext,\n ThyTreeBeforeDragStartContext,\n ThyClickBehavior,\n ThyTreeDragDropEvent,\n ThyTreeDropPosition,\n ThyTreeEmitEvent,\n ThyTreeIcons,\n ThyTreeNodeCheckState,\n ThyTreeNodeData\n} from './tree.class';\nimport { ThyTreeService } from './tree.service';\nimport { ThyTreeNodeComponent } from './tree-node.component';\nimport { NgIf, NgFor, DOCUMENT } from '@angular/common';\nimport { CdkDrag, CdkDragDrop, CdkDragEnd, CdkDragMove, CdkDragStart, CdkDropList } from '@angular/cdk/drag-drop';\nimport { auditTime, filter, startWith, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { ThyTreeNodeDraggablePipe } from './tree.pipe';\n\ntype ThyTreeSize = 'sm' | 'default';\n\ntype ThyTreeType = 'default' | 'especial';\n\nconst treeTypeClassMap = {\n default: ['thy-tree-default'],\n especial: ['thy-tree-especial']\n};\n\nconst treeItemSizeMap = {\n default: 44,\n sm: 42\n};\n\n/**\n * 树形控件组件\n * @name thy-tree\n */\n@Component({\n selector: 'thy-tree',\n templateUrl: './tree.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ThyTree),\n multi: true\n },\n {\n provide: THY_TREE_ABSTRACT_TOKEN,\n useExisting: forwardRef(() => ThyTree)\n },\n ThyTreeService\n ],\n standalone: true,\n imports: [\n NgIf,\n CdkDrag,\n CdkDropList,\n CdkVirtualScrollViewport,\n CdkFixedSizeVirtualScroll,\n CdkVirtualForOf,\n ThyTreeNodeComponent,\n NgFor,\n ThyTreeNodeDraggablePipe\n ]\n})\nexport class ThyTree implements ControlValueAccessor, OnInit, OnChanges, AfterViewInit, OnDestroy {\n private _templateRef: TemplateRef<any>;\n\n private _emptyChildrenTemplateRef: TemplateRef<any>;\n\n private _draggable = false;\n\n private _expandedKeys: (string | number)[];\n\n private _selectedKeys: (string | number)[];\n\n private hostRenderer = useHostRenderer();\n\n private _onTouched: () => void = () => {};\n\n private _onChange: (value: any) => void = (_: any) => {};\n\n private destroy$ = new Subject();\n\n // 缓存 Element 和 DragRef 的关系,方便在 Item 拖动时查找\n private nodeDragsMap = new Map<HTMLElement, CdkDrag<ThyTreeNode>>();\n\n private nodeDragMoved = new Subject<CdkDragMove>();\n\n // private startDragNodeExpanded: boolean;\n\n private startDragNodeClone: ThyTreeNode;\n\n // Node 拖动经过目标时临时记录目标id以及相对应目标的位置\n private nodeDropTarget: {\n position?: ThyTreeDropPosition;\n key?: number | string;\n };\n\n private dropEnterPredicate?: (context: { source: ThyTreeNode; target: ThyTreeNode; dropPosition: ThyTreeDropPosition }) => boolean =\n context => {\n return (\n this.isShowExpand(context.target) || (!this.isShowExpand(context.target) && context.dropPosition !== ThyTreeDropPosition.in)\n );\n };\n\n public _selectionModel: SelectionModel<ThyTreeNode>;\n\n public get treeNodes() {\n return this.thyTreeService.treeNodes;\n }\n\n public flattenTreeNodes: ThyTreeNode[] = [];\n\n /**\n * 虚拟化滚动的视口\n */\n @Output() @ViewChild('viewport', { static: false }) viewport: CdkVirtualScrollViewport;\n\n /**\n * TreeNode 展现所需的数据\n * @type ThyTreeNodeData[]\n */\n @Input() thyNodes: ThyTreeNodeData[];\n\n /**\n * 设置 TreeNode 是否支持展开\n * @type boolean | Function\n */\n @Input() thyShowExpand: boolean | ((_: ThyTreeNodeData) => boolean) = true;\n\n /**\n * 设置是否支持多选节点\n */\n @HostBinding(`class.thy-multiple-selection-list`)\n @Input({ transform: coerceBooleanProperty })\n thyMultiple = false;\n\n /**\n * 设置 TreeNode 是否支持拖拽排序\n * @default false\n */\n @HostBinding('class.thy-tree-draggable')\n @Input({ transform: coerceBooleanProperty })\n set thyDraggable(value: boolean) {\n this._draggable = value;\n }\n\n get thyDraggable() {\n return this._draggable;\n }\n\n /**\n * 设置 TreeNode 是否支持 Checkbox 选择\n * @default false\n */\n @Input({ transform: coerceBooleanProperty }) thyCheckable: boolean;\n\n /**\n * 点击节点的行为,`default` 为选中当前节点,`selectCheckbox` 为选中节点的 Checkbox, `thyCheckable` 为 true 时生效。\n */\n @Input() thyClickBehavior: ThyClickBehavior = 'default';\n\n /**\n * 设置 check 状态的计算策略\n */\n @Input() set thyCheckStateResolve(resolve: (node: ThyTreeNode) => ThyTreeNodeCheckState) {\n if (resolve) {\n this.thyTreeService.setCheckStateResolve(resolve);\n }\n }\n\n /**\n * 设置 TreeNode 是否支持异步加载\n */\n @Input({ transform: coerceBooleanProperty }) thyAsync = false;\n\n private _thyType: ThyTreeType = 'default';\n\n /**\n * 设置不同展示类型的 Tree,`default` 为小箭头展示, `especial` 为 加减号图标展示\n * @type ThyTreeType\n * @default default\n */\n @Input()\n set thyType(type: ThyTreeType) {\n this._thyType = type;\n if (type === 'especial') {\n this.thyIcons = { expand: 'minus-square', collapse: 'plus-square' };\n }\n }\n\n get thyType() {\n return this._thyType;\n }\n\n /**\n * 设置不同 Tree 展开折叠的图标,`expand` 为展开状态的图标,`collapse` 为折叠状态的图标\n * @type { expand: string, collapse: string }\n */\n @Input() thyIcons: ThyTreeIcons = {};\n\n private _thySize: ThyTreeSize = 'default';\n /**\n * 支持 `sm` | `default` 两种大小,默认值为 `default`\n * @type ThyTreeSize\n * @default default\n */\n @Input()\n set thySize(size: ThyTreeSize) {\n this._thySize = size;\n if (this._thySize) {\n this._thyItemSize = treeItemSizeMap[this._thySize];\n } else {\n this._thyItemSize = treeItemSizeMap.default;\n }\n }\n\n get thySize() {\n return this._thySize;\n }\n\n /**\n * 设置是否开启虚拟滚动\n */\n @HostBinding('class.thy-virtual-scrolling-tree')\n @Input({ transform: coerceBooleanProperty })\n thyVirtualScroll = false;\n\n private _thyItemSize = 44;\n\n /**\n * 开启虚拟滚动时,单行节点的高度,当`thySize`为`default`时,该参数才生效\n * @default 44\n */\n @Input({ transform: numberAttribute })\n set thyItemSize(itemSize: number) {\n if (this.thySize !== 'default') {\n throw new Error('setting thySize and thyItemSize at the same time is not allowed');\n }\n this._thyItemSize = itemSize;\n }\n\n get thyItemSize() {\n return this._thyItemSize;\n }\n\n /**\n * 设置节点名称是否支持超出截取\n * @type boolean\n */\n @Input({ transform: coerceBooleanProperty }) thyTitleTruncate = true;\n\n /**\n * 已选中的 node 节点集合\n * @default []\n */\n @Input() thySelectedKeys: string[];\n\n /**\n * 展开指定的树节点\n */\n @Input() thyExpandedKeys: (string | number)[];\n\n /**\n * 是否展开所有树节点\n */\n @Input({ transform: coerceBooleanProperty }) thyExpandAll: boolean = false;\n\n /**\n * 设置缩进距离,缩进距离 = thyIndent * node.level\n * @type number\n */\n @Input({ transform: numberAttribute }) thyIndent = 25;\n\n /**\n * 拖拽之前的回调,函数返回 false 则阻止拖拽\n */\n @Input() thyBeforeDragStart: (context: ThyTreeBeforeDragStartContext) => boolean;\n\n /**\n * 拖放到元素时回调,函数返回 false 则阻止拖放到当前元素\n */\n @Input() thyBeforeDragDrop: (context: ThyTreeBeforeDragDropContext) => boolean;\n\n /**\n * 设置子 TreeNode 点击事件\n */\n @Output() thyOnClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 check 选择事件\n */\n @Output() thyOnCheckboxChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置点击展开触发事件\n */\n @Output() thyOnExpandChange: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 TreeNode 拖拽事件\n */\n @Output() thyOnDragDrop: EventEmitter<ThyTreeDragDropEvent> = new EventEmitter<ThyTreeDragDropEvent>();\n\n /**\n * 双击 TreeNode 事件\n */\n @Output() thyDblClick: EventEmitter<ThyTreeEmitEvent> = new EventEmitter<ThyTreeEmitEvent>();\n\n /**\n * 设置 TreeNode 的渲染模板\n */\n @ContentChild('treeNodeTemplate', { static: true })\n set templateRef(template: TemplateRef<any>) {\n if (template) {\n this._templateRef = template;\n }\n }\n\n get templateRef() {\n return this._templateRef;\n }\n\n /**\n * 设置子的空数据渲染模板\n */\n @ContentChild('emptyChildrenTemplate', { static: true }) emptyChildrenTemplate: TemplateRef<any>;\n set emptyChildrenTemplateRef(template: TemplateRef<any>) {\n if (template) {\n this._emptyChildrenTemplateRef = template;\n }\n }\n\n get emptyChildrenTemplateRef() {\n return this._emptyChildrenTemplateRef;\n }\n\n @HostBinding('class.thy-tree')\n thyTreeClass = true;\n\n @HostBinding('class.thy-tree-dragging')\n dragging: boolean;\n\n @ViewChildren(CdkDrag) cdkDrags: QueryList<CdkDrag<ThyTreeNode>>;\n\n constructor(public thyTreeService: ThyTreeService, private cdr: ChangeDetectorRef, @Inject(DOCUMENT) private document: Document) {}\n\n ngOnInit(): void {\n this._initThyNodes();\n this._setTreeType();\n this._setTreeSize();\n this._instanceSelectionModel();\n this._selectTreeNodes(this.thySelectedKeys);\n\n this.thyTreeService.flattenNodes$.subscribe(flattenTreeNodes => {\n this.flattenTreeNodes = flattenTreeNodes;\n this.cdr.markForCheck();\n });\n }\n\n ngAfterViewInit(): void {\n this.cdkDrags.changes\n .pipe(startWith(this.cdkDrags), takeUntil(this.destroy$))\n .subscribe((drags: QueryList<CdkDrag<ThyTreeNode>>) => {\n this.nodeDragsMap.clear();\n drags.forEach(drag => {\n if (drag.data) {\n // cdkDrag 变化时,缓存 Element 与 DragRef 的关系,方便 Drag Move 时查找\n this.nodeDragsMap.set(drag.element.nativeElement, drag);\n }\n });\n });\n\n this.nodeDragMoved\n .pipe(\n // auditTime(30),\n // auditTime 可能会导致拖动结束后仍然执行 moved ,所以通过判断 dragging 状态来过滤无效 moved\n filter((event: CdkDragMove) => event.source._dragRef.isDragging()),\n takeUntil(this.destroy$)\n )\n .subscribe(event => {\n this.onDragMoved(event);\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.thyNodes && !changes.thyNodes.isFirstChange()) {\n this._initThyNodes();\n }\n if (changes.thyType && !changes.thyType.isFirstChange()) {\n this._setTreeType();\n }\n if (changes.thyMultiple && !changes.thyMultiple.isFirstChange()) {\n this._instanceSelectionModel();\n }\n\n if (changes.thySelectedKeys && !changes.thySelectedKeys.isFirstChange()) {\n this._selectedKeys = changes.thySelectedKeys.currentValue;\n this._selectTreeNodes(changes.thySelectedKeys.currentValue);\n }\n\n if (changes.thyExpandedKeys && !changes.thyExpandedKeys.isFirstChange()) {\n this._handleExpandedKeys();\n }\n if (changes.thyExpandAll && !changes.thyExpandAll.isFirstChange()) {\n this._handleExpandedKeys();\n }\n }\n\n renderView = () => {};\n\n eventTriggerChanged(event: ThyTreeEmitEvent): void {\n switch (event.eventName) {\n case 'expand':\n this.thyOnExpandChange.emit(event);\n break;\n\n case 'checkboxChange':\n this.thyOnCheckboxChange.emit(event);\n break;\n }\n }\n\n private _initThyNodes() {\n this._expandedKeys = this.getExpandedNodes().map(node => node.key);\n this._selectedKeys = this.getSelectedNodes().map(node => node.key);\n this.thyTreeService.initializeTreeNodes(this.thyNodes);\n this.flattenTreeNodes = this.thyTreeService.flattenTreeNodes;\n this._selectTreeNodes(this._selectedKeys);\n this._handleExpandedKeys();\n }\n\n private _handleExpandedKeys() {\n if (this.thyExpandedKeys?.length) {\n this._expandedKeys = helpers.concatArray(\n this.thyExpandedKeys.filter(key => !this._expandedKeys.includes(key)),\n this._expandedKeys\n );\n }\n this.thyTreeService.expandTreeNodes(this.thyExpandAll || this._expandedKeys);\n }\n\n private _setTreeType() {\n if (this.thyType && treeTypeClassMap[this.thyType]) {\n treeTypeClassMap[this.thyType].forEach(className => {\n this.hostRenderer.addClass(className);\n });\n }\n }\n\n private _setTreeSize() {\n if (this.thySize) {\n this.hostRenderer.addClass(`thy-tree-${this.thySize}`);\n }\n }\n\n private _instanceSelectionModel() {\n this._selectionModel = new SelectionModel<any>(this.thyMultiple);\n }\n\n private _selectTreeNodes(keys: (string | number)[]) {\n (keys || []).forEach(key => {\n const node = this.thyTreeService.getTreeNode(key);\n if (node) {\n this.selectTreeNode(this.thyTreeService.getTreeNode(key));\n }\n });\n }\n\n isSelected(node: ThyTreeNode) {\n return this._selectionModel.isSelected(node);\n }\n\n toggleTreeNode(node: ThyTreeNode) {\n if (node && !node.isDisabled) {\n this._selectionModel.toggle(node);\n }\n }\n\n trackByFn(index: number, item: any) {\n return item.key || index;\n }\n\n isShowExpand(node: ThyTreeNode) {\n if (helpers.isFunction(this.thyShowExpand)) {\n return (this.thyShowExpand as Function)(node);\n } else {\n return this.thyShowExpand;\n }\n }\n\n writeValue(value: ThyTreeNodeData[]): void {\n if (value) {\n this.thyNodes = value;\n this._initThyNodes();\n }\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n onDragStarted(event: CdkDragStart<ThyTreeNode>) {\n this.dragging = true;\n this.startDragNodeClone = Object.assign({}, event.source.data);\n if (event.source.data.isExpanded) {\n event.source.data.setExpanded(false);\n }\n }\n\n emitDragMoved(event: CdkDragMove) {\n this.nodeDragMoved.next(event);\n }\n\n onDragMoved(event: CdkDragMove<ThyTreeNode>) {\n // 通过鼠标位置查找对应的目标 Item 元素\n let currentPointElement = this.document.elementFromPoint(event.pointerPosition.x, event.pointerPosition.y) as HTMLElement;\n if (!currentPointElement) {\n this.cleanupDragArtifacts();\n return;\n }\n let targetElement = currentPointElement.classList.contains('thy-tree-node')\n ? currentPointElement\n : (currentPointElement.closest('.thy-tree-node') as HTMLElement);\n if (!targetElement) {\n this.cleanupDragArtifacts();\n return;\n }\n // 缓存放置目标Id 并计算鼠标相对应的位置\n this.nodeDropTarget = {\n key: this.nodeDragsMap.get(targetElement)?.data.key,\n position: this.getTargetPosition(targetElement, event)\n };\n // 执行外部传入的 dropEnterPredicate 判断是否允许拖入目标项\n if (this.dropEnterPredicate) {\n const targetDragRef = this.nodeDragsMap.get(targetElement);\n if (\n this.dropEnterPredicate({\n source: event.source.data,\n target: targetDragRef.data,\n dropPosition: this.nodeDropTarget.position\n })\n ) {\n this.showDropPositionPlaceholder(targetElement);\n } else {\n this.nodeDropTarget = null;\n this.cleanupDragArtifacts();\n }\n } else {\n this.showDropPositionPlaceholder(targetElement);\n }\n }\n\n onDragEnded(event: CdkDragEnd<ThyTreeNode>) {\n this.dragging = false;\n // 拖拽结束后恢复原始的展开状态\n event.source.data.setExpanded(this.startDragNodeClone.isExpanded);\n setTimeout(() => {\n this.startDragNodeClone = null;\n });\n }\n\n onListDropped(event: CdkDragDrop<ThyTreeNode[], ThyTreeNode[], ThyTreeNode>) {\n if (!this.nodeDropTarget) {\n return;\n }\n if (!this.isShowExpand(this.startDragNodeClone) && this.nodeDropTarget.position === ThyTreeDropPosition.in) {\n this.cleanupDragArtifacts();\n return;\n }\n\n const sourceNode = this.startDragNodeClone;\n const sourceNodeParent = sourceNode.parentNode;\n const targetDragRef = this.cdkDrags.find(item => item.data?.key === this.nodeDropTarget.key);\n const targetNode = targetDragRef?.data;\n const targetNodeParent = targetNode.parentNode;\n\n const beforeDragDropContext: ThyTreeBeforeDragDropContext = {\n previousItem: sourceNode,\n previousContainerItems: sourceNodeParent?.children,\n item: targetNode,\n containerItems: targetNodeParent?.children,\n position: this.nodeDropTarget.position\n };\n\n if (this.thyBeforeDragDrop && !this.thyBeforeDragDrop(beforeDragDropContext)) {\n this.cleanupDragArtifacts();\n return;\n }\n\n this.thyTreeService.deleteTreeNode(sourceNode);\n\n switch (this.nodeDropTarget.position) {\n case 'before':\n const beforeInsertIndex = (targetNodeParent?.children || this.treeNodes).indexOf(targetNode);\n this.thyTreeService.addTreeNode(sourceNode, targetNodeParent, beforeInsertIndex);\n break;\n case 'after':\n const afterInsertIndex = (targetNodeParent?.children || this.treeNodes).indexOf(targetNode) + 1;\n this.thyTreeService.addTreeNode(sourceNode, targetNodeParent, afterInsertIndex);\n break;\n case 'in':\n this.thyTreeService.addTreeNode(sourceNode, targetNode);\n break;\n }\n\n this.thyTreeService.syncFlattenTreeNodes();\n\n let after: ThyTreeNode = null;\n let targe: ThyTreeNode = null;\n if (beforeDragDropContext.position === ThyTreeDropPosition.before) {\n const targetContainerNodes = targetNodeParent?.children || this.treeNodes;\n after = targetContainerNodes[targetContainerNodes.indexOf(targetNode) - 2];\n targe = targetNodeParent;\n } else if (beforeDragDropContext.position === ThyTreeDropPosition.after) {\n after = targetNode;\n targe = targetNodeParent;\n } else {\n after = targetNode.children?.length > 0 ? targetNode.children[targetNode.children.length - 2] : null;\n targe = targetNode;\n }\n\n this.thyOnDragDrop.emit({\n dragNode: this.thyTreeService.getTreeNode(sourceNode.key),\n targetNode: targe,\n afterNode: after\n });\n\n this.cleanupDragArtifacts();\n }\n\n private getTargetPosition(target: HTMLElement, event: CdkDragMove) {\n const targetRect = target.getBoundingClientRect();\n const beforeOrAfterGap = targetRect.height * 0.3;\n // 将 Node 高度分为上中下三段,其中上下的 Gap 为 height 的 30%,通过判断鼠标位置在哪一段 gap 来计算对应的位置\n if (event.pointerPosition.y - targetRect.top < beforeOrAfterGap) {\n return ThyTreeDropPosition.before;\n } else if (event.pointerPosition.y >= targetRect.bottom - beforeOrAfterGap) {\n return ThyTreeDropPosition.after;\n } else {\n return ThyTreeDropPosition.in;\n }\n }\n\n private showDropPositionPlaceholder(targetElement: HTMLElement) {\n this.cleanupDropPositionPlaceholder();\n if (this.nodeDropTarget && targetElement) {\n targetElement.classList.add(`drop-position-${this.nodeDropTarget.position}`);\n }\n }\n\n private cleanupDropPositionPlaceholder() {\n this.document.querySelectorAll('.drop-position-before').forEach(element => element.classList.remove('drop-position-before'));\n this.document.querySelectorAll('.drop-position-after').forEach(element => element.classList.remove('drop-position-after'));\n this.document.querySelectorAll('.drop-position-in').forEach(element => element.classList.remove('drop-position-in'));\n }\n\n private cleanupDragArtifacts() {\n this.nodeDropTarget = null;\n this.cleanupDropPositionPlaceholder();\n }\n\n // region Public Functions\n\n selectTreeNode(node: ThyTreeNode) {\n if (node && !node.isDisabled) {\n this._selectionModel.select(node);\n this.thyTreeService.syncFlattenTreeNodes();\n }\n }\n\n getRootNodes(): ThyTreeNode[] {\n return this.treeNodes;\n }\n\n getTreeNode(key: string) {\n return this.thyTreeService.getTreeNode(key);\n }\n\n getSelectedNode(): ThyTreeNode {\n return this._selectionModel ? this._selectionModel.selected[0] : null;\n }\n\n getSelectedNodes(): ThyTreeNode[] {\n return this._selectionModel ? this._selectionModel.selected : [];\n }\n\n getExpandedNodes(): ThyTreeNode[] {\n return this.thyTreeService.getExpandedNodes();\n }\n\n getCheckedNodes(): ThyTreeNode[] {\n return this.thyTreeService.getCheckedNodes();\n }\n\n addTreeNode(node: ThyTreeNodeData, parent?: ThyTreeNode, index = -1) {\n this.thyTreeService.addTreeNode(new ThyTreeNode(node, null, this.thyTreeService), parent, index);\n this.thyTreeService.syncFlattenTreeNodes();\n }\n\n deleteTreeNode(node: ThyTreeNode) {\n if (this.isSelected(node)) {\n this._selectionModel.toggle(node);\n }\n this.thyTreeService.deleteTreeNode(node);\n this.thyTreeService.syncFlattenTreeNodes();\n }\n\n expandAllNodes() {\n const nodes = this.getRootNodes();\n nodes.forEach(n => n.setExpanded(true, true));\n }\n\n collapsedAllNodes() {\n const nodes = this.getRootNodes();\n nodes.forEach(n => n.setExpanded(false, true));\n }\n\n // endregion\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","<cdk-virtual-scroll-viewport\n #viewport\n *ngIf=\"thyVirtualScroll\"\n [itemSize]=\"thyItemSize\"\n [style.height]=\"'100%'\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"flattenTreeNodes\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\"\n >\n <div class=\"virtual-trees-container\">\n <thy-tree-node\n *cdkVirtualFor=\"let node of flattenTreeNodes; trackBy: trackByFn; let i = index\"\n cdkDrag\n [cdkDragData]=\"node\"\n [cdkDragDisabled]=\"!thyDraggable || !(node | treeNodeDraggable : thyBeforeDragStart)\"\n (cdkDragStarted)=\"onDragStarted($event)\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n (cdkDragMoved)=\"emitDragMoved($event)\"\n [node]=\"node\"\n [templateRef]=\"templateRef\"\n [emptyChildrenTemplateRef]=\"emptyChildrenTemplate\"\n [thyAsync]=\"thyAsync\"\n [thyDraggable]=\"thyDraggable\"\n [thyCheckable]=\"thyCheckable\"\n [thyMultiple]=\"thyMultiple\"\n [thyClickBehavior]=\"thyClickBehavior\"\n [thyTitleTruncate]=\"thyTitleTruncate\"\n [thyItemSize]=\"thyItemSize\"\n [thyIndent]=\"thyIndent\"\n (thyOnClick)=\"thyOnClick.emit($event)\"\n (thyDblClick)=\"thyDblClick.emit($event)\"\n (thyOnExpandChange)=\"eventTriggerChanged($event)\"\n (thyOnCheckboxChange)=\"eventTriggerChanged($event)\">\n </thy-tree-node>\n </div>\n</cdk-virtual-scroll-viewport>\n\n<div\n *ngIf=\"!thyVirtualScroll\"\n cdkDropList\n [cdkDropListAutoScrollStep]=\"6\"\n [cdkDropListData]=\"flattenTreeNodes\"\n [cdkDropListSortingDisabled]=\"true\"\n (cdkDropListDropped)=\"onListDropped($event)\">\n <thy-tree-node\n *ngFor=\"let node of flattenTreeNodes; trackBy: trackByFn; let i = index\"\n cdkDrag\n [cdkDragData]=\"node\"\n [cdkDragDisabled]=\"!thyDraggable || !(node | treeNodeDraggable : thyBeforeDragStart)\"\n (cdkDragStarted)=\"onDragStarted($event)\"\n (cdkDragEnded)=\"onDragEnded($event)\"\n (cdkDragMoved)=\"emitDragMoved($event)\"\n [node]=\"node\"\n [templateRef]=\"templateRef\"\n [emptyChildrenTemplateRef]=\"emptyChildrenTemplate\"\n [thyAsync]=\"thyAsync\"\n [thyDraggable]=\"thyDraggable\"\n [thyCheckable]=\"thyCheckable\"\n [thyMultiple]=\"thyMultiple\"\n [thyTitleTruncate]=\"thyTitleTruncate\"\n [thyItemSize]=\"thyItemSize\"\n [thyClickBehavior]=\"thyClickBehavior\"\n [thyIndent]=\"thyIndent\"\n (thyOnClick)=\"thyOnClick.emit($event)\"\n (thyDblClick)=\"thyDblClick.emit($event)\"\n (thyOnExpandChange)=\"eventTriggerChanged($event)\"\n (thyOnCheckboxChange)=\"thyOnCheckboxChange.emit($event)\">\n </thy-tree-node>\n</div>\n","import { ThyButtonModule } from 'ngx-tethys/button';\nimport { ThyCheckboxModule } from 'ngx-tethys/checkbox';\nimport { ThyIconModule } from 'ngx-tethys/icon';\nimport { ThyInputModule } from 'ngx-tethys/input';\nimport { ThyListModule } from 'ngx-tethys/list';\nimport { ThyLoadingModule } from 'ngx-tethys/loading';\nimport { ThyOptionModule, ThySharedModule } from 'ngx-tethys/shared';\n\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ThyTreeNodeComponent } from './tree-node.component';\nimport { ThyTree } from './tree.component';\nimport { ThyTreeService } from './tree.service';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { ThyTreeNodeDraggablePipe } from './tree.pipe';\n\n@NgModule({\n imports: [\n DragDropModule,\n CommonModule,\n ThyInputModule,\n ThyButtonModule,\n ThySharedModule,\n FormsModule,\n ThyListModule,\n ThyOptionModule,\n ThyLoadingModule,\n ThyIconModule,\n ThyCheckboxModule,\n ScrollingModule,\n ThyTree,\n ThyTreeNodeComponent,\n ThyTreeNodeDraggablePipe\n ],\n exports: [ThyTree, ThyTreeNodeComponent],\n providers: [ThyTreeService]\n})\nexport class ThyTreeModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ThyTreeService"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Version } from '@angular/core';
2
2
 
3
- const VERSION = new Version('17.0.12');
3
+ const VERSION = new Version('17.0.13');
4
4
 
5
5
  /**
6
6
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-tethys.mjs","sources":["../../../src/version.ts","../../../src/ngx-tethys.ts"],"sourcesContent":["import { Version } from '@angular/core';\n\nexport const VERSION = new Version('17.0.12');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;MAEa,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS;;ACF5C;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-tethys.mjs","sources":["../../../src/version.ts","../../../src/ngx-tethys.ts"],"sourcesContent":["import { Version } from '@angular/core';\n\nexport const VERSION = new Version('17.0.13');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;MAEa,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS;;ACF5C;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-tethys",
3
- "version": "17.0.12",
3
+ "version": "17.0.13",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+ssh://git@github.com/atinc/ngx-tethys.git"
@@ -1 +1 @@
1
- export declare const VERSION = "17.0.12";
1
+ export declare const VERSION = "17.0.13";
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = '17.0.12';
4
+ exports.VERSION = '17.0.13';
@@ -117,6 +117,14 @@ export declare class ThyTree implements ControlValueAccessor, OnInit, OnChanges,
117
117
  * @default []
118
118
  */
119
119
  thySelectedKeys: string[];
120
+ /**
121
+ * 展开指定的树节点
122
+ */
123
+ thyExpandedKeys: (string | number)[];
124
+ /**
125
+ * 是否展开所有树节点
126
+ */
127
+ thyExpandAll: boolean;
120
128
  /**
121
129
  * 设置缩进距离,缩进距离 = thyIndent * node.level
122
130
  * @type number
@@ -171,6 +179,7 @@ export declare class ThyTree implements ControlValueAccessor, OnInit, OnChanges,
171
179
  renderView: () => void;
172
180
  eventTriggerChanged(event: ThyTreeEmitEvent): void;
173
181
  private _initThyNodes;
182
+ private _handleExpandedKeys;
174
183
  private _setTreeType;
175
184
  private _setTreeSize;
176
185
  private _instanceSelectionModel;
@@ -204,7 +213,7 @@ export declare class ThyTree implements ControlValueAccessor, OnInit, OnChanges,
204
213
  collapsedAllNodes(): void;
205
214
  ngOnDestroy(): void;
206
215
  static ɵfac: i0.ɵɵFactoryDeclaration<ThyTree, never>;
207
- static ɵcmp: i0.ɵɵComponentDeclaration<ThyTree, "thy-tree", never, { "thyNodes": { "alias": "thyNodes"; "required": false; }; "thyShowExpand": { "alias": "thyShowExpand"; "required": false; }; "thyMultiple": { "alias": "thyMultiple"; "required": false; }; "thyDraggable": { "alias": "thyDraggable"; "required": false; }; "thyCheckable": { "alias": "thyCheckable"; "required": false; }; "thyClickBehavior": { "alias": "thyClickBehavior"; "required": false; }; "thyCheckStateResolve": { "alias": "thyCheckStateResolve"; "required": false; }; "thyAsync": { "alias": "thyAsync"; "required": false; }; "thyType": { "alias": "thyType"; "required": false; }; "thyIcons": { "alias": "thyIcons"; "required": false; }; "thySize": { "alias": "thySize"; "required": false; }; "thyVirtualScroll": { "alias": "thyVirtualScroll"; "required": false; }; "thyItemSize": { "alias": "thyItemSize"; "required": false; }; "thyTitleTruncate": { "alias": "thyTitleTruncate"; "required": false; }; "thySelectedKeys": { "alias": "thySelectedKeys"; "required": false; }; "thyIndent": { "alias": "thyIndent"; "required": false; }; "thyBeforeDragStart": { "alias": "thyBeforeDragStart"; "required": false; }; "thyBeforeDragDrop": { "alias": "thyBeforeDragDrop"; "required": false; }; }, { "viewport": "viewport"; "thyOnClick": "thyOnClick"; "thyOnCheckboxChange": "thyOnCheckboxChange"; "thyOnExpandChange": "thyOnExpandChange"; "thyOnDragDrop": "thyOnDragDrop"; "thyDblClick": "thyDblClick"; }, ["templateRef", "emptyChildrenTemplate"], never, true, never>;
216
+ static ɵcmp: i0.ɵɵComponentDeclaration<ThyTree, "thy-tree", never, { "thyNodes": { "alias": "thyNodes"; "required": false; }; "thyShowExpand": { "alias": "thyShowExpand"; "required": false; }; "thyMultiple": { "alias": "thyMultiple"; "required": false; }; "thyDraggable": { "alias": "thyDraggable"; "required": false; }; "thyCheckable": { "alias": "thyCheckable"; "required": false; }; "thyClickBehavior": { "alias": "thyClickBehavior"; "required": false; }; "thyCheckStateResolve": { "alias": "thyCheckStateResolve"; "required": false; }; "thyAsync": { "alias": "thyAsync"; "required": false; }; "thyType": { "alias": "thyType"; "required": false; }; "thyIcons": { "alias": "thyIcons"; "required": false; }; "thySize": { "alias": "thySize"; "required": false; }; "thyVirtualScroll": { "alias": "thyVirtualScroll"; "required": false; }; "thyItemSize": { "alias": "thyItemSize"; "required": false; }; "thyTitleTruncate": { "alias": "thyTitleTruncate"; "required": false; }; "thySelectedKeys": { "alias": "thySelectedKeys"; "required": false; }; "thyExpandedKeys": { "alias": "thyExpandedKeys"; "required": false; }; "thyExpandAll": { "alias": "thyExpandAll"; "required": false; }; "thyIndent": { "alias": "thyIndent"; "required": false; }; "thyBeforeDragStart": { "alias": "thyBeforeDragStart"; "required": false; }; "thyBeforeDragDrop": { "alias": "thyBeforeDragDrop"; "required": false; }; }, { "viewport": "viewport"; "thyOnClick": "thyOnClick"; "thyOnCheckboxChange": "thyOnCheckboxChange"; "thyOnExpandChange": "thyOnExpandChange"; "thyOnDragDrop": "thyOnDragDrop"; "thyDblClick": "thyDblClick"; }, ["templateRef", "emptyChildrenTemplate"], never, true, never>;
208
217
  static ngAcceptInputType_thyMultiple: boolean | string | number;
209
218
  static ngAcceptInputType_thyDraggable: boolean | string | number;
210
219
  static ngAcceptInputType_thyCheckable: boolean | string | number;
@@ -212,6 +221,7 @@ export declare class ThyTree implements ControlValueAccessor, OnInit, OnChanges,
212
221
  static ngAcceptInputType_thyVirtualScroll: boolean | string | number;
213
222
  static ngAcceptInputType_thyItemSize: unknown;
214
223
  static ngAcceptInputType_thyTitleTruncate: boolean | string | number;
224
+ static ngAcceptInputType_thyExpandAll: boolean | string | number;
215
225
  static ngAcceptInputType_thyIndent: unknown;
216
226
  }
217
227
  export {};
@@ -30,7 +30,7 @@ export declare class ThyTreeService implements OnDestroy {
30
30
  getCheckedNodes(): ThyTreeNode[];
31
31
  deleteTreeNode(node: ThyTreeNode): void;
32
32
  addTreeNode(node: ThyTreeNode, parent?: ThyTreeNode, index?: number): void;
33
- expandTreeNodes(keyOrKeys: string | number | (string | number)[]): void;
33
+ expandTreeNodes(keyOrKeys: string | number | (string | number)[] | true): void;
34
34
  setNodeChecked(node: ThyTreeNode, checked: boolean, propagateUp?: boolean, propagateDown?: boolean): void;
35
35
  private _setNodeChecked;
36
36
  syncNodeCheckState(node: ThyTreeNode): void;