@covalent/core 3.1.2 → 4.0.0
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/bundles/covalent-core-user-profile.umd.js +1 -9
- package/bundles/covalent-core-user-profile.umd.js.map +1 -1
- package/bundles/covalent-core-user-profile.umd.min.js.map +1 -1
- package/esm2015/user-profile/user-profile.module.js +3 -11
- package/fesm2015/covalent-core-user-profile.js +1 -9
- package/fesm2015/covalent-core-user-profile.js.map +1 -1
- package/package.json +1 -1
- package/schematics/components.js +1 -14
- package/schematics/components.js.map +1 -1
- package/theming/_all-theme.scss +0 -14
- package/theming/prebuilt/blue-grey-deep-orange.css +0 -248
- package/theming/prebuilt/blue-grey-deep-orange.css.map +1 -1
- package/theming/prebuilt/blue-orange.css +0 -248
- package/theming/prebuilt/blue-orange.css.map +1 -1
- package/theming/prebuilt/indigo-pink.css +0 -248
- package/theming/prebuilt/indigo-pink.css.map +1 -1
- package/theming/prebuilt/orange-light-blue.css +0 -248
- package/theming/prebuilt/orange-light-blue.css.map +1 -1
- package/theming/prebuilt/teal-orange.css +0 -248
- package/theming/prebuilt/teal-orange.css.map +1 -1
- package/typography/_all-typography.scss +0 -10
- package/user-profile/covalent-core-user-profile.metadata.json +1 -1
- package/bundles/covalent-core-chips.umd.js +0 -1507
- package/bundles/covalent-core-chips.umd.js.map +0 -1
- package/bundles/covalent-core-chips.umd.min.js +0 -16
- package/bundles/covalent-core-chips.umd.min.js.map +0 -1
- package/bundles/covalent-core-data-table.umd.js +0 -2756
- package/bundles/covalent-core-data-table.umd.js.map +0 -1
- package/bundles/covalent-core-data-table.umd.min.js +0 -16
- package/bundles/covalent-core-data-table.umd.min.js.map +0 -1
- package/bundles/covalent-core-expansion-panel.umd.js +0 -853
- package/bundles/covalent-core-expansion-panel.umd.js.map +0 -1
- package/bundles/covalent-core-expansion-panel.umd.min.js +0 -16
- package/bundles/covalent-core-expansion-panel.umd.min.js.map +0 -1
- package/bundles/covalent-core-loading.umd.js +0 -1534
- package/bundles/covalent-core-loading.umd.js.map +0 -1
- package/bundles/covalent-core-loading.umd.min.js +0 -16
- package/bundles/covalent-core-loading.umd.min.js.map +0 -1
- package/bundles/covalent-core-media.umd.js +0 -749
- package/bundles/covalent-core-media.umd.js.map +0 -1
- package/bundles/covalent-core-media.umd.min.js +0 -16
- package/bundles/covalent-core-media.umd.min.js.map +0 -1
- package/bundles/covalent-core-nav-links.umd.js +0 -197
- package/bundles/covalent-core-nav-links.umd.js.map +0 -1
- package/bundles/covalent-core-nav-links.umd.min.js +0 -2
- package/bundles/covalent-core-nav-links.umd.min.js.map +0 -1
- package/bundles/covalent-core-notifications.umd.js +0 -275
- package/bundles/covalent-core-notifications.umd.js.map +0 -1
- package/bundles/covalent-core-notifications.umd.min.js +0 -2
- package/bundles/covalent-core-notifications.umd.min.js.map +0 -1
- package/bundles/covalent-core-paging.umd.js +0 -491
- package/bundles/covalent-core-paging.umd.js.map +0 -1
- package/bundles/covalent-core-paging.umd.min.js +0 -2
- package/bundles/covalent-core-paging.umd.min.js.map +0 -1
- package/bundles/covalent-core-sidesheet.umd.js +0 -145
- package/bundles/covalent-core-sidesheet.umd.js.map +0 -1
- package/bundles/covalent-core-sidesheet.umd.min.js +0 -2
- package/bundles/covalent-core-sidesheet.umd.min.js.map +0 -1
- package/bundles/covalent-core-steps.umd.js +0 -1756
- package/bundles/covalent-core-steps.umd.js.map +0 -1
- package/bundles/covalent-core-steps.umd.min.js +0 -16
- package/bundles/covalent-core-steps.umd.min.js.map +0 -1
- package/bundles/covalent-core-tab-select.umd.js +0 -732
- package/bundles/covalent-core-tab-select.umd.js.map +0 -1
- package/bundles/covalent-core-tab-select.umd.min.js +0 -16
- package/bundles/covalent-core-tab-select.umd.min.js.map +0 -1
- package/bundles/covalent-core-virtual-scroll.umd.js +0 -785
- package/bundles/covalent-core-virtual-scroll.umd.js.map +0 -1
- package/bundles/covalent-core-virtual-scroll.umd.min.js +0 -16
- package/bundles/covalent-core-virtual-scroll.umd.min.js.map +0 -1
- package/chips/README.md +0 -99
- package/chips/_chips-theme.scss +0 -87
- package/chips/chips.component.d.ts +0 -287
- package/chips/chips.component.scss +0 -147
- package/chips/chips.module.d.ts +0 -2
- package/chips/covalent-core-chips.d.ts +0 -4
- package/chips/covalent-core-chips.metadata.json +0 -1
- package/chips/index.d.ts +0 -1
- package/chips/package.json +0 -11
- package/chips/public-api.d.ts +0 -2
- package/data-table/README.md +0 -134
- package/data-table/_data-table-theme.scss +0 -115
- package/data-table/covalent-core-data-table.d.ts +0 -4
- package/data-table/covalent-core-data-table.metadata.json +0 -1
- package/data-table/data-table-cell/data-table-cell.component.d.ts +0 -22
- package/data-table/data-table-cell/data-table-cell.component.scss +0 -58
- package/data-table/data-table-column/data-table-column.component.d.ts +0 -63
- package/data-table/data-table-column/data-table-column.component.scss +0 -80
- package/data-table/data-table-row/data-table-row.component.d.ts +0 -20
- package/data-table/data-table-row/data-table-row.component.scss +0 -12
- package/data-table/data-table-table/data-table-table.component.d.ts +0 -6
- package/data-table/data-table-table/data-table-table.component.scss +0 -7
- package/data-table/data-table.component.d.ts +0 -356
- package/data-table/data-table.component.scss +0 -93
- package/data-table/data-table.module.d.ts +0 -2
- package/data-table/directives/data-table-template.directive.d.ts +0 -6
- package/data-table/index.d.ts +0 -1
- package/data-table/package.json +0 -11
- package/data-table/public-api.d.ts +0 -8
- package/data-table/services/data-table.service.d.ts +0 -31
- package/esm2015/chips/chips.component.js +0 -1115
- package/esm2015/chips/chips.module.js +0 -23
- package/esm2015/chips/covalent-core-chips.js +0 -10
- package/esm2015/chips/index.js +0 -7
- package/esm2015/chips/public-api.js +0 -8
- package/esm2015/data-table/covalent-core-data-table.js +0 -10
- package/esm2015/data-table/data-table-cell/data-table-cell.component.js +0 -88
- package/esm2015/data-table/data-table-column/data-table-column.component.js +0 -218
- package/esm2015/data-table/data-table-row/data-table-row.component.js +0 -132
- package/esm2015/data-table/data-table-table/data-table-table.component.js +0 -43
- package/esm2015/data-table/data-table.component.js +0 -1640
- package/esm2015/data-table/data-table.module.js +0 -39
- package/esm2015/data-table/directives/data-table-template.directive.js +0 -32
- package/esm2015/data-table/index.js +0 -7
- package/esm2015/data-table/public-api.js +0 -14
- package/esm2015/data-table/services/data-table.service.js +0 -116
- package/esm2015/expansion-panel/covalent-core-expansion-panel.js +0 -10
- package/esm2015/expansion-panel/expansion-panel-group.component.js +0 -212
- package/esm2015/expansion-panel/expansion-panel.component.js +0 -272
- package/esm2015/expansion-panel/expansion-panel.module.js +0 -31
- package/esm2015/expansion-panel/index.js +0 -7
- package/esm2015/expansion-panel/public-api.js +0 -9
- package/esm2015/loading/covalent-core-loading.js +0 -10
- package/esm2015/loading/directives/loading.directive.js +0 -231
- package/esm2015/loading/index.js +0 -7
- package/esm2015/loading/loading.component.js +0 -302
- package/esm2015/loading/loading.module.js +0 -30
- package/esm2015/loading/public-api.js +0 -11
- package/esm2015/loading/services/loading.factory.js +0 -297
- package/esm2015/loading/services/loading.service.js +0 -319
- package/esm2015/media/covalent-core-media.js +0 -10
- package/esm2015/media/directives/media-toggle.directive.js +0 -207
- package/esm2015/media/index.js +0 -7
- package/esm2015/media/media.module.js +0 -20
- package/esm2015/media/public-api.js +0 -9
- package/esm2015/media/services/media.service.js +0 -169
- package/esm2015/nav-links/covalent-core-nav-links.js +0 -10
- package/esm2015/nav-links/index.js +0 -7
- package/esm2015/nav-links/nav-links.component.js +0 -138
- package/esm2015/nav-links/nav-links.module.js +0 -37
- package/esm2015/nav-links/public-api.js +0 -8
- package/esm2015/notifications/covalent-core-notifications.js +0 -10
- package/esm2015/notifications/index.js +0 -7
- package/esm2015/notifications/notification-count.component.js +0 -191
- package/esm2015/notifications/notifications.module.js +0 -20
- package/esm2015/notifications/public-api.js +0 -8
- package/esm2015/paging/covalent-core-paging.js +0 -10
- package/esm2015/paging/index.js +0 -7
- package/esm2015/paging/paging-bar.component.js +0 -412
- package/esm2015/paging/paging.module.js +0 -20
- package/esm2015/paging/public-api.js +0 -8
- package/esm2015/sidesheet/covalent-core-sidesheet.js +0 -10
- package/esm2015/sidesheet/index.js +0 -7
- package/esm2015/sidesheet/public-api.js +0 -8
- package/esm2015/sidesheet/sidesheet.component.js +0 -72
- package/esm2015/sidesheet/sidesheet.module.js +0 -27
- package/esm2015/steps/covalent-core-steps.js +0 -10
- package/esm2015/steps/index.js +0 -7
- package/esm2015/steps/nav/nav-step-link/nav-step-link.component.js +0 -144
- package/esm2015/steps/nav/nav-steps-horizontal/nav-steps-horizontal.component.js +0 -371
- package/esm2015/steps/nav/nav-steps-vertical/nav-steps-vertical.component.js +0 -130
- package/esm2015/steps/public-api.js +0 -14
- package/esm2015/steps/step-body/step-body.component.js +0 -83
- package/esm2015/steps/step-header/step-header.component.js +0 -79
- package/esm2015/steps/step.component.js +0 -312
- package/esm2015/steps/steps.component.js +0 -234
- package/esm2015/steps/steps.module.js +0 -44
- package/esm2015/tab-select/covalent-core-tab-select.js +0 -10
- package/esm2015/tab-select/index.js +0 -7
- package/esm2015/tab-select/public-api.js +0 -9
- package/esm2015/tab-select/tab-option.component.js +0 -82
- package/esm2015/tab-select/tab-select.component.js +0 -291
- package/esm2015/tab-select/tab-select.module.js +0 -31
- package/esm2015/virtual-scroll/covalent-core-virtual-scroll.js +0 -10
- package/esm2015/virtual-scroll/index.js +0 -7
- package/esm2015/virtual-scroll/public-api.js +0 -9
- package/esm2015/virtual-scroll/virtual-scroll-container.component.js +0 -391
- package/esm2015/virtual-scroll/virtual-scroll-row.directive.js +0 -25
- package/esm2015/virtual-scroll/virtual-scroll.module.js +0 -21
- package/expansion-panel/README.md +0 -116
- package/expansion-panel/_expansion-panel-theme.scss +0 -80
- package/expansion-panel/covalent-core-expansion-panel.d.ts +0 -4
- package/expansion-panel/covalent-core-expansion-panel.metadata.json +0 -1
- package/expansion-panel/expansion-panel-group.component.d.ts +0 -31
- package/expansion-panel/expansion-panel-group.component.scss +0 -0
- package/expansion-panel/expansion-panel.component.d.ts +0 -82
- package/expansion-panel/expansion-panel.component.scss +0 -50
- package/expansion-panel/expansion-panel.module.d.ts +0 -2
- package/expansion-panel/index.d.ts +0 -1
- package/expansion-panel/package.json +0 -11
- package/expansion-panel/public-api.d.ts +0 -3
- package/fesm2015/covalent-core-chips.js +0 -1151
- package/fesm2015/covalent-core-chips.js.map +0 -1
- package/fesm2015/covalent-core-data-table.js +0 -2309
- package/fesm2015/covalent-core-data-table.js.map +0 -1
- package/fesm2015/covalent-core-expansion-panel.js +0 -528
- package/fesm2015/covalent-core-expansion-panel.js.map +0 -1
- package/fesm2015/covalent-core-loading.js +0 -1179
- package/fesm2015/covalent-core-loading.js.map +0 -1
- package/fesm2015/covalent-core-media.js +0 -411
- package/fesm2015/covalent-core-media.js.map +0 -1
- package/fesm2015/covalent-core-nav-links.js +0 -193
- package/fesm2015/covalent-core-nav-links.js.map +0 -1
- package/fesm2015/covalent-core-notifications.js +0 -228
- package/fesm2015/covalent-core-notifications.js.map +0 -1
- package/fesm2015/covalent-core-paging.js +0 -451
- package/fesm2015/covalent-core-paging.js.map +0 -1
- package/fesm2015/covalent-core-sidesheet.js +0 -118
- package/fesm2015/covalent-core-sidesheet.js.map +0 -1
- package/fesm2015/covalent-core-steps.js +0 -1384
- package/fesm2015/covalent-core-steps.js.map +0 -1
- package/fesm2015/covalent-core-tab-select.js +0 -416
- package/fesm2015/covalent-core-tab-select.js.map +0 -1
- package/fesm2015/covalent-core-virtual-scroll.js +0 -453
- package/fesm2015/covalent-core-virtual-scroll.js.map +0 -1
- package/loading/README.md +0 -180
- package/loading/_loading-theme.scss +0 -10
- package/loading/covalent-core-loading.d.ts +0 -4
- package/loading/covalent-core-loading.metadata.json +0 -1
- package/loading/directives/loading.directive.d.ts +0 -71
- package/loading/index.d.ts +0 -1
- package/loading/loading.component.d.ts +0 -87
- package/loading/loading.component.scss +0 -42
- package/loading/loading.module.d.ts +0 -2
- package/loading/package.json +0 -11
- package/loading/public-api.d.ts +0 -5
- package/loading/services/loading.factory.d.ts +0 -66
- package/loading/services/loading.service.d.ts +0 -118
- package/media/covalent-core-media.d.ts +0 -4
- package/media/covalent-core-media.metadata.json +0 -1
- package/media/directives/media-toggle.directive.d.ts +0 -42
- package/media/index.d.ts +0 -1
- package/media/media.module.d.ts +0 -2
- package/media/package.json +0 -11
- package/media/public-api.d.ts +0 -3
- package/media/services/media.service.d.ts +0 -31
- package/nav-links/README.md +0 -1
- package/nav-links/covalent-core-nav-links.d.ts +0 -4
- package/nav-links/covalent-core-nav-links.metadata.json +0 -1
- package/nav-links/index.d.ts +0 -1
- package/nav-links/nav-links.component.d.ts +0 -51
- package/nav-links/nav-links.component.scss +0 -15
- package/nav-links/nav-links.module.d.ts +0 -2
- package/nav-links/package.json +0 -11
- package/nav-links/public-api.d.ts +0 -2
- package/notifications/README.md +0 -69
- package/notifications/_notification-count-theme.scss +0 -27
- package/notifications/covalent-core-notifications.d.ts +0 -4
- package/notifications/covalent-core-notifications.metadata.json +0 -1
- package/notifications/index.d.ts +0 -1
- package/notifications/notification-count.component.d.ts +0 -74
- package/notifications/notification-count.component.scss +0 -90
- package/notifications/notifications.module.d.ts +0 -2
- package/notifications/package.json +0 -11
- package/notifications/public-api.d.ts +0 -2
- package/paging/README.md +0 -141
- package/paging/_paging-bar-theme.scss +0 -26
- package/paging/covalent-core-paging.d.ts +0 -4
- package/paging/covalent-core-paging.metadata.json +0 -1
- package/paging/index.d.ts +0 -1
- package/paging/package.json +0 -11
- package/paging/paging-bar.component.d.ts +0 -115
- package/paging/paging-bar.component.scss +0 -23
- package/paging/paging.module.d.ts +0 -2
- package/paging/public-api.d.ts +0 -2
- package/sidesheet/README.md +0 -68
- package/sidesheet/covalent-core-sidesheet.d.ts +0 -4
- package/sidesheet/covalent-core-sidesheet.metadata.json +0 -1
- package/sidesheet/index.d.ts +0 -1
- package/sidesheet/package.json +0 -11
- package/sidesheet/public-api.d.ts +0 -2
- package/sidesheet/sidesheet.component.d.ts +0 -13
- package/sidesheet/sidesheet.component.scss +0 -101
- package/sidesheet/sidesheet.module.d.ts +0 -2
- package/steps/README.md +0 -159
- package/steps/_steps-theme.scss +0 -108
- package/steps/covalent-core-steps.d.ts +0 -4
- package/steps/covalent-core-steps.metadata.json +0 -1
- package/steps/index.d.ts +0 -1
- package/steps/nav/README.md +0 -90
- package/steps/nav/nav-step-link/nav-step-link.component.d.ts +0 -42
- package/steps/nav/nav-step-link/nav-step-link.component.scss +0 -17
- package/steps/nav/nav-steps-horizontal/nav-steps-horizontal.component.d.ts +0 -79
- package/steps/nav/nav-steps-horizontal/nav-steps-horizontal.component.scss +0 -83
- package/steps/nav/nav-steps-vertical/nav-steps-vertical.component.d.ts +0 -18
- package/steps/nav/nav-steps-vertical/nav-steps-vertical.component.scss +0 -18
- package/steps/package.json +0 -11
- package/steps/public-api.d.ts +0 -8
- package/steps/step-body/step-body.component.d.ts +0 -25
- package/steps/step-body/step-body.component.scss +0 -29
- package/steps/step-header/step-header.component.d.ts +0 -35
- package/steps/step-header/step-header.component.scss +0 -90
- package/steps/step.component.d.ts +0 -97
- package/steps/steps.component.d.ts +0 -60
- package/steps/steps.component.scss +0 -55
- package/steps/steps.module.d.ts +0 -2
- package/tab-select/README.md +0 -93
- package/tab-select/covalent-core-tab-select.d.ts +0 -4
- package/tab-select/covalent-core-tab-select.metadata.json +0 -1
- package/tab-select/index.d.ts +0 -1
- package/tab-select/package.json +0 -11
- package/tab-select/public-api.d.ts +0 -3
- package/tab-select/tab-option.component.d.ts +0 -20
- package/tab-select/tab-option.component.scss +0 -0
- package/tab-select/tab-select.component.d.ts +0 -62
- package/tab-select/tab-select.component.scss +0 -3
- package/tab-select/tab-select.module.d.ts +0 -2
- package/virtual-scroll/README.md +0 -68
- package/virtual-scroll/covalent-core-virtual-scroll.d.ts +0 -4
- package/virtual-scroll/covalent-core-virtual-scroll.metadata.json +0 -1
- package/virtual-scroll/index.d.ts +0 -1
- package/virtual-scroll/package.json +0 -11
- package/virtual-scroll/public-api.d.ts +0 -3
- package/virtual-scroll/virtual-scroll-container.component.d.ts +0 -73
- package/virtual-scroll/virtual-scroll-container.component.scss +0 -7
- package/virtual-scroll/virtual-scroll-row.directive.d.ts +0 -5
- package/virtual-scroll/virtual-scroll.module.d.ts +0 -2
@@ -1,1115 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @fileoverview added by tsickle
|
3
|
-
* Generated from: chips.component.ts
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
5
|
-
*/
|
6
|
-
import { Component, Input, Output, forwardRef, ViewChild, ViewChildren, QueryList, HostListener, ElementRef, Optional, Inject, Directive, TemplateRef, ViewContainerRef, ContentChild, ChangeDetectionStrategy, ChangeDetectorRef, HostBinding, Renderer2, } from '@angular/core';
|
7
|
-
import { DOCUMENT } from '@angular/common';
|
8
|
-
import { EventEmitter } from '@angular/core';
|
9
|
-
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
|
10
|
-
import { TemplatePortalDirective } from '@angular/cdk/portal';
|
11
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
12
|
-
import { UP_ARROW, DOWN_ARROW, ESCAPE, LEFT_ARROW, RIGHT_ARROW, DELETE, BACKSPACE, TAB, } from '@angular/cdk/keycodes';
|
13
|
-
import { MatChip } from '@angular/material/chips';
|
14
|
-
import { MatInput } from '@angular/material/input';
|
15
|
-
import { MatOption } from '@angular/material/core';
|
16
|
-
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
17
|
-
import { Subscription, timer, merge, fromEvent } from 'rxjs';
|
18
|
-
import { filter, debounceTime } from 'rxjs/operators';
|
19
|
-
import { mixinDisabled, mixinControlValueAccessor } from '@covalent/core/common';
|
20
|
-
export class TdChipDirective extends TemplatePortalDirective {
|
21
|
-
/**
|
22
|
-
* @param {?} templateRef
|
23
|
-
* @param {?} viewContainerRef
|
24
|
-
*/
|
25
|
-
constructor(templateRef, viewContainerRef) {
|
26
|
-
super(templateRef, viewContainerRef);
|
27
|
-
}
|
28
|
-
}
|
29
|
-
TdChipDirective.decorators = [
|
30
|
-
{ type: Directive, args: [{
|
31
|
-
selector: '[td-chip]ng-template',
|
32
|
-
},] }
|
33
|
-
];
|
34
|
-
/** @nocollapse */
|
35
|
-
TdChipDirective.ctorParameters = () => [
|
36
|
-
{ type: TemplateRef },
|
37
|
-
{ type: ViewContainerRef }
|
38
|
-
];
|
39
|
-
export class TdAutocompleteOptionDirective extends TemplatePortalDirective {
|
40
|
-
/**
|
41
|
-
* @param {?} templateRef
|
42
|
-
* @param {?} viewContainerRef
|
43
|
-
*/
|
44
|
-
constructor(templateRef, viewContainerRef) {
|
45
|
-
super(templateRef, viewContainerRef);
|
46
|
-
}
|
47
|
-
}
|
48
|
-
TdAutocompleteOptionDirective.decorators = [
|
49
|
-
{ type: Directive, args: [{
|
50
|
-
selector: '[td-autocomplete-option]ng-template',
|
51
|
-
},] }
|
52
|
-
];
|
53
|
-
/** @nocollapse */
|
54
|
-
TdAutocompleteOptionDirective.ctorParameters = () => [
|
55
|
-
{ type: TemplateRef },
|
56
|
-
{ type: ViewContainerRef }
|
57
|
-
];
|
58
|
-
export class TdChipsBase {
|
59
|
-
/**
|
60
|
-
* @param {?} _changeDetectorRef
|
61
|
-
*/
|
62
|
-
constructor(_changeDetectorRef) {
|
63
|
-
this._changeDetectorRef = _changeDetectorRef;
|
64
|
-
}
|
65
|
-
}
|
66
|
-
if (false) {
|
67
|
-
/** @type {?} */
|
68
|
-
TdChipsBase.prototype._changeDetectorRef;
|
69
|
-
}
|
70
|
-
/* tslint:disable-next-line */
|
71
|
-
/** @type {?} */
|
72
|
-
export const _TdChipsMixinBase = mixinControlValueAccessor(mixinDisabled(TdChipsBase), []);
|
73
|
-
export class TdChipsComponent extends _TdChipsMixinBase {
|
74
|
-
/**
|
75
|
-
* @param {?} _elementRef
|
76
|
-
* @param {?} _renderer
|
77
|
-
* @param {?} _document
|
78
|
-
* @param {?} _changeDetectorRef
|
79
|
-
*/
|
80
|
-
constructor(_elementRef, _renderer, _document, _changeDetectorRef) {
|
81
|
-
super(_changeDetectorRef);
|
82
|
-
this._elementRef = _elementRef;
|
83
|
-
this._renderer = _renderer;
|
84
|
-
this._document = _document;
|
85
|
-
this._outsideClickSubs = Subscription.EMPTY;
|
86
|
-
this._inputValueChangesSubs = Subscription.EMPTY;
|
87
|
-
this._isMousedown = false;
|
88
|
-
this._length = 0;
|
89
|
-
this._stacked = false;
|
90
|
-
this._requireMatch = false;
|
91
|
-
this._color = 'primary';
|
92
|
-
this._inputPosition = 'after';
|
93
|
-
this._chipAddition = true;
|
94
|
-
this._chipRemoval = true;
|
95
|
-
this._focused = false;
|
96
|
-
this._required = false;
|
97
|
-
this._tabIndex = 0;
|
98
|
-
this._touchendDebounce = 100;
|
99
|
-
this._internalClick = false;
|
100
|
-
this._internalActivateOption = false;
|
101
|
-
/**
|
102
|
-
* FormControl for the matInput element.
|
103
|
-
*/
|
104
|
-
this.inputControl = new FormControl();
|
105
|
-
/**
|
106
|
-
* debounce?: number
|
107
|
-
* Debounce timeout between keypresses. Defaults to 200.
|
108
|
-
*/
|
109
|
-
this.debounce = 200;
|
110
|
-
/**
|
111
|
-
* add?: function
|
112
|
-
* Method to be executed when a chip is added.
|
113
|
-
* Sends chip value as event.
|
114
|
-
*/
|
115
|
-
this.add = new EventEmitter();
|
116
|
-
/**
|
117
|
-
* remove?: function
|
118
|
-
* Method to be executed when a chip is removed.
|
119
|
-
* Sends chip value as event.
|
120
|
-
*/
|
121
|
-
this.remove = new EventEmitter();
|
122
|
-
/**
|
123
|
-
* inputChange?: function
|
124
|
-
* Method to be executed when the value in the autocomplete input changes.
|
125
|
-
* Sends string value as event.
|
126
|
-
*/
|
127
|
-
this.inputChange = new EventEmitter();
|
128
|
-
/**
|
129
|
-
* chipFocus?: function
|
130
|
-
* Method to be executed when a chip is focused.
|
131
|
-
* Sends chip value as event.
|
132
|
-
*/
|
133
|
-
this.chipFocus = new EventEmitter();
|
134
|
-
/**
|
135
|
-
* blur?: function
|
136
|
-
* Method to be executed when a chip is blurred.
|
137
|
-
* Sends chip value as event.
|
138
|
-
*/
|
139
|
-
this.chipBlur = new EventEmitter();
|
140
|
-
/**
|
141
|
-
* compareWith? function
|
142
|
-
* Function used to check whether a chip value already exists.
|
143
|
-
* Defaults to strict equality comparison ===
|
144
|
-
*/
|
145
|
-
this.compareWith = (/**
|
146
|
-
* @param {?} o1
|
147
|
-
* @param {?} o2
|
148
|
-
* @return {?}
|
149
|
-
*/
|
150
|
-
(o1, o2) => {
|
151
|
-
return o1 === o2;
|
152
|
-
});
|
153
|
-
this._renderer.addClass(this._elementRef.nativeElement, 'mat-' + this._color);
|
154
|
-
}
|
155
|
-
/**
|
156
|
-
* Flag that is true when autocomplete is focused.
|
157
|
-
* @return {?}
|
158
|
-
*/
|
159
|
-
get focused() {
|
160
|
-
return this._focused;
|
161
|
-
}
|
162
|
-
/**
|
163
|
-
* items?: any[]
|
164
|
-
* Renders the `mat-autocomplete` with the provided list to display as options.
|
165
|
-
* @param {?} items
|
166
|
-
* @return {?}
|
167
|
-
*/
|
168
|
-
set items(items) {
|
169
|
-
this._items = items;
|
170
|
-
this._setFirstOptionActive();
|
171
|
-
this._changeDetectorRef.markForCheck();
|
172
|
-
}
|
173
|
-
/**
|
174
|
-
* @return {?}
|
175
|
-
*/
|
176
|
-
get items() {
|
177
|
-
return this._items;
|
178
|
-
}
|
179
|
-
/**
|
180
|
-
* stacked?: boolean
|
181
|
-
* Set stacked or horizontal chips depending on value.
|
182
|
-
* Defaults to false.
|
183
|
-
* @param {?} stacked
|
184
|
-
* @return {?}
|
185
|
-
*/
|
186
|
-
set stacked(stacked) {
|
187
|
-
this._stacked = coerceBooleanProperty(stacked);
|
188
|
-
}
|
189
|
-
/**
|
190
|
-
* @return {?}
|
191
|
-
*/
|
192
|
-
get stacked() {
|
193
|
-
return this._stacked;
|
194
|
-
}
|
195
|
-
/**
|
196
|
-
* inputPosition?: 'before' | 'after'
|
197
|
-
* Set input position before or after the chips.
|
198
|
-
* Defaults to 'after'.
|
199
|
-
* @param {?} inputPosition
|
200
|
-
* @return {?}
|
201
|
-
*/
|
202
|
-
set inputPosition(inputPosition) {
|
203
|
-
this._inputPosition = inputPosition;
|
204
|
-
}
|
205
|
-
/**
|
206
|
-
* @return {?}
|
207
|
-
*/
|
208
|
-
get inputPosition() {
|
209
|
-
return this._inputPosition;
|
210
|
-
}
|
211
|
-
/**
|
212
|
-
* requireMatch?: boolean
|
213
|
-
* Blocks custom inputs and only allows selections from the autocomplete list.
|
214
|
-
* @param {?} requireMatch
|
215
|
-
* @return {?}
|
216
|
-
*/
|
217
|
-
set requireMatch(requireMatch) {
|
218
|
-
this._requireMatch = coerceBooleanProperty(requireMatch);
|
219
|
-
}
|
220
|
-
/**
|
221
|
-
* @return {?}
|
222
|
-
*/
|
223
|
-
get requireMatch() {
|
224
|
-
return this._requireMatch;
|
225
|
-
}
|
226
|
-
/**
|
227
|
-
* required?: boolean
|
228
|
-
* Value is set to true if at least one chip is needed
|
229
|
-
* Defaults to false
|
230
|
-
* @param {?} required
|
231
|
-
* @return {?}
|
232
|
-
*/
|
233
|
-
set required(required) {
|
234
|
-
this._required = coerceBooleanProperty(required);
|
235
|
-
}
|
236
|
-
/**
|
237
|
-
* @return {?}
|
238
|
-
*/
|
239
|
-
get required() {
|
240
|
-
return this._required;
|
241
|
-
}
|
242
|
-
/**
|
243
|
-
* chipAddition?: boolean
|
244
|
-
* Disables the ability to add chips. When setting disabled as true, this will be overriden.
|
245
|
-
* Defaults to true.
|
246
|
-
* @param {?} chipAddition
|
247
|
-
* @return {?}
|
248
|
-
*/
|
249
|
-
set chipAddition(chipAddition) {
|
250
|
-
this._chipAddition = chipAddition;
|
251
|
-
this._toggleInput();
|
252
|
-
}
|
253
|
-
/**
|
254
|
-
* @return {?}
|
255
|
-
*/
|
256
|
-
get chipAddition() {
|
257
|
-
return this._chipAddition;
|
258
|
-
}
|
259
|
-
/**
|
260
|
-
* Checks if not in disabled state and if chipAddition is set to 'true'
|
261
|
-
* States if a chip can be added and if the input is available
|
262
|
-
* @return {?}
|
263
|
-
*/
|
264
|
-
get canAddChip() {
|
265
|
-
return this.chipAddition && !this.disabled;
|
266
|
-
}
|
267
|
-
/**
|
268
|
-
* chipRemoval?: boolean
|
269
|
-
* Disables the ability to remove chips. If it doesn't exist chip remmoval defaults to true.
|
270
|
-
* When setting disabled as true, this will be overriden to false.
|
271
|
-
* @param {?} chipRemoval
|
272
|
-
* @return {?}
|
273
|
-
*/
|
274
|
-
set chipRemoval(chipRemoval) {
|
275
|
-
this._chipRemoval = chipRemoval;
|
276
|
-
}
|
277
|
-
/**
|
278
|
-
* @return {?}
|
279
|
-
*/
|
280
|
-
get chipRemoval() {
|
281
|
-
return this._chipRemoval;
|
282
|
-
}
|
283
|
-
/**
|
284
|
-
* Checks if not in disabled state and if chipRemoval is set to 'true'
|
285
|
-
* States if a chip can be removed
|
286
|
-
* @return {?}
|
287
|
-
*/
|
288
|
-
get canRemoveChip() {
|
289
|
-
return this.chipRemoval && !this.disabled;
|
290
|
-
}
|
291
|
-
/**
|
292
|
-
* returns the display placeholder
|
293
|
-
* @return {?}
|
294
|
-
*/
|
295
|
-
get displayPlaceHolder() {
|
296
|
-
if (!this.canAddChip) {
|
297
|
-
return '';
|
298
|
-
}
|
299
|
-
return this._required ? `${this.placeholder} *` : this.placeholder;
|
300
|
-
}
|
301
|
-
/**
|
302
|
-
* color?: 'primary' | 'accent' | 'warn'
|
303
|
-
* Sets the color for the input and focus/selected state of the chips.
|
304
|
-
* Defaults to 'primary'
|
305
|
-
* @param {?} color
|
306
|
-
* @return {?}
|
307
|
-
*/
|
308
|
-
set color(color) {
|
309
|
-
if (color) {
|
310
|
-
this._renderer.removeClass(this._elementRef.nativeElement, 'mat-' + this._color);
|
311
|
-
this._color = color;
|
312
|
-
this._renderer.addClass(this._elementRef.nativeElement, 'mat-' + this._color);
|
313
|
-
}
|
314
|
-
}
|
315
|
-
/**
|
316
|
-
* @return {?}
|
317
|
-
*/
|
318
|
-
get color() {
|
319
|
-
return this._color;
|
320
|
-
}
|
321
|
-
/**
|
322
|
-
* Hostbinding to set the a11y of the TdChipsComponent depending on its state
|
323
|
-
* @return {?}
|
324
|
-
*/
|
325
|
-
get tabIndex() {
|
326
|
-
return this.disabled ? -1 : this._tabIndex;
|
327
|
-
}
|
328
|
-
/**
|
329
|
-
* Listens to host focus event to act on it
|
330
|
-
* @param {?} event
|
331
|
-
* @return {?}
|
332
|
-
*/
|
333
|
-
focusListener(event) {
|
334
|
-
// should only focus if its not via mousedown to prevent clashing with autocomplete
|
335
|
-
if (!this._isMousedown) {
|
336
|
-
this.focus();
|
337
|
-
}
|
338
|
-
event.preventDefault();
|
339
|
-
}
|
340
|
-
/**
|
341
|
-
* Listens to host mousedown event to act on it
|
342
|
-
* @param {?} event
|
343
|
-
* @return {?}
|
344
|
-
*/
|
345
|
-
mousedownListener(event) {
|
346
|
-
// sets a flag to know if there was a mousedown and then it returns it back to false
|
347
|
-
this._isMousedown = true;
|
348
|
-
timer()
|
349
|
-
.toPromise()
|
350
|
-
.then((/**
|
351
|
-
* @return {?}
|
352
|
-
*/
|
353
|
-
() => {
|
354
|
-
this._isMousedown = false;
|
355
|
-
}));
|
356
|
-
}
|
357
|
-
/**
|
358
|
-
* If clicking on :host or `td-chips-wrapper`, then we stop the click propagation so the autocomplete
|
359
|
-
* doesnt close automatically.
|
360
|
-
* @param {?} event
|
361
|
-
* @return {?}
|
362
|
-
*/
|
363
|
-
clickListener(event) {
|
364
|
-
/** @type {?} */
|
365
|
-
const clickTarget = (/** @type {?} */ (event.target));
|
366
|
-
if (clickTarget === this._elementRef.nativeElement || clickTarget.className.indexOf('td-chips-wrapper') > -1) {
|
367
|
-
this.focus();
|
368
|
-
event.preventDefault();
|
369
|
-
event.stopPropagation();
|
370
|
-
}
|
371
|
-
}
|
372
|
-
/**
|
373
|
-
* Listens to host keydown event to act on it depending on the keypress
|
374
|
-
* @param {?} event
|
375
|
-
* @return {?}
|
376
|
-
*/
|
377
|
-
keydownListener(event) {
|
378
|
-
switch (event.keyCode) {
|
379
|
-
case TAB:
|
380
|
-
// if tabing out, then unfocus the component
|
381
|
-
timer()
|
382
|
-
.toPromise()
|
383
|
-
.then((/**
|
384
|
-
* @return {?}
|
385
|
-
*/
|
386
|
-
() => {
|
387
|
-
this.removeFocusedState();
|
388
|
-
}));
|
389
|
-
break;
|
390
|
-
case ESCAPE:
|
391
|
-
if (this._inputChild.focused) {
|
392
|
-
this._nativeInput.nativeElement.blur();
|
393
|
-
this.removeFocusedState();
|
394
|
-
this._closeAutocomplete();
|
395
|
-
}
|
396
|
-
else {
|
397
|
-
this.focus();
|
398
|
-
}
|
399
|
-
break;
|
400
|
-
default:
|
401
|
-
// default
|
402
|
-
}
|
403
|
-
}
|
404
|
-
/**
|
405
|
-
* @return {?}
|
406
|
-
*/
|
407
|
-
ngOnInit() {
|
408
|
-
this._inputValueChangesSubs = this.inputControl.valueChanges
|
409
|
-
.pipe(debounceTime(this.debounce))
|
410
|
-
.subscribe((/**
|
411
|
-
* @param {?} value
|
412
|
-
* @return {?}
|
413
|
-
*/
|
414
|
-
(value) => {
|
415
|
-
this.inputChange.emit(value ? value : '');
|
416
|
-
}));
|
417
|
-
this._changeDetectorRef.markForCheck();
|
418
|
-
}
|
419
|
-
/**
|
420
|
-
* @return {?}
|
421
|
-
*/
|
422
|
-
ngAfterViewInit() {
|
423
|
-
this._watchOutsideClick();
|
424
|
-
this._changeDetectorRef.markForCheck();
|
425
|
-
}
|
426
|
-
/**
|
427
|
-
* @return {?}
|
428
|
-
*/
|
429
|
-
ngDoCheck() {
|
430
|
-
// Throw onChange event only if array changes size.
|
431
|
-
if (this.value && this.value.length !== this._length) {
|
432
|
-
this._length = this.value.length;
|
433
|
-
this.onChange(this.value);
|
434
|
-
}
|
435
|
-
}
|
436
|
-
/**
|
437
|
-
* @return {?}
|
438
|
-
*/
|
439
|
-
ngOnDestroy() {
|
440
|
-
this._outsideClickSubs.unsubscribe();
|
441
|
-
this._inputValueChangesSubs.unsubscribe();
|
442
|
-
}
|
443
|
-
/**
|
444
|
-
* @return {?}
|
445
|
-
*/
|
446
|
-
_setInternalClick() {
|
447
|
-
this._internalClick = true;
|
448
|
-
}
|
449
|
-
/**
|
450
|
-
* Method executed when the disabled value changes
|
451
|
-
* @param {?} v
|
452
|
-
* @return {?}
|
453
|
-
*/
|
454
|
-
onDisabledChange(v) {
|
455
|
-
this._toggleInput();
|
456
|
-
}
|
457
|
-
/**
|
458
|
-
* Method that is executed when trying to create a new chip from the autocomplete.
|
459
|
-
* It check if [requireMatch] is enabled, and tries to add the first active option
|
460
|
-
* else if just adds the value thats on the input
|
461
|
-
* returns 'true' if successful, 'false' if it fails.
|
462
|
-
* @return {?}
|
463
|
-
*/
|
464
|
-
_handleAddChip() {
|
465
|
-
/** @type {?} */
|
466
|
-
let value;
|
467
|
-
if (this.requireMatch) {
|
468
|
-
/** @type {?} */
|
469
|
-
const selectedOptions = this._options.toArray().filter((/**
|
470
|
-
* @param {?} option
|
471
|
-
* @return {?}
|
472
|
-
*/
|
473
|
-
(option) => {
|
474
|
-
return option.active;
|
475
|
-
}));
|
476
|
-
if (selectedOptions.length > 0) {
|
477
|
-
value = selectedOptions[0].value;
|
478
|
-
selectedOptions[0].setInactiveStyles();
|
479
|
-
}
|
480
|
-
if (!value) {
|
481
|
-
return false;
|
482
|
-
}
|
483
|
-
}
|
484
|
-
else {
|
485
|
-
// if there is a selection, then use that
|
486
|
-
// else use the input value as chip
|
487
|
-
if (this._autocompleteTrigger.activeOption) {
|
488
|
-
value = this._autocompleteTrigger.activeOption.value;
|
489
|
-
this._autocompleteTrigger.activeOption.setInactiveStyles();
|
490
|
-
}
|
491
|
-
else {
|
492
|
-
value = this._inputChild.value;
|
493
|
-
if (value.trim() === '') {
|
494
|
-
return false;
|
495
|
-
}
|
496
|
-
}
|
497
|
-
}
|
498
|
-
return this.addChip(value);
|
499
|
-
}
|
500
|
-
/**
|
501
|
-
* Method thats exectuted when trying to add a value as chip
|
502
|
-
* returns 'true' if successful, 'false' if it fails.
|
503
|
-
* @param {?} value
|
504
|
-
* @return {?}
|
505
|
-
*/
|
506
|
-
addChip(value) {
|
507
|
-
/**
|
508
|
-
* add a debounce ms delay when reopening the autocomplete to give it time
|
509
|
-
* to rerender the next list and at the correct spot
|
510
|
-
*/
|
511
|
-
this._closeAutocomplete();
|
512
|
-
timer(this.debounce)
|
513
|
-
.toPromise()
|
514
|
-
.then((/**
|
515
|
-
* @return {?}
|
516
|
-
*/
|
517
|
-
() => {
|
518
|
-
this.setFocusedState();
|
519
|
-
this._setFirstOptionActive();
|
520
|
-
this._openAutocomplete();
|
521
|
-
}));
|
522
|
-
this.inputControl.setValue('');
|
523
|
-
// check if value is already part of the model
|
524
|
-
if (this.value.findIndex((/**
|
525
|
-
* @param {?} item
|
526
|
-
* @return {?}
|
527
|
-
*/
|
528
|
-
(item) => this.compareWith(item, value))) > -1) {
|
529
|
-
return false;
|
530
|
-
}
|
531
|
-
this.value.push(value);
|
532
|
-
this.add.emit(value);
|
533
|
-
this.onChange(this.value);
|
534
|
-
this._changeDetectorRef.markForCheck();
|
535
|
-
return true;
|
536
|
-
}
|
537
|
-
/**
|
538
|
-
* Method that is executed when trying to remove a chip.
|
539
|
-
* returns 'true' if successful, 'false' if it fails.
|
540
|
-
* @param {?} index
|
541
|
-
* @return {?}
|
542
|
-
*/
|
543
|
-
removeChip(index) {
|
544
|
-
/** @type {?} */
|
545
|
-
const removedValues = this.value.splice(index, 1);
|
546
|
-
if (removedValues.length === 0) {
|
547
|
-
return false;
|
548
|
-
}
|
549
|
-
/**
|
550
|
-
* Checks if deleting last single chip, to focus input afterwards
|
551
|
-
* Else check if its not the last chip of the list to focus the next one.
|
552
|
-
*/
|
553
|
-
if (index === this._totalChips - 1 && index === 0) {
|
554
|
-
this._inputChild.focus();
|
555
|
-
}
|
556
|
-
else if (index < this._totalChips - 1) {
|
557
|
-
this._focusChip(index + 1);
|
558
|
-
}
|
559
|
-
else if (index > 0) {
|
560
|
-
this._focusChip(index - 1);
|
561
|
-
}
|
562
|
-
this.remove.emit(removedValues[0]);
|
563
|
-
this.onChange(this.value);
|
564
|
-
this.inputControl.setValue('');
|
565
|
-
this._changeDetectorRef.markForCheck();
|
566
|
-
return true;
|
567
|
-
}
|
568
|
-
/**
|
569
|
-
* Sets blur of chip and sends out event
|
570
|
-
* @param {?} event
|
571
|
-
* @param {?} value
|
572
|
-
* @return {?}
|
573
|
-
*/
|
574
|
-
_handleChipBlur(event, value) {
|
575
|
-
this.chipBlur.emit(value);
|
576
|
-
}
|
577
|
-
/**
|
578
|
-
* Sets focus of chip and sends out event
|
579
|
-
* @param {?} event
|
580
|
-
* @param {?} value
|
581
|
-
* @return {?}
|
582
|
-
*/
|
583
|
-
_handleChipFocus(event, value) {
|
584
|
-
this.setFocusedState();
|
585
|
-
this.chipFocus.emit(value);
|
586
|
-
}
|
587
|
-
/**
|
588
|
-
* @return {?}
|
589
|
-
*/
|
590
|
-
_handleFocus() {
|
591
|
-
this.setFocusedState();
|
592
|
-
this._setFirstOptionActive();
|
593
|
-
return true;
|
594
|
-
}
|
595
|
-
/**
|
596
|
-
* Sets focus state of the component
|
597
|
-
* @return {?}
|
598
|
-
*/
|
599
|
-
setFocusedState() {
|
600
|
-
if (!this.disabled) {
|
601
|
-
this._focused = true;
|
602
|
-
this._tabIndex = -1;
|
603
|
-
this._changeDetectorRef.markForCheck();
|
604
|
-
}
|
605
|
-
}
|
606
|
-
/**
|
607
|
-
* Removes focus state of the component
|
608
|
-
* @return {?}
|
609
|
-
*/
|
610
|
-
removeFocusedState() {
|
611
|
-
this._focused = false;
|
612
|
-
this._tabIndex = 0;
|
613
|
-
this._changeDetectorRef.markForCheck();
|
614
|
-
}
|
615
|
-
/**
|
616
|
-
* Programmatically focus the input or first chip. Since its the component entry point
|
617
|
-
* depending if a user can add or remove chips
|
618
|
-
* @return {?}
|
619
|
-
*/
|
620
|
-
focus() {
|
621
|
-
if (this.canAddChip) {
|
622
|
-
this._inputChild.focus();
|
623
|
-
}
|
624
|
-
else if (!this.disabled) {
|
625
|
-
this._focusFirstChip();
|
626
|
-
}
|
627
|
-
}
|
628
|
-
/**
|
629
|
-
* Passes relevant input key presses.
|
630
|
-
* @param {?} event
|
631
|
-
* @return {?}
|
632
|
-
*/
|
633
|
-
_inputKeydown(event) {
|
634
|
-
switch (event.keyCode) {
|
635
|
-
case UP_ARROW:
|
636
|
-
/**
|
637
|
-
* Since the first item is highlighted on [requireMatch], we need to inactivate it
|
638
|
-
* when pressing the up key
|
639
|
-
*/
|
640
|
-
if (this.requireMatch) {
|
641
|
-
/** @type {?} */
|
642
|
-
const length = this._options.length;
|
643
|
-
if (length > 1 && this._options.toArray()[0].active && this._internalActivateOption) {
|
644
|
-
this._options.toArray()[0].setInactiveStyles();
|
645
|
-
this._internalActivateOption = false;
|
646
|
-
// prevent default window scrolling
|
647
|
-
event.preventDefault();
|
648
|
-
}
|
649
|
-
}
|
650
|
-
break;
|
651
|
-
case LEFT_ARROW:
|
652
|
-
case DELETE:
|
653
|
-
case BACKSPACE:
|
654
|
-
this._closeAutocomplete();
|
655
|
-
/** Check to see if input is empty when pressing left arrow to move to the last chip */
|
656
|
-
if (!this._inputChild.value) {
|
657
|
-
this._focusLastChip();
|
658
|
-
// prevent default window scrolling
|
659
|
-
event.preventDefault();
|
660
|
-
}
|
661
|
-
break;
|
662
|
-
case RIGHT_ARROW:
|
663
|
-
this._closeAutocomplete();
|
664
|
-
/** Check to see if input is empty when pressing right arrow to move to the first chip */
|
665
|
-
if (!this._inputChild.value) {
|
666
|
-
this._focusFirstChip();
|
667
|
-
// prevent default window scrolling
|
668
|
-
event.preventDefault();
|
669
|
-
}
|
670
|
-
break;
|
671
|
-
default:
|
672
|
-
// default
|
673
|
-
}
|
674
|
-
}
|
675
|
-
/**
|
676
|
-
* Passes relevant chip key presses.
|
677
|
-
* @param {?} event
|
678
|
-
* @param {?} index
|
679
|
-
* @return {?}
|
680
|
-
*/
|
681
|
-
_chipKeydown(event, index) {
|
682
|
-
switch (event.keyCode) {
|
683
|
-
case DELETE:
|
684
|
-
case BACKSPACE:
|
685
|
-
/** Check to see if we can delete a chip */
|
686
|
-
if (this.canRemoveChip) {
|
687
|
-
this.removeChip(index);
|
688
|
-
}
|
689
|
-
break;
|
690
|
-
case UP_ARROW:
|
691
|
-
case LEFT_ARROW:
|
692
|
-
/**
|
693
|
-
* Check to see if left/down arrow was pressed while focusing the first chip to focus input next
|
694
|
-
* Also check if input should be focused
|
695
|
-
*/
|
696
|
-
if (index === 0) {
|
697
|
-
// only try to target input if pressing left
|
698
|
-
if (this.canAddChip && event.keyCode === LEFT_ARROW) {
|
699
|
-
this._inputChild.focus();
|
700
|
-
}
|
701
|
-
else {
|
702
|
-
this._focusLastChip();
|
703
|
-
}
|
704
|
-
}
|
705
|
-
else if (index > 0) {
|
706
|
-
this._focusChip(index - 1);
|
707
|
-
}
|
708
|
-
// prevent default window scrolling
|
709
|
-
event.preventDefault();
|
710
|
-
break;
|
711
|
-
case DOWN_ARROW:
|
712
|
-
case RIGHT_ARROW:
|
713
|
-
/**
|
714
|
-
* Check to see if right/up arrow was pressed while focusing the last chip to focus input next
|
715
|
-
* Also check if input should be focused
|
716
|
-
*/
|
717
|
-
if (index === this._totalChips - 1) {
|
718
|
-
// only try to target input if pressing right
|
719
|
-
if (this.canAddChip && event.keyCode === RIGHT_ARROW) {
|
720
|
-
this._inputChild.focus();
|
721
|
-
}
|
722
|
-
else {
|
723
|
-
this._focusFirstChip();
|
724
|
-
}
|
725
|
-
}
|
726
|
-
else if (index < this._totalChips - 1) {
|
727
|
-
this._focusChip(index + 1);
|
728
|
-
}
|
729
|
-
// prevent default window scrolling
|
730
|
-
event.preventDefault();
|
731
|
-
break;
|
732
|
-
default:
|
733
|
-
// default
|
734
|
-
}
|
735
|
-
}
|
736
|
-
/**
|
737
|
-
* Method to remove from display the value added from the autocomplete since it goes directly as chip.
|
738
|
-
* @return {?}
|
739
|
-
*/
|
740
|
-
_removeInputDisplay() {
|
741
|
-
return '';
|
742
|
-
}
|
743
|
-
/**
|
744
|
-
* Method to open the autocomplete manually if its not already opened
|
745
|
-
* @return {?}
|
746
|
-
*/
|
747
|
-
_openAutocomplete() {
|
748
|
-
if (!this._autocompleteTrigger.panelOpen) {
|
749
|
-
this._autocompleteTrigger.openPanel();
|
750
|
-
this._changeDetectorRef.markForCheck();
|
751
|
-
}
|
752
|
-
}
|
753
|
-
/**
|
754
|
-
* Method to close the autocomplete manually if its not already closed
|
755
|
-
* @return {?}
|
756
|
-
*/
|
757
|
-
_closeAutocomplete() {
|
758
|
-
if (this._autocompleteTrigger.panelOpen) {
|
759
|
-
this._autocompleteTrigger.closePanel();
|
760
|
-
this._changeDetectorRef.markForCheck();
|
761
|
-
}
|
762
|
-
}
|
763
|
-
/**
|
764
|
-
* Get total of chips
|
765
|
-
* @return {?}
|
766
|
-
*/
|
767
|
-
get _totalChips() {
|
768
|
-
/** @type {?} */
|
769
|
-
const chips = this._chipsChildren.toArray();
|
770
|
-
return chips.length;
|
771
|
-
}
|
772
|
-
/**
|
773
|
-
* Method to focus a desired chip by index
|
774
|
-
* @private
|
775
|
-
* @param {?} index
|
776
|
-
* @return {?}
|
777
|
-
*/
|
778
|
-
_focusChip(index) {
|
779
|
-
/** check to see if index exists in the array before focusing */
|
780
|
-
if (index > -1 && this._totalChips > index) {
|
781
|
-
this._chipsChildren.toArray()[index].focus();
|
782
|
-
}
|
783
|
-
}
|
784
|
-
/**
|
785
|
-
* Method to focus first chip
|
786
|
-
* @private
|
787
|
-
* @return {?}
|
788
|
-
*/
|
789
|
-
_focusFirstChip() {
|
790
|
-
this._focusChip(0);
|
791
|
-
}
|
792
|
-
/**
|
793
|
-
* Method to focus last chip
|
794
|
-
* @private
|
795
|
-
* @return {?}
|
796
|
-
*/
|
797
|
-
_focusLastChip() {
|
798
|
-
this._focusChip(this._totalChips - 1);
|
799
|
-
}
|
800
|
-
/**
|
801
|
-
* Method to toggle the disable state of input
|
802
|
-
* Checks if not in disabled state and if chipAddition is set to 'true'
|
803
|
-
* @private
|
804
|
-
* @return {?}
|
805
|
-
*/
|
806
|
-
_toggleInput() {
|
807
|
-
if (this.canAddChip) {
|
808
|
-
this.inputControl.enable();
|
809
|
-
}
|
810
|
-
else {
|
811
|
-
this.inputControl.disable();
|
812
|
-
}
|
813
|
-
this._changeDetectorRef.markForCheck();
|
814
|
-
}
|
815
|
-
/**
|
816
|
-
* Sets first option as active to let the user know which one will be added when pressing enter
|
817
|
-
* Only if [requireMatch] has been set
|
818
|
-
* @private
|
819
|
-
* @return {?}
|
820
|
-
*/
|
821
|
-
_setFirstOptionActive() {
|
822
|
-
if (this.requireMatch) {
|
823
|
-
// need to use a timer here to wait until the autocomplete has been opened (end of queue)
|
824
|
-
timer()
|
825
|
-
.toPromise()
|
826
|
-
.then((/**
|
827
|
-
* @return {?}
|
828
|
-
*/
|
829
|
-
() => {
|
830
|
-
if (this.focused && this._options && this._options.length > 0) {
|
831
|
-
// clean up of previously active options
|
832
|
-
this._options.toArray().forEach((/**
|
833
|
-
* @param {?} option
|
834
|
-
* @return {?}
|
835
|
-
*/
|
836
|
-
(option) => {
|
837
|
-
option.setInactiveStyles();
|
838
|
-
}));
|
839
|
-
// set the first one as active
|
840
|
-
this._options.toArray()[0].setActiveStyles();
|
841
|
-
this._internalActivateOption = true;
|
842
|
-
this._changeDetectorRef.markForCheck();
|
843
|
-
}
|
844
|
-
}));
|
845
|
-
}
|
846
|
-
}
|
847
|
-
/**
|
848
|
-
* Watches clicks outside of the component to remove the focus
|
849
|
-
* The autocomplete panel is considered inside the component so we
|
850
|
-
* need to use a flag to find out when its clicked.
|
851
|
-
* @private
|
852
|
-
* @return {?}
|
853
|
-
*/
|
854
|
-
_watchOutsideClick() {
|
855
|
-
if (this._document) {
|
856
|
-
this._outsideClickSubs = merge(fromEvent(this._document, 'click'), fromEvent(this._document, 'touchend'))
|
857
|
-
.pipe(debounceTime(this._touchendDebounce), filter((/**
|
858
|
-
* @param {?} event
|
859
|
-
* @return {?}
|
860
|
-
*/
|
861
|
-
(event) => {
|
862
|
-
/** @type {?} */
|
863
|
-
const clickTarget = (/** @type {?} */ (event.target));
|
864
|
-
setTimeout((/**
|
865
|
-
* @return {?}
|
866
|
-
*/
|
867
|
-
() => {
|
868
|
-
this._internalClick = false;
|
869
|
-
}));
|
870
|
-
return (this.focused &&
|
871
|
-
clickTarget !== this._elementRef.nativeElement &&
|
872
|
-
!this._elementRef.nativeElement.contains(clickTarget) &&
|
873
|
-
!this._internalClick);
|
874
|
-
})))
|
875
|
-
.subscribe((/**
|
876
|
-
* @return {?}
|
877
|
-
*/
|
878
|
-
() => {
|
879
|
-
if (this.focused) {
|
880
|
-
this._autocompleteTrigger.closePanel();
|
881
|
-
this.removeFocusedState();
|
882
|
-
this.onTouched();
|
883
|
-
this._changeDetectorRef.markForCheck();
|
884
|
-
}
|
885
|
-
}));
|
886
|
-
}
|
887
|
-
return undefined;
|
888
|
-
}
|
889
|
-
}
|
890
|
-
TdChipsComponent.decorators = [
|
891
|
-
{ type: Component, args: [{
|
892
|
-
providers: [
|
893
|
-
{
|
894
|
-
provide: NG_VALUE_ACCESSOR,
|
895
|
-
useExisting: forwardRef((/**
|
896
|
-
* @return {?}
|
897
|
-
*/
|
898
|
-
() => TdChipsComponent)),
|
899
|
-
multi: true,
|
900
|
-
},
|
901
|
-
],
|
902
|
-
selector: 'td-chips',
|
903
|
-
inputs: ['disabled', 'value'],
|
904
|
-
template: "<div\n class=\"td-chips-wrapper\"\n [class.td-chips-stacked]=\"stacked\"\n [class.td-chips-input-before-position]=\"inputPosition === 'before'\"\n>\n <ng-template let-chip let-first=\"first\" let-index=\"index\" ngFor [ngForOf]=\"value\">\n <mat-basic-chip\n [class.td-chip-disabled]=\"disabled\"\n [class.td-chip-after-pad]=\"!canRemoveChip\"\n [disableRipple]=\"true\"\n [color]=\"color\"\n (keydown)=\"_chipKeydown($event, index)\"\n (blur)=\"_handleChipBlur($event, chip)\"\n (focus)=\"_handleChipFocus($event, chip)\"\n >\n <div class=\"td-chip\" [class.td-chip-stacked]=\"stacked\">\n <span class=\"td-chip-content\">\n <span *ngIf=\"!_chipTemplate?.templateRef\">{{ chip }}</span>\n <ng-template\n *ngIf=\"_chipTemplate?.templateRef\"\n [ngTemplateOutlet]=\"_chipTemplate?.templateRef\"\n [ngTemplateOutletContext]=\"{ chip: chip }\"\n ></ng-template>\n </span>\n <mat-icon *ngIf=\"canRemoveChip\" class=\"td-chip-removal\" (click)=\"_internalClick = removeChip(index)\">\n cancel\n </mat-icon>\n </div>\n </mat-basic-chip>\n </ng-template>\n <mat-form-field\n floatLabel=\"never\"\n class=\"td-chips-form-field\"\n [style.width.px]=\"canAddChip ? null : 0\"\n [style.height.px]=\"canAddChip ? null : 0\"\n [color]=\"color\"\n >\n <input\n matInput\n #input\n [tabIndex]=\"-1\"\n [matAutocomplete]=\"autocomplete\"\n [formControl]=\"inputControl\"\n [placeholder]=\"displayPlaceHolder\"\n (keydown)=\"_inputKeydown($event)\"\n (keyup.enter)=\"_handleAddChip()\"\n (focus)=\"_handleFocus()\"\n />\n </mat-form-field>\n <mat-autocomplete\n #autocomplete=\"matAutocomplete\"\n [displayWith]=\"_removeInputDisplay\"\n (optionSelected)=\"addChip($event.option.value)\"\n >\n <ng-template let-item let-first=\"first\" ngFor [ngForOf]=\"items\">\n <mat-option (click)=\"_setInternalClick()\" [value]=\"item\">\n <span *ngIf=\"!_autocompleteOptionTemplate?.templateRef\">{{ item }}</span>\n <ng-template\n *ngIf=\"_autocompleteOptionTemplate?.templateRef\"\n [ngTemplateOutlet]=\"_autocompleteOptionTemplate?.templateRef\"\n [ngTemplateOutletContext]=\"{ option: item }\"\n ></ng-template>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n</div>\n<div *ngIf=\"chipAddition\" class=\"mat-form-field-underline\" [class.mat-disabled]=\"disabled\">\n <span class=\"mat-form-field-ripple\" [class.mat-focused]=\"focused\"></span>\n</div>\n<ng-content></ng-content>\n",
|
905
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
906
|
-
styles: [":host{display:block;min-height:48px;padding:0 5px}:host .td-chips-wrapper{-ms-flex-align:start;-ms-flex-direction:row;-ms-flex-wrap:wrap;align-items:flex-start;display:-ms-flexbox;display:flex;flex-direction:row;flex-wrap:wrap;min-height:42px}:host .td-chips-wrapper.td-chips-stacked .mat-basic-chip,:host .td-chips-wrapper.td-chips-stacked .td-chips-form-field{width:100%}:host .td-chips-wrapper.td-chips-input-before-position .td-chips-form-field{-ms-flex-order:-1;order:-1}:host .td-chip,:host .td-chip>.td-chip-content{-ms-flex-align:center;-ms-flex-direction:row;-ms-flex-line-pack:center;-ms-flex-pack:start;align-content:center;align-items:center;box-sizing:border-box;display:-ms-flexbox;display:flex;flex-direction:row;justify-content:flex-start;max-width:100%;min-width:0}:host .td-chip.td-chip-stacked,:host .td-chip>.td-chip-content.td-chip-stacked{-ms-flex-pack:justify;justify-content:space-between}:host ::ng-deep .mat-form-field-wrapper{padding-bottom:2px}:host ::ng-deep .mat-basic-chip{border-radius:16px;box-sizing:border-box;cursor:default;display:inline-block;margin:8px 8px 0 0;max-width:100%;position:relative}html[dir=rtl] :host ::ng-deep .mat-basic-chip{margin:8px 0 0 8px;unicode-bidi:embed}body[dir=rtl] :host ::ng-deep .mat-basic-chip{margin:8px 0 0 8px;unicode-bidi:embed}[dir=rtl] :host ::ng-deep .mat-basic-chip{margin:8px 0 0 8px;unicode-bidi:embed}:host ::ng-deep .mat-basic-chip bdo[dir=rtl]{direction:rtl;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip bdo[dir=ltr]{direction:ltr;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip .td-chip{font-size:13px;line-height:32px;min-height:32px;padding:0 0 0 12px}html[dir=rtl] :host ::ng-deep .mat-basic-chip .td-chip{padding:0 12px 0 0;unicode-bidi:embed}body[dir=rtl] :host ::ng-deep .mat-basic-chip .td-chip{padding:0 12px 0 0;unicode-bidi:embed}[dir=rtl] :host ::ng-deep .mat-basic-chip .td-chip{padding:0 12px 0 0;unicode-bidi:embed}:host ::ng-deep .mat-basic-chip .td-chip bdo[dir=rtl]{direction:rtl;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip .td-chip bdo[dir=ltr]{direction:ltr;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip .td-chip [td-chip-avatar]{-ms-flex:0 0 auto;-ms-flex-align:center;-ms-flex-order:-20;-ms-flex-pack:center;align-items:center;border-radius:50%;box-sizing:border-box;display:inline-block;flex:0 0 auto;height:32px;justify-content:center;margin:0 8px 0 -12px;order:-20;text-align:center;width:32px}html[dir=rtl] :host ::ng-deep .mat-basic-chip .td-chip [td-chip-avatar]{margin:0 -12px 0 8px;unicode-bidi:embed}body[dir=rtl] :host ::ng-deep .mat-basic-chip .td-chip [td-chip-avatar]{margin:0 -12px 0 8px;unicode-bidi:embed}[dir=rtl] :host ::ng-deep .mat-basic-chip .td-chip [td-chip-avatar]{margin:0 -12px 0 8px;unicode-bidi:embed}:host ::ng-deep .mat-basic-chip .td-chip [td-chip-avatar] bdo[dir=rtl]{direction:rtl;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip .td-chip [td-chip-avatar] bdo[dir=ltr]{direction:ltr;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip.td-chip-after-pad{padding:0 12px 0 0}html[dir=rtl] :host ::ng-deep .mat-basic-chip.td-chip-after-pad{padding:0 0 0 12px;unicode-bidi:embed}body[dir=rtl] :host ::ng-deep .mat-basic-chip.td-chip-after-pad{padding:0 0 0 12px;unicode-bidi:embed}[dir=rtl] :host ::ng-deep .mat-basic-chip.td-chip-after-pad{padding:0 0 0 12px;unicode-bidi:embed}:host ::ng-deep .mat-basic-chip.td-chip-after-pad bdo[dir=rtl]{direction:rtl;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip.td-chip-after-pad bdo[dir=ltr]{direction:ltr;unicode-bidi:bidi-override}:host ::ng-deep .mat-basic-chip mat-icon.td-chip-removal{font-size:21px;line-height:22px;margin:0 4px}:host ::ng-deep .mat-basic-chip mat-icon.td-chip-removal:hover{cursor:pointer}:host ::ng-deep .td-chips-stacked .mat-basic-chip{margin:4px 0}:host ::ng-deep .td-chips-stacked .mat-basic-chip:first-of-type{margin:8px 0 4px}:host ::ng-deep .td-chips-stacked .mat-basic-chip:last-of-type{margin:4px 0 8px}:host .mat-form-field-underline{bottom:0;height:1px;position:relative;width:100%}:host .mat-form-field-underline.mat-disabled{background-color:rgba(0,0,0,0);background-position:0;bottom:-4px}:host .mat-form-field-underline .mat-form-field-ripple{-ms-transform:scaleX(.5);-ms-transform-origin:50%;height:2px;opacity:0;position:absolute;top:0;transform:scaleX(.5);transform-origin:50%;transition:background-color .3s cubic-bezier(.55,0,.55,.2);visibility:hidden;width:100%}:host .mat-form-field-underline .mat-form-field-ripple.mat-focused,:host.ng-invalid .mat-form-field-underline .mat-form-field-ripple{-ms-transform:scaleX(1);opacity:1;transform:scaleX(1);transition:transform .15s linear,background-color .3s cubic-bezier(.55,0,.55,.2);visibility:visible}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none}"]
|
907
|
-
}] }
|
908
|
-
];
|
909
|
-
/** @nocollapse */
|
910
|
-
TdChipsComponent.ctorParameters = () => [
|
911
|
-
{ type: ElementRef },
|
912
|
-
{ type: Renderer2 },
|
913
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
|
914
|
-
{ type: ChangeDetectorRef }
|
915
|
-
];
|
916
|
-
TdChipsComponent.propDecorators = {
|
917
|
-
_nativeInput: [{ type: ViewChild, args: ['input', { static: true },] }],
|
918
|
-
_inputChild: [{ type: ViewChild, args: [MatInput, { static: true },] }],
|
919
|
-
_autocompleteTrigger: [{ type: ViewChild, args: [MatAutocompleteTrigger, { static: true },] }],
|
920
|
-
_chipsChildren: [{ type: ViewChildren, args: [MatChip,] }],
|
921
|
-
_chipTemplate: [{ type: ContentChild, args: [TdChipDirective,] }],
|
922
|
-
_autocompleteOptionTemplate: [{ type: ContentChild, args: [TdAutocompleteOptionDirective,] }],
|
923
|
-
_options: [{ type: ViewChildren, args: [MatOption,] }],
|
924
|
-
items: [{ type: Input, args: ['items',] }],
|
925
|
-
stacked: [{ type: Input, args: ['stacked',] }],
|
926
|
-
inputPosition: [{ type: Input, args: ['inputPosition',] }],
|
927
|
-
requireMatch: [{ type: Input, args: ['requireMatch',] }],
|
928
|
-
required: [{ type: Input, args: ['required',] }],
|
929
|
-
chipAddition: [{ type: Input, args: ['chipAddition',] }],
|
930
|
-
chipRemoval: [{ type: Input, args: ['chipRemoval',] }],
|
931
|
-
placeholder: [{ type: Input }],
|
932
|
-
debounce: [{ type: Input }],
|
933
|
-
color: [{ type: Input, args: ['color',] }],
|
934
|
-
add: [{ type: Output }],
|
935
|
-
remove: [{ type: Output }],
|
936
|
-
inputChange: [{ type: Output }],
|
937
|
-
chipFocus: [{ type: Output }],
|
938
|
-
chipBlur: [{ type: Output }],
|
939
|
-
tabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],
|
940
|
-
compareWith: [{ type: Input }],
|
941
|
-
focusListener: [{ type: HostListener, args: ['focus', ['$event'],] }],
|
942
|
-
mousedownListener: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
|
943
|
-
clickListener: [{ type: HostListener, args: ['click', ['$event'],] }],
|
944
|
-
keydownListener: [{ type: HostListener, args: ['keydown', ['$event'],] }]
|
945
|
-
};
|
946
|
-
if (false) {
|
947
|
-
/**
|
948
|
-
* @type {?}
|
949
|
-
* @private
|
950
|
-
*/
|
951
|
-
TdChipsComponent.prototype._outsideClickSubs;
|
952
|
-
/**
|
953
|
-
* @type {?}
|
954
|
-
* @private
|
955
|
-
*/
|
956
|
-
TdChipsComponent.prototype._inputValueChangesSubs;
|
957
|
-
/**
|
958
|
-
* @type {?}
|
959
|
-
* @private
|
960
|
-
*/
|
961
|
-
TdChipsComponent.prototype._isMousedown;
|
962
|
-
/**
|
963
|
-
* @type {?}
|
964
|
-
* @private
|
965
|
-
*/
|
966
|
-
TdChipsComponent.prototype._items;
|
967
|
-
/**
|
968
|
-
* @type {?}
|
969
|
-
* @private
|
970
|
-
*/
|
971
|
-
TdChipsComponent.prototype._length;
|
972
|
-
/**
|
973
|
-
* @type {?}
|
974
|
-
* @private
|
975
|
-
*/
|
976
|
-
TdChipsComponent.prototype._stacked;
|
977
|
-
/**
|
978
|
-
* @type {?}
|
979
|
-
* @private
|
980
|
-
*/
|
981
|
-
TdChipsComponent.prototype._requireMatch;
|
982
|
-
/**
|
983
|
-
* @type {?}
|
984
|
-
* @private
|
985
|
-
*/
|
986
|
-
TdChipsComponent.prototype._color;
|
987
|
-
/**
|
988
|
-
* @type {?}
|
989
|
-
* @private
|
990
|
-
*/
|
991
|
-
TdChipsComponent.prototype._inputPosition;
|
992
|
-
/**
|
993
|
-
* @type {?}
|
994
|
-
* @private
|
995
|
-
*/
|
996
|
-
TdChipsComponent.prototype._chipAddition;
|
997
|
-
/**
|
998
|
-
* @type {?}
|
999
|
-
* @private
|
1000
|
-
*/
|
1001
|
-
TdChipsComponent.prototype._chipRemoval;
|
1002
|
-
/**
|
1003
|
-
* @type {?}
|
1004
|
-
* @private
|
1005
|
-
*/
|
1006
|
-
TdChipsComponent.prototype._focused;
|
1007
|
-
/**
|
1008
|
-
* @type {?}
|
1009
|
-
* @private
|
1010
|
-
*/
|
1011
|
-
TdChipsComponent.prototype._required;
|
1012
|
-
/**
|
1013
|
-
* @type {?}
|
1014
|
-
* @private
|
1015
|
-
*/
|
1016
|
-
TdChipsComponent.prototype._tabIndex;
|
1017
|
-
/**
|
1018
|
-
* @type {?}
|
1019
|
-
* @private
|
1020
|
-
*/
|
1021
|
-
TdChipsComponent.prototype._touchendDebounce;
|
1022
|
-
/** @type {?} */
|
1023
|
-
TdChipsComponent.prototype._internalClick;
|
1024
|
-
/** @type {?} */
|
1025
|
-
TdChipsComponent.prototype._internalActivateOption;
|
1026
|
-
/** @type {?} */
|
1027
|
-
TdChipsComponent.prototype._nativeInput;
|
1028
|
-
/** @type {?} */
|
1029
|
-
TdChipsComponent.prototype._inputChild;
|
1030
|
-
/** @type {?} */
|
1031
|
-
TdChipsComponent.prototype._autocompleteTrigger;
|
1032
|
-
/** @type {?} */
|
1033
|
-
TdChipsComponent.prototype._chipsChildren;
|
1034
|
-
/** @type {?} */
|
1035
|
-
TdChipsComponent.prototype._chipTemplate;
|
1036
|
-
/** @type {?} */
|
1037
|
-
TdChipsComponent.prototype._autocompleteOptionTemplate;
|
1038
|
-
/** @type {?} */
|
1039
|
-
TdChipsComponent.prototype._options;
|
1040
|
-
/**
|
1041
|
-
* FormControl for the matInput element.
|
1042
|
-
* @type {?}
|
1043
|
-
*/
|
1044
|
-
TdChipsComponent.prototype.inputControl;
|
1045
|
-
/**
|
1046
|
-
* placeholder?: string
|
1047
|
-
* Placeholder for the autocomplete input.
|
1048
|
-
* @type {?}
|
1049
|
-
*/
|
1050
|
-
TdChipsComponent.prototype.placeholder;
|
1051
|
-
/**
|
1052
|
-
* debounce?: number
|
1053
|
-
* Debounce timeout between keypresses. Defaults to 200.
|
1054
|
-
* @type {?}
|
1055
|
-
*/
|
1056
|
-
TdChipsComponent.prototype.debounce;
|
1057
|
-
/**
|
1058
|
-
* add?: function
|
1059
|
-
* Method to be executed when a chip is added.
|
1060
|
-
* Sends chip value as event.
|
1061
|
-
* @type {?}
|
1062
|
-
*/
|
1063
|
-
TdChipsComponent.prototype.add;
|
1064
|
-
/**
|
1065
|
-
* remove?: function
|
1066
|
-
* Method to be executed when a chip is removed.
|
1067
|
-
* Sends chip value as event.
|
1068
|
-
* @type {?}
|
1069
|
-
*/
|
1070
|
-
TdChipsComponent.prototype.remove;
|
1071
|
-
/**
|
1072
|
-
* inputChange?: function
|
1073
|
-
* Method to be executed when the value in the autocomplete input changes.
|
1074
|
-
* Sends string value as event.
|
1075
|
-
* @type {?}
|
1076
|
-
*/
|
1077
|
-
TdChipsComponent.prototype.inputChange;
|
1078
|
-
/**
|
1079
|
-
* chipFocus?: function
|
1080
|
-
* Method to be executed when a chip is focused.
|
1081
|
-
* Sends chip value as event.
|
1082
|
-
* @type {?}
|
1083
|
-
*/
|
1084
|
-
TdChipsComponent.prototype.chipFocus;
|
1085
|
-
/**
|
1086
|
-
* blur?: function
|
1087
|
-
* Method to be executed when a chip is blurred.
|
1088
|
-
* Sends chip value as event.
|
1089
|
-
* @type {?}
|
1090
|
-
*/
|
1091
|
-
TdChipsComponent.prototype.chipBlur;
|
1092
|
-
/**
|
1093
|
-
* compareWith? function
|
1094
|
-
* Function used to check whether a chip value already exists.
|
1095
|
-
* Defaults to strict equality comparison ===
|
1096
|
-
* @type {?}
|
1097
|
-
*/
|
1098
|
-
TdChipsComponent.prototype.compareWith;
|
1099
|
-
/**
|
1100
|
-
* @type {?}
|
1101
|
-
* @private
|
1102
|
-
*/
|
1103
|
-
TdChipsComponent.prototype._elementRef;
|
1104
|
-
/**
|
1105
|
-
* @type {?}
|
1106
|
-
* @private
|
1107
|
-
*/
|
1108
|
-
TdChipsComponent.prototype._renderer;
|
1109
|
-
/**
|
1110
|
-
* @type {?}
|
1111
|
-
* @private
|
1112
|
-
*/
|
1113
|
-
TdChipsComponent.prototype._document;
|
1114
|
-
}
|
1115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uL3NyYy9wbGF0Zm9ybS9jb3JlL2NoaXBzLyIsInNvdXJjZXMiOlsiY2hpcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFFVixTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLHVCQUF1QixFQUN2QixpQkFBaUIsRUFHakIsV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFDTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixTQUFTLEVBR1QsR0FBRyxHQUVKLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0NBQWdDLENB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MEJBb0IzQixLQUFLOzRCQU9MLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0NBWWhDLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7NEJBZXBDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7OEJBYWhDLFlBQVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7SUF2U25DLDZDQUE2RDs7Ozs7SUFDN0Qsa0RBQWtFOzs7OztJQUNsRSx3Q0FBc0M7Ozs7O0lBRXRDLGtDQUFzQjs7Ozs7SUFDdEIsbUNBQTRCOzs7OztJQUM1QixvQ0FBa0M7Ozs7O0lBQ2xDLHlDQUF1Qzs7Ozs7SUFDdkMsa0NBQTBEOzs7OztJQUMxRCwwQ0FBcUQ7Ozs7O0lBQ3JELHlDQUFzQzs7Ozs7SUFDdEMsd0NBQXFDOzs7OztJQUNyQyxvQ0FBa0M7Ozs7O0lBQ2xDLHFDQUFtQzs7Ozs7SUFDbkMscUNBQThCOzs7OztJQUM5Qiw2Q0FBd0M7O0lBRXhDLDBDQUFnQzs7SUFDaEMsbURBQXlDOztJQUV6Qyx3Q0FBK0Q7O0lBQy9ELHVDQUE2RDs7SUFDN0QsZ0RBQWtHOztJQUNsRywwQ0FBMEQ7O0lBRTFELHlDQUE4RDs7SUFDOUQsdURBQzJEOztJQUUzRCxvQ0FBd0Q7Ozs7O0lBWXhELHdDQUE4Qzs7Ozs7O0lBNEg5Qyx1Q0FBNkI7Ozs7OztJQU03QixvQ0FBZ0M7Ozs7Ozs7SUF3QmhDLCtCQUEyRDs7Ozs7OztJQU8zRCxrQ0FBOEQ7Ozs7Ozs7SUFPOUQsdUNBQXlFOzs7Ozs7O0lBT3pFLHFDQUFpRTs7Ozs7OztJQU9qRSxvQ0FBZ0U7Ozs7Ozs7SUF5QmhFLHVDQUVFOzs7OztJQWhCQSx1Q0FBK0I7Ozs7O0lBQy9CLHFDQUE0Qjs7Ozs7SUFDNUIscUNBQW9EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBmb3J3YXJkUmVmLFxuICBEb0NoZWNrLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBPbkluaXQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgRWxlbWVudFJlZixcbiAgT3B0aW9uYWwsXG4gIEluamVjdCxcbiAgRGlyZWN0aXZlLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgQ29udGVudENoaWxkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgSG9zdEJpbmRpbmcsXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgVVBfQVJST1csXG4gIERPV05fQVJST1csXG4gIEVTQ0FQRSxcbiAgTEVGVF9BUlJPVyxcbiAgUklHSFRfQVJST1csXG4gIERFTEVURSxcbiAgQkFDS1NQQUNFLFxuICBFTlRFUixcbiAgU1BBQ0UsXG4gIFRBQixcbiAgSE9NRSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE1hdENoaXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgdGltZXIsIG1lcmdlLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJQ2FuRGlzYWJsZSwgbWl4aW5EaXNhYmxlZCwgSUNvbnRyb2xWYWx1ZUFjY2Vzc29yLCBtaXhpbkNvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvY29tbW9uJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RkLWNoaXBdbmctdGVtcGxhdGUnLFxufSlcbmV4cG9ydCBjbGFzcyBUZENoaXBEaXJlY3RpdmUgZXh0ZW5kcyBUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgc3VwZXIodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpO1xuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t0ZC1hdXRvY29tcGxldGUtb3B0aW9uXW5nLXRlbXBsYXRlJyxcbn0pXG5leHBvcnQgY2xhc3MgVGRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmUgZXh0ZW5kcyBUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgc3VwZXIodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZENoaXBzQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbmV4cG9ydCBjb25zdCBfVGRDaGlwc01peGluQmFzZSA9IG1peGluQ29udHJvbFZhbHVlQWNjZXNzb3IobWl4aW5EaXNhYmxlZChUZENoaXBzQmFzZSksIFtdKTtcblxuQENvbXBvbmVudCh7XG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGRDaGlwc0NvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBzZWxlY3RvcjogJ3RkLWNoaXBzJyxcbiAgaW5wdXRzOiBbJ2Rpc2FibGVkJywgJ3ZhbHVlJ10sXG4gIHN0eWxlVXJsczogWycuL2NoaXBzLmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGlwcy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUZENoaXBzQ29tcG9uZW50XG4gIGV4dGVuZHMgX1RkQ2hpcHNNaXhpbkJhc2VcbiAgaW1wbGVtZW50cyBJQ29udHJvbFZhbHVlQWNjZXNzb3IsIERvQ2hlY2ssIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJQ2FuRGlzYWJsZVxue1xuICBwcml2YXRlIF9vdXRzaWRlQ2xpY2tTdWJzOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2lucHV0VmFsdWVDaGFuZ2VzU3ViczogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9pc01vdXNlZG93bjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2l0ZW1zOiBhbnlbXTtcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9zdGFja2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JlcXVpcmVNYXRjaDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9jb2xvcjogJ3ByaW1hcnknIHwgJ2FjY2VudCcgfCAnd2FybicgPSAncHJpbWFyeSc7XG4gIHByaXZhdGUgX2lucHV0UG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyA9ICdhZnRlcic7XG4gIHByaXZhdGUgX2NoaXBBZGRpdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX2NoaXBSZW1vdmFsOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF90YWJJbmRleDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfdG91Y2hlbmREZWJvdW5jZTogbnVtYmVyID0gMTAwO1xuXG4gIF9pbnRlcm5hbENsaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIF9pbnRlcm5hbEFjdGl2YXRlT3B0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfbmF0aXZlSW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoTWF0SW5wdXQsIHsgc3RhdGljOiB0cnVlIH0pIF9pbnB1dENoaWxkOiBNYXRJbnB1dDtcbiAgQFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCB7IHN0YXRpYzogdHJ1ZSB9KSBfYXV0b2NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcbiAgQFZpZXdDaGlsZHJlbihNYXRDaGlwKSBfY2hpcHNDaGlsZHJlbjogUXVlcnlMaXN0PE1hdENoaXA+O1xuXG4gIEBDb250ZW50Q2hpbGQoVGRDaGlwRGlyZWN0aXZlKSBfY2hpcFRlbXBsYXRlOiBUZENoaXBEaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoVGRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmUpXG4gIF9hdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZTogVGRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZHJlbihNYXRPcHRpb24pIF9vcHRpb25zOiBRdWVyeUxpc3Q8TWF0T3B0aW9uPjtcblxuICAvKipcbiAgICogRmxhZyB0aGF0IGlzIHRydWUgd2hlbiBhdXRvY29tcGxldGUgaXMgZm9jdXNlZC5cbiAgICovXG4gIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mb2N1c2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1Db250cm9sIGZvciB0aGUgbWF0SW5wdXQgZWxlbWVudC5cbiAgICovXG4gIGlucHV0Q29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcblxuICAvKipcbiAgICogaXRlbXM/OiBhbnlbXVxuICAgKiBSZW5kZXJzIHRoZSBgbWF0LWF1dG9jb21wbGV0ZWAgd2l0aCB0aGUgcHJvdmlkZWQgbGlzdCB0byBkaXNwbGF5IGFzIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoJ2l0ZW1zJylcbiAgc2V0IGl0ZW1zKGl0ZW1zOiBhbnlbXSkge1xuICAgIHRoaXMuX2l0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5fc2V0Rmlyc3RPcHRpb25BY3RpdmUoKTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBnZXQgaXRlbXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBzdGFja2VkPzogYm9vbGVhblxuICAgKiBTZXQgc3RhY2tlZCBvciBob3Jpem9udGFsIGNoaXBzIGRlcGVuZGluZyBvbiB2YWx1ZS5cbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBASW5wdXQoJ3N0YWNrZWQnKVxuICBzZXQgc3RhY2tlZChzdGFja2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc3RhY2tlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShzdGFja2VkKTtcbiAgfVxuICBnZXQgc3RhY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2tlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbnB1dFBvc2l0aW9uPzogJ2JlZm9yZScgfCAnYWZ0ZXInXG4gICAqIFNldCBpbnB1dCBwb3NpdGlvbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGNoaXBzLlxuICAgKiBEZWZhdWx0cyB0byAnYWZ0ZXInLlxuICAgKi9cbiAgQElucHV0KCdpbnB1dFBvc2l0aW9uJylcbiAgc2V0IGlucHV0UG9zaXRpb24oaW5wdXRQb3NpdGlvbjogJ2JlZm9yZScgfCAnYWZ0ZXInKSB7XG4gICAgdGhpcy5faW5wdXRQb3NpdGlvbiA9IGlucHV0UG9zaXRpb247XG4gIH1cbiAgZ2V0IGlucHV0UG9zaXRpb24oKTogJ2JlZm9yZScgfCAnYWZ0ZXInIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXRQb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXF1aXJlTWF0Y2g/OiBib29sZWFuXG4gICAqIEJsb2NrcyBjdXN0b20gaW5wdXRzIGFuZCBvbmx5IGFsbG93cyBzZWxlY3Rpb25zIGZyb20gdGhlIGF1dG9jb21wbGV0ZSBsaXN0LlxuICAgKi9cbiAgQElucHV0KCdyZXF1aXJlTWF0Y2gnKVxuICBzZXQgcmVxdWlyZU1hdGNoKHJlcXVpcmVNYXRjaDogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVNYXRjaCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZXF1aXJlTWF0Y2gpO1xuICB9XG4gIGdldCByZXF1aXJlTWF0Y2goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVNYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXF1aXJlZD86IGJvb2xlYW5cbiAgICogVmFsdWUgaXMgc2V0IHRvIHRydWUgaWYgYXQgbGVhc3Qgb25lIGNoaXAgaXMgbmVlZGVkXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ3JlcXVpcmVkJylcbiAgc2V0IHJlcXVpcmVkKHJlcXVpcmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVxdWlyZWQpO1xuICB9XG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICAvKipcbiAgICogY2hpcEFkZGl0aW9uPzogYm9vbGVhblxuICAgKiBEaXNhYmxlcyB0aGUgYWJpbGl0eSB0byBhZGQgY2hpcHMuIFdoZW4gc2V0dGluZyBkaXNhYmxlZCBhcyB0cnVlLCB0aGlzIHdpbGwgYmUgb3ZlcnJpZGVuLlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgQElucHV0KCdjaGlwQWRkaXRpb24nKVxuICBzZXQgY2hpcEFkZGl0aW9uKGNoaXBBZGRpdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuX2NoaXBBZGRpdGlvbiA9IGNoaXBBZGRpdGlvbjtcbiAgICB0aGlzLl90b2dnbGVJbnB1dCgpO1xuICB9XG4gIGdldCBjaGlwQWRkaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaXBBZGRpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgbm90IGluIGRpc2FibGVkIHN0YXRlIGFuZCBpZiBjaGlwQWRkaXRpb24gaXMgc2V0IHRvICd0cnVlJ1xuICAgKiBTdGF0ZXMgaWYgYSBjaGlwIGNhbiBiZSBhZGRlZCBhbmQgaWYgdGhlIGlucHV0IGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgZ2V0IGNhbkFkZENoaXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hpcEFkZGl0aW9uICYmICF0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoaXBSZW1vdmFsPzogYm9vbGVhblxuICAgKiBEaXNhYmxlcyB0aGUgYWJpbGl0eSB0byByZW1vdmUgY2hpcHMuIElmIGl0IGRvZXNuJ3QgZXhpc3QgY2hpcCByZW1tb3ZhbCBkZWZhdWx0cyB0byB0cnVlLlxuICAgKiBXaGVuIHNldHRpbmcgZGlzYWJsZWQgYXMgdHJ1ZSwgdGhpcyB3aWxsIGJlIG92ZXJyaWRlbiB0byBmYWxzZS5cbiAgICovXG4gIEBJbnB1dCgnY2hpcFJlbW92YWwnKVxuICBzZXQgY2hpcFJlbW92YWwoY2hpcFJlbW92YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jaGlwUmVtb3ZhbCA9IGNoaXBSZW1vdmFsO1xuICB9XG4gIGdldCBjaGlwUmVtb3ZhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpcFJlbW92YWw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIG5vdCBpbiBkaXNhYmxlZCBzdGF0ZSBhbmQgaWYgY2hpcFJlbW92YWwgaXMgc2V0IHRvICd0cnVlJ1xuICAgKiBTdGF0ZXMgaWYgYSBjaGlwIGNhbiBiZSByZW1vdmVkXG4gICAqL1xuICBnZXQgY2FuUmVtb3ZlQ2hpcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGlwUmVtb3ZhbCAmJiAhdGhpcy5kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSBkaXNwbGF5IHBsYWNlaG9sZGVyXG4gICAqL1xuICBnZXQgZGlzcGxheVBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZENoaXApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkID8gYCR7dGhpcy5wbGFjZWhvbGRlcn0gKmAgOiB0aGlzLnBsYWNlaG9sZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gICAqIFBsYWNlaG9sZGVyIGZvciB0aGUgYXV0b2NvbXBsZXRlIGlucHV0LlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogZGVib3VuY2U/OiBudW1iZXJcbiAgICogRGVib3VuY2UgdGltZW91dCBiZXR3ZWVuIGtleXByZXNzZXMuIERlZmF1bHRzIHRvIDIwMC5cbiAgICovXG4gIEBJbnB1dCgpIGRlYm91bmNlOiBudW1iZXIgPSAyMDA7XG5cbiAgLyoqXG4gICAqIGNvbG9yPzogJ3ByaW1hcnknIHwgJ2FjY2VudCcgfCAnd2FybidcbiAgICogU2V0cyB0aGUgY29sb3IgZm9yIHRoZSBpbnB1dCBhbmQgZm9jdXMvc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIGNoaXBzLlxuICAgKiBEZWZhdWx0cyB0byAncHJpbWFyeSdcbiAgICovXG4gIEBJbnB1dCgnY29sb3InKVxuICBzZXQgY29sb3IoY29sb3I6ICdwcmltYXJ5JyB8ICdhY2NlbnQnIHwgJ3dhcm4nKSB7XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtYXQtJyArIHRoaXMuX2NvbG9yKTtcbiAgICAgIHRoaXMuX2NvbG9yID0gY29sb3I7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtYXQtJyArIHRoaXMuX2NvbG9yKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbG9yKCk6ICdwcmltYXJ5JyB8ICdhY2NlbnQnIHwgJ3dhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICAvKipcbiAgICogYWRkPzogZnVuY3Rpb25cbiAgICogTWV0aG9kIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBjaGlwIGlzIGFkZGVkLlxuICAgKiBTZW5kcyBjaGlwIHZhbHVlIGFzIGV2ZW50LlxuICAgKi9cbiAgQE91dHB1dCgpIGFkZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogcmVtb3ZlPzogZnVuY3Rpb25cbiAgICogTWV0aG9kIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBjaGlwIGlzIHJlbW92ZWQuXG4gICAqIFNlbmRzIGNoaXAgdmFsdWUgYXMgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVtb3ZlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBpbnB1dENoYW5nZT86IGZ1bmN0aW9uXG4gICAqIE1ldGhvZCB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSB2YWx1ZSBpbiB0aGUgYXV0b2NvbXBsZXRlIGlucHV0IGNoYW5nZXMuXG4gICAqIFNlbmRzIHN0cmluZyB2YWx1ZSBhcyBldmVudC5cbiAgICovXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogY2hpcEZvY3VzPzogZnVuY3Rpb25cbiAgICogTWV0aG9kIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBjaGlwIGlzIGZvY3VzZWQuXG4gICAqIFNlbmRzIGNoaXAgdmFsdWUgYXMgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgY2hpcEZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBibHVyPzogZnVuY3Rpb25cbiAgICogTWV0aG9kIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBjaGlwIGlzIGJsdXJyZWQuXG4gICAqIFNlbmRzIGNoaXAgdmFsdWUgYXMgZXZlbnQuXG4gICAqL1xuICBAT3V0cHV0KCkgY2hpcEJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIEhvc3RiaW5kaW5nIHRvIHNldCB0aGUgYTExeSBvZiB0aGUgVGRDaGlwc0NvbXBvbmVudCBkZXBlbmRpbmcgb24gaXRzIHN0YXRlXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/IC0xIDogdGhpcy5fdGFiSW5kZXg7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSxcbiAgICBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBzdXBlcihfY2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21hdC0nICsgdGhpcy5fY29sb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbXBhcmVXaXRoPyBmdW5jdGlvblxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBjaGlwIHZhbHVlIGFscmVhZHkgZXhpc3RzLlxuICAgKiBEZWZhdWx0cyB0byBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbiA9PT1cbiAgICovXG4gIEBJbnB1dCgpIGNvbXBhcmVXaXRoOiAobzE6IGFueSwgbzI6IGFueSkgPT4gYm9vbGVhbiA9IChvMTogYW55LCBvMjogYW55KSA9PiB7XG4gICAgcmV0dXJuIG8xID09PSBvMjtcbiAgfTtcblxuICAvKipcbiAgICogTGlzdGVucyB0byBob3N0IGZvY3VzIGV2ZW50IHRvIGFjdCBvbiBpdFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICBmb2N1c0xpc3RlbmVyKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgLy8gc2hvdWxkIG9ubHkgZm9jdXMgaWYgaXRzIG5vdCB2aWEgbW91c2Vkb3duIHRvIHByZXZlbnQgY2xhc2hpbmcgd2l0aCBhdXRvY29tcGxldGVcbiAgICBpZiAoIXRoaXMuX2lzTW91c2Vkb3duKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyB0byBob3N0IG1vdXNlZG93biBldmVudCB0byBhY3Qgb24gaXRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG1vdXNlZG93bkxpc3RlbmVyKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgLy8gc2V0cyBhIGZsYWcgdG8ga25vdyBpZiB0aGVyZSB3YXMgYSBtb3VzZWRvd24gYW5kIHRoZW4gaXQgcmV0dXJucyBpdCBiYWNrIHRvIGZhbHNlXG4gICAgdGhpcy5faXNNb3VzZWRvd24gPSB0cnVlO1xuICAgIHRpbWVyKClcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9pc01vdXNlZG93biA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgY2xpY2tpbmcgb24gOmhvc3Qgb3IgYHRkLWNoaXBzLXdyYXBwZXJgLCB0aGVuIHdlIHN0b3AgdGhlIGNsaWNrIHByb3BhZ2F0aW9uIHNvIHRoZSBhdXRvY29tcGxldGVcbiAgICogZG9lc250IGNsb3NlIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsaWNrTGlzdGVuZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2xpY2tUYXJnZXQ6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcbiAgICBpZiAoY2xpY2tUYXJnZXQgPT09IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCB8fCBjbGlja1RhcmdldC5jbGFzc05hbWUuaW5kZXhPZigndGQtY2hpcHMtd3JhcHBlcicpID4gLTEpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVucyB0byBob3N0IGtleWRvd24gZXZlbnQgdG8gYWN0IG9uIGl0IGRlcGVuZGluZyBvbiB0aGUga2V5cHJlc3NcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBrZXlkb3duTGlzdGVuZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgVEFCOlxuICAgICAgICAvLyBpZiB0YWJpbmcgb3V0LCB0aGVuIHVuZm9jdXMgdGhlIGNvbXBvbmVudFxuICAgICAgICB0aW1lcigpXG4gICAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVGb2N1c2VkU3RhdGUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVTQ0FQRTpcbiAgICAgICAgaWYgKHRoaXMuX2lucHV0Q2hpbGQuZm9jdXNlZCkge1xuICAgICAgICAgIHRoaXMuX25hdGl2ZUlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgIHRoaXMucmVtb3ZlRm9jdXNlZFN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gZGVmYXVsdFxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2lucHV0VmFsdWVDaGFuZ2VzU3VicyA9IHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQodmFsdWUgPyB2YWx1ZSA6ICcnKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3dhdGNoT3V0c2lkZUNsaWNrKCk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XG4gICAgLy8gVGhyb3cgb25DaGFuZ2UgZXZlbnQgb25seSBpZiBhcnJheSBjaGFuZ2VzIHNpemUuXG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggIT09IHRoaXMuX2xlbmd0aCkge1xuICAgICAgdGhpcy5fbGVuZ3RoID0gdGhpcy52YWx1ZS5sZW5ndGg7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX291dHNpZGVDbGlja1N1YnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9pbnB1dFZhbHVlQ2hhbmdlc1N1YnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIF9zZXRJbnRlcm5hbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuX2ludGVybmFsQ2xpY2sgPSB0cnVlO1xuICB9XG5cbiAgLyoqIE1ldGhvZCBleGVjdXRlZCB3aGVuIHRoZSBkaXNhYmxlZCB2YWx1ZSBjaGFuZ2VzICovXG4gIG9uRGlzYWJsZWRDaGFuZ2UodjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX3RvZ2dsZUlucHV0KCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRoYXQgaXMgZXhlY3V0ZWQgd2hlbiB0cnlpbmcgdG8gY3JlYXRlIGEgbmV3IGNoaXAgZnJvbSB0aGUgYXV0b2NvbXBsZXRlLlxuICAgKiBJdCBjaGVjayBpZiBbcmVxdWlyZU1hdGNoXSBpcyBlbmFibGVkLCBhbmQgdHJpZXMgdG8gYWRkIHRoZSBmaXJzdCBhY3RpdmUgb3B0aW9uXG4gICAqIGVsc2UgaWYganVzdCBhZGRzIHRoZSB2YWx1ZSB0aGF0cyBvbiB0aGUgaW5wdXRcbiAgICogcmV0dXJucyAndHJ1ZScgaWYgc3VjY2Vzc2Z1bCwgJ2ZhbHNlJyBpZiBpdCBmYWlscy5cbiAgICovXG4gIF9oYW5kbGVBZGRDaGlwKCk6IGJvb2xlYW4ge1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIGlmICh0aGlzLnJlcXVpcmVNYXRjaCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zOiBNYXRPcHRpb25bXSA9IHRoaXMuX29wdGlvbnMudG9BcnJheSgpLmZpbHRlcigob3B0aW9uOiBNYXRPcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi5hY3RpdmU7XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkT3B0aW9uc1swXS52YWx1ZTtcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25zWzBdLnNldEluYWN0aXZlU3R5bGVzKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24sIHRoZW4gdXNlIHRoYXRcbiAgICAgIC8vIGVsc2UgdXNlIHRoZSBpbnB1dCB2YWx1ZSBhcyBjaGlwXG4gICAgICBpZiAodGhpcy5fYXV0b2NvbXBsZXRlVHJpZ2dlci5hY3RpdmVPcHRpb24pIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLl9hdXRvY29tcGxldGVUcmlnZ2VyLmFjdGl2ZU9wdGlvbi52YWx1ZTtcbiAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlVHJpZ2dlci5hY3RpdmVPcHRpb24uc2V0SW5hY3RpdmVTdHlsZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5faW5wdXRDaGlsZC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkQ2hpcCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRoYXRzIGV4ZWN0dXRlZCB3aGVuIHRyeWluZyB0byBhZGQgYSB2YWx1ZSBhcyBjaGlwXG4gICAqIHJldHVybnMgJ3RydWUnIGlmIHN1Y2Nlc3NmdWwsICdmYWxzZScgaWYgaXQgZmFpbHMuXG4gICAqL1xuICBhZGRDaGlwKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvKipcbiAgICAgKiBhZGQgYSBkZWJvdW5jZSBtcyBkZWxheSB3aGVuIHJlb3BlbmluZyB0aGUgYXV0b2NvbXBsZXRlIHRvIGdpdmUgaXQgdGltZVxuICAgICAqIHRvIHJlcmVuZGVyIHRoZSBuZXh0IGxpc3QgYW5kIGF0IHRoZSBjb3JyZWN0IHNwb3RcbiAgICAgKi9cblxuICAgIHRoaXMuX2Nsb3NlQXV0b2NvbXBsZXRlKCk7XG4gICAgdGltZXIodGhpcy5kZWJvdW5jZSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNldEZvY3VzZWRTdGF0ZSgpO1xuICAgICAgICB0aGlzLl9zZXRGaXJzdE9wdGlvbkFjdGl2ZSgpO1xuICAgICAgICB0aGlzLl9vcGVuQXV0b2NvbXBsZXRlKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICAvLyBjaGVjayBpZiB2YWx1ZSBpcyBhbHJlYWR5IHBhcnQgb2YgdGhlIG1vZGVsXG4gICAgaWYgKHRoaXMudmFsdWUuZmluZEluZGV4KChpdGVtOiBhbnkpID0+IHRoaXMuY29tcGFyZVdpdGgoaXRlbSwgdmFsdWUpKSA+IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZS5wdXNoKHZhbHVlKTtcbiAgICB0aGlzLmFkZC5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0aGF0IGlzIGV4ZWN1dGVkIHdoZW4gdHJ5aW5nIHRvIHJlbW92ZSBhIGNoaXAuXG4gICAqIHJldHVybnMgJ3RydWUnIGlmIHN1Y2Nlc3NmdWwsICdmYWxzZScgaWYgaXQgZmFpbHMuXG4gICAqL1xuICByZW1vdmVDaGlwKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1vdmVkVmFsdWVzOiBhbnlbXSA9IHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAocmVtb3ZlZFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgZGVsZXRpbmcgbGFzdCBzaW5nbGUgY2hpcCwgdG8gZm9jdXMgaW5wdXQgYWZ0ZXJ3YXJkc1xuICAgICAqIEVsc2UgY2hlY2sgaWYgaXRzIG5vdCB0aGUgbGFzdCBjaGlwIG9mIHRoZSBsaXN0IHRvIGZvY3VzIHRoZSBuZXh0IG9uZS5cbiAgICAgKi9cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuX3RvdGFsQ2hpcHMgLSAxICYmIGluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLl9pbnB1dENoaWxkLmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmIChpbmRleCA8IHRoaXMuX3RvdGFsQ2hpcHMgLSAxKSB7XG4gICAgICB0aGlzLl9mb2N1c0NoaXAoaW5kZXggKyAxKTtcbiAgICB9IGVsc2UgaWYgKGluZGV4ID4gMCkge1xuICAgICAgdGhpcy5fZm9jdXNDaGlwKGluZGV4IC0gMSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmUuZW1pdChyZW1vdmVkVmFsdWVzWzBdKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKCcnKTtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGJsdXIgb2YgY2hpcCBhbmQgc2VuZHMgb3V0IGV2ZW50XG4gICAqL1xuICBfaGFuZGxlQ2hpcEJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNoaXBCbHVyLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZm9jdXMgb2YgY2hpcCBhbmQgc2VuZHMgb3V0IGV2ZW50XG4gICAqL1xuICBfaGFuZGxlQ2hpcEZvY3VzKGV2ZW50OiBGb2N1c0V2ZW50LCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZXRGb2N1c2VkU3RhdGUoKTtcbiAgICB0aGlzLmNoaXBGb2N1cy5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIF9oYW5kbGVGb2N1cygpOiBib29sZWFuIHtcbiAgICB0aGlzLnNldEZvY3VzZWRTdGF0ZSgpO1xuICAgIHRoaXMuX3NldEZpcnN0T3B0aW9uQWN0aXZlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBmb2N1cyBzdGF0ZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBzZXRGb2N1c2VkU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3RhYkluZGV4ID0gLTE7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBmb2N1cyBzdGF0ZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICByZW1vdmVGb2N1c2VkU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3RhYkluZGV4ID0gMDtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzIHRoZSBpbnB1dCBvciBmaXJzdCBjaGlwLiBTaW5jZSBpdHMgdGhlIGNvbXBvbmVudCBlbnRyeSBwb2ludFxuICAgKiBkZXBlbmRpbmcgaWYgYSB1c2VyIGNhbiBhZGQgb3IgcmVtb3ZlIGNoaXBzXG4gICAqL1xuICBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5BZGRDaGlwKSB7XG4gICAgICB0aGlzLl9pbnB1dENoaWxkLmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5fZm9jdXNGaXJzdENoaXAoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFzc2VzIHJlbGV2YW50IGlucHV0IGtleSBwcmVzc2VzLlxuICAgKi9cbiAgX2lucHV0S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNpbmNlIHRoZSBmaXJzdCBpdGVtIGlzIGhpZ2hsaWdodGVkIG9uIFtyZXF1aXJlTWF0Y2hdLCB3ZSBuZWVkIHRvIGluYWN0aXZhdGUgaXRcbiAgICAgICAgICogd2hlbiBwcmVzc2luZyB0aGUgdXAga2V5XG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5yZXF1aXJlTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IHRoaXMuX29wdGlvbnMubGVuZ3RoO1xuICAgICAgICAgIGlmIChsZW5ndGggPiAxICYmIHRoaXMuX29wdGlvbnMudG9BcnJheSgpWzBdLmFjdGl2ZSAmJiB0aGlzLl9pbnRlcm5hbEFjdGl2YXRlT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLnRvQXJyYXkoKVswXS5zZXRJbmFjdGl2ZVN0eWxlcygpO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxBY3RpdmF0ZU9wdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gcHJldmVudCBkZWZhdWx0IHdpbmRvdyBzY3JvbGxpbmdcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMRUZUX0FSUk9XOlxuICAgICAgY2FzZSBERUxFVEU6XG4gICAgICBjYXNlIEJBQ0tTUEFDRTpcbiAgICAgICAgdGhpcy5fY2xvc2VBdXRvY29tcGxldGUoKTtcbiAgICAgICAgLyoqIENoZWNrIHRvIHNlZSBpZiBpbnB1dCBpcyBlbXB0eSB3aGVuIHByZXNzaW5nIGxlZnQgYXJyb3cgdG8gbW92ZSB0byB0aGUgbGFzdCBjaGlwICovXG4gICAgICAgIGlmICghdGhpcy5faW5wdXRDaGlsZC52YWx1ZSkge1xuICAgICAgICAgIHRoaXMuX2ZvY3VzTGFzdENoaXAoKTtcbiAgICAgICAgICAvLyBwcmV2ZW50IGRlZmF1bHQgd2luZG93IHNjcm9sbGluZ1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJJR0hUX0FSUk9XOlxuICAgICAgICB0aGlzLl9jbG9zZUF1dG9jb21wbGV0ZSgpO1xuICAgICAgICAvKiogQ2hlY2sgdG8gc2VlIGlmIGlucHV0IGlzIGVtcHR5IHdoZW4gcHJlc3NpbmcgcmlnaHQgYXJyb3cgdG8gbW92ZSB0byB0aGUgZmlyc3QgY2hpcCAqL1xuICAgICAgICBpZiAoIXRoaXMuX2lucHV0Q2hpbGQudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLl9mb2N1c0ZpcnN0Q2hpcCgpO1xuICAgICAgICAgIC8vIHByZXZlbnQgZGVmYXVsdCB3aW5kb3cgc2Nyb2xsaW5nXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAvLyBkZWZhdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhc3NlcyByZWxldmFudCBjaGlwIGtleSBwcmVzc2VzLlxuICAgKi9cbiAgX2NoaXBLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIERFTEVURTpcbiAgICAgIGNhc2UgQkFDS1NQQUNFOlxuICAgICAgICAvKiogQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBkZWxldGUgYSBjaGlwICovXG4gICAgICAgIGlmICh0aGlzLmNhblJlbW92ZUNoaXApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNoaXAoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgIGNhc2UgTEVGVF9BUlJPVzpcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHRvIHNlZSBpZiBsZWZ0L2Rvd24gYXJyb3cgd2FzIHByZXNzZWQgd2hpbGUgZm9jdXNpbmcgdGhlIGZpcnN0IGNoaXAgdG8gZm9jdXMgaW5wdXQgbmV4dFxuICAgICAgICAgKiBBbHNvIGNoZWNrIGlmIGlucHV0IHNob3VsZCBiZSBmb2N1c2VkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAvLyBvbmx5IHRyeSB0byB0YXJnZXQgaW5wdXQgaWYgcHJlc3NpbmcgbGVmdFxuICAgICAgICAgIGlmICh0aGlzLmNhbkFkZENoaXAgJiYgZXZlbnQua2V5Q29kZSA9PT0gTEVGVF9BUlJPVykge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRDaGlsZC5mb2N1cygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c0xhc3RDaGlwKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgIHRoaXMuX2ZvY3VzQ2hpcChpbmRleCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHByZXZlbnQgZGVmYXVsdCB3aW5kb3cgc2Nyb2xsaW5nXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBET1dOX0FSUk9XOlxuICAgICAgY2FzZSBSSUdIVF9BUlJPVzpcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHRvIHNlZSBpZiByaWdodC91cCBhcnJvdyB3YXMgcHJlc3NlZCB3aGlsZSBmb2N1c2luZyB0aGUgbGFzdCBjaGlwIHRvIGZvY3VzIGlucHV0IG5leHRcbiAgICAgICAgICogQWxzbyBjaGVjayBpZiBpbnB1dCBzaG91bGQgYmUgZm9jdXNlZFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLl90b3RhbENoaXBzIC0gMSkge1xuICAgICAgICAgIC8vIG9ubHkgdHJ5IHRvIHRhcmdldCBpbnB1dCBpZiBwcmVzc2luZyByaWdodFxuICAgICAgICAgIGlmICh0aGlzLmNhbkFkZENoaXAgJiYgZXZlbnQua2V5Q29kZSA9PT0gUklHSFRfQVJST1cpIHtcbiAgICAgICAgICAgIHRoaXMuX2lucHV0Q2hpbGQuZm9jdXMoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNGaXJzdENoaXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0aGlzLl90b3RhbENoaXBzIC0gMSkge1xuICAgICAgICAgIHRoaXMuX2ZvY3VzQ2hpcChpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHByZXZlbnQgZGVmYXVsdCB3aW5kb3cgc2Nyb2xsaW5nXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIGRlZmF1bHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHJlbW92ZSBmcm9tIGRpc3BsYXkgdGhlIHZhbHVlIGFkZGVkIGZyb20gdGhlIGF1dG9jb21wbGV0ZSBzaW5jZSBpdCBnb2VzIGRpcmVjdGx5IGFzIGNoaXAuXG4gICAqL1xuICBfcmVtb3ZlSW5wdXREaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBvcGVuIHRoZSBhdXRvY29tcGxldGUgbWFudWFsbHkgaWYgaXRzIG5vdCBhbHJlYWR5IG9wZW5lZFxuICAgKi9cbiAgX29wZW5BdXRvY29tcGxldGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hdXRvY29tcGxldGVUcmlnZ2VyLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlVHJpZ2dlci5vcGVuUGFuZWwoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gY2xvc2UgdGhlIGF1dG9jb21wbGV0ZSBtYW51YWxseSBpZiBpdHMgbm90IGFscmVhZHkgY2xvc2VkXG4gICAqL1xuICBfY2xvc2VBdXRvY29tcGxldGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2F1dG9jb21wbGV0ZVRyaWdnZXIucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLl9hdXRvY29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdG90YWwgb2YgY2hpcHNcbiAgICovXG4gIGdldCBfdG90YWxDaGlwcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGNoaXBzOiBNYXRDaGlwW10gPSB0aGlzLl9jaGlwc0NoaWxkcmVuLnRvQXJyYXkoKTtcbiAgICByZXR1cm4gY2hpcHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBmb2N1cyBhIGRlc2lyZWQgY2hpcCBieSBpbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfZm9jdXNDaGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiogY2hlY2sgdG8gc2VlIGlmIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYmVmb3JlIGZvY3VzaW5nICovXG4gICAgaWYgKGluZGV4ID4gLTEgJiYgdGhpcy5fdG90YWxDaGlwcyA+IGluZGV4KSB7XG4gICAgICB0aGlzLl9jaGlwc0NoaWxkcmVuLnRvQXJyYXkoKVtpbmRleF0uZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvKiogTWV0aG9kIHRvIGZvY3VzIGZpcnN0IGNoaXAgKi9cbiAgcHJpdmF0ZSBfZm9jdXNGaXJzdENoaXAoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9jdXNDaGlwKDApO1xuICB9XG5cbiAgLyoqIE1ldGhvZCB0byBmb2N1cyBsYXN0IGNoaXAgKi9cbiAgcHJpdmF0ZSBfZm9jdXNMYXN0Q2hpcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9mb2N1c0NoaXAodGhpcy5fdG90YWxDaGlwcyAtIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0b2dnbGUgdGhlIGRpc2FibGUgc3RhdGUgb2YgaW5wdXRcbiAgICogQ2hlY2tzIGlmIG5vdCBpbiBkaXNhYmxlZCBzdGF0ZSBhbmQgaWYgY2hpcEFkZGl0aW9uIGlzIHNldCB0byAndHJ1ZSdcbiAgICovXG4gIHByaXZhdGUgX3RvZ2dsZUlucHV0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbkFkZENoaXApIHtcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLmVuYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0Q29udHJvbC5kaXNhYmxlKCk7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZmlyc3Qgb3B0aW9uIGFzIGFjdGl2ZSB0byBsZXQgdGhlIHVzZXIga25vdyB3aGljaCBvbmUgd2lsbCBiZSBhZGRlZCB3aGVuIHByZXNzaW5nIGVudGVyXG4gICAqIE9ubHkgaWYgW3JlcXVpcmVNYXRjaF0gaGFzIGJlZW4gc2V0XG4gICAqL1xuICBwcml2YXRlIF9zZXRGaXJzdE9wdGlvbkFjdGl2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXF1aXJlTWF0Y2gpIHtcbiAgICAgIC8vIG5lZWQgdG8gdXNlIGEgdGltZXIgaGVyZSB0byB3YWl0IHVudGlsIHRoZSBhdXRvY29tcGxldGUgaGFzIGJlZW4gb3BlbmVkIChlbmQgb2YgcXVldWUpXG4gICAgICB0aW1lcigpXG4gICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCAmJiB0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gY2xlYW4gdXAgb2YgcHJldmlvdXNseSBhY3RpdmUgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy50b0FycmF5KCkuZm9yRWFjaCgob3B0aW9uOiBNYXRPcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgb3B0aW9uLnNldEluYWN0aXZlU3R5bGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgZmlyc3Qgb25lIGFzIGFjdGl2ZVxuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy50b0FycmF5KClbMF0uc2V0QWN0aXZlU3R5bGVzKCk7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbEFjdGl2YXRlT3B0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXMgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudCB0byByZW1vdmUgdGhlIGZvY3VzXG4gICAqIFRoZSBhdXRvY29tcGxldGUgcGFuZWwgaXMgY29uc2lkZXJlZCBpbnNpZGUgdGhlIGNvbXBvbmVudCBzbyB3ZVxuICAgKiBuZWVkIHRvIHVzZSBhIGZsYWcgdG8gZmluZCBvdXQgd2hlbiBpdHMgY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgX3dhdGNoT3V0c2lkZUNsaWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kb2N1bWVudCkge1xuICAgICAgdGhpcy5fb3V0c2lkZUNsaWNrU3VicyA9IG1lcmdlKGZyb21FdmVudCh0aGlzLl9kb2N1bWVudCwgJ2NsaWNrJyksIGZyb21FdmVudCh0aGlzLl9kb2N1bWVudCwgJ3RvdWNoZW5kJykpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLl90b3VjaGVuZERlYm91bmNlKSxcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlja1RhcmdldDogSFRNTEVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkICYmXG4gICAgICAgICAgICAgIGNsaWNrVGFyZ2V0ICE9PSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhjbGlja1RhcmdldCkgJiZcbiAgICAgICAgICAgICAgIXRoaXMuX2ludGVybmFsQ2xpY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlVHJpZ2dlci5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZvY3VzZWRTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|