@bpost/bp-address-auto-complete-by-component 1.1.7 → 1.1.8
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/VERSION.md +6 -0
- package/esm2020/lib/box-number/box-number.component.mjs +921 -0
- package/esm2020/lib/lib-address-autocomplete-by-component.component.mjs +1420 -0
- package/esm2020/lib/lib-address-autocomplete-by-component.module.mjs +65 -0
- package/esm2020/lib/lib-address-autocomplete-by-component.service.mjs +14 -0
- package/esm2020/lib/locality/locality.component.mjs +777 -0
- package/esm2020/lib/model/Box.mjs +30 -0
- package/esm2020/lib/model/Locality.mjs +30 -0
- package/esm2020/lib/model/Street.mjs +30 -0
- package/esm2020/lib/model/query-parameters.model.mjs +21 -0
- package/esm2020/lib/services/adress.service.mjs +64 -0
- package/esm2020/lib/services/http.service.mjs +57 -0
- package/esm2020/lib/services/locale.service.mjs +37 -0
- package/esm2020/lib/services/nis9.service.mjs +26 -0
- package/esm2020/lib/services/unicode.service.mjs +376 -0
- package/esm2020/lib/street/street.component.mjs +766 -0
- package/esm2020/lib/street-number/street-number.component.mjs +1008 -0
- package/{esm2022 → esm2020}/lib/utils/constants.mjs +2 -2
- package/esm2020/lib/utils/domhandler.mjs +47 -0
- package/esm2020/lib/utils/highlight-suggestion.pipe.mjs +62 -0
- package/esm2020/lib/utils/prefill-data.mjs +24 -0
- package/esm2020/lib/utils/prefilled-parameters.mjs +23 -0
- package/esm2020/lib/utils/preflll.event.mjs +7 -0
- package/esm2020/lib/utils/visible-suggestion.directive.mjs +39 -0
- package/{fesm2022 → fesm2015}/bpost-bp-address-auto-complete-by-component.mjs +1257 -1437
- package/fesm2015/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
- package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs +5779 -0
- package/fesm2020/bpost-bp-address-auto-complete-by-component.mjs.map +1 -0
- package/lib/lib-address-autocomplete-by-component.module.d.ts +15 -0
- package/package.json +11 -5
- package/tutorial/tutorial/aacwidget-tutorial/README.md +27 -0
- package/tutorial/tutorial/aacwidget-tutorial/package.json +49 -0
- package/esm2022/lib/box-number/box-number.component.mjs +0 -939
- package/esm2022/lib/lib-address-autocomplete-by-component.component.mjs +0 -1432
- package/esm2022/lib/lib-address-autocomplete-by-component.module.mjs +0 -45
- package/esm2022/lib/lib-address-autocomplete-by-component.service.mjs +0 -17
- package/esm2022/lib/locality/locality.component.mjs +0 -832
- package/esm2022/lib/model/Box.mjs +0 -35
- package/esm2022/lib/model/Locality.mjs +0 -35
- package/esm2022/lib/model/Street.mjs +0 -35
- package/esm2022/lib/model/query-parameters.model.mjs +0 -23
- package/esm2022/lib/services/adress.service.mjs +0 -69
- package/esm2022/lib/services/http.service.mjs +0 -61
- package/esm2022/lib/services/locale.service.mjs +0 -39
- package/esm2022/lib/services/nis9.service.mjs +0 -28
- package/esm2022/lib/services/unicode.service.mjs +0 -380
- package/esm2022/lib/street/street.component.mjs +0 -809
- package/esm2022/lib/street-number/street-number.component.mjs +0 -1026
- package/esm2022/lib/utils/domhandler.mjs +0 -51
- package/esm2022/lib/utils/highlight-suggestion.pipe.mjs +0 -76
- package/esm2022/lib/utils/prefill-data.mjs +0 -26
- package/esm2022/lib/utils/prefilled-parameters.mjs +0 -25
- package/esm2022/lib/utils/preflll.event.mjs +0 -9
- package/esm2022/lib/utils/visible-suggestion.directive.mjs +0 -41
- package/fesm2022/bpost-bp-address-auto-complete-by-component.mjs.map +0 -1
- /package/{esm2022 → esm2020}/bpost-bp-address-auto-complete-by-component.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/address-level.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/index.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/input-name.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/source-type.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/suggestion-level-type.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/validation-message-option-type.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/enum/validation-message-type.enum.mjs +0 -0
- /package/{esm2022 → esm2020}/public-api.mjs +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/.editorconfig +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/angular.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/browserslist +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/protractor.conf.js +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/src/app.e2e-spec.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/src/app.po.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/e2e/tsconfig.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/karma.conf.js +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/package-lock.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app-routing.module.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.html +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.scss +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.spec.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.component.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/app.module.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.html +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.scss +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-full/widget-full.component.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.html +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.scss +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.spec.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/app/widget-simple/widget-simple.component.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/.gitkeep +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/de.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/en.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/fr.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/i18n/nl.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/scss/aacwidget-custom.scss +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/assets/aacwidget/scss/aacwidget-default.scss +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/environments/environment.prod.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/environments/environment.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/favicon.ico +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/index.html +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/main.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/polyfills.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/styles.scss +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/src/test.ts +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.app.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tsconfig.spec.json +0 -0
- /package/tutorial/{aacwidget-tutorial → tutorial/aacwidget-tutorial}/tslint.json +0 -0
- /package/tutorial/{tutorial-videos.txt → tutorial/tutorial-videos.txt} +0 -0
|
@@ -1,809 +0,0 @@
|
|
|
1
|
-
import { __values } from "tslib";
|
|
2
|
-
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
|
|
3
|
-
import { ValidationMessageType } from '../enum/validation-message-type.enum';
|
|
4
|
-
import { DomHandler } from '../utils/domhandler';
|
|
5
|
-
import { ADDRESSLEVEL } from '../enum/address-level.enum';
|
|
6
|
-
import { QueryParameters } from '../model/query-parameters.model';
|
|
7
|
-
import { SourceType } from '../enum/source-type.enum';
|
|
8
|
-
import { PrefillEvent } from '../utils/preflll.event';
|
|
9
|
-
import { InputNameType } from '../enum/input-name.enum';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "../services/adress.service";
|
|
12
|
-
import * as i2 from "../services/locale.service";
|
|
13
|
-
import * as i3 from "@ngx-translate/core";
|
|
14
|
-
import * as i4 from "../services/unicode.service";
|
|
15
|
-
var StreetComponent = /** @class */ (function () {
|
|
16
|
-
function StreetComponent(addressService, localeService, translateService, unicodeService) {
|
|
17
|
-
this.addressService = addressService;
|
|
18
|
-
this.localeService = localeService;
|
|
19
|
-
this.translateService = translateService;
|
|
20
|
-
this.unicodeService = unicodeService;
|
|
21
|
-
this.subscription = null;
|
|
22
|
-
// 2020-06-15
|
|
23
|
-
/* @Input()
|
|
24
|
-
onFocusShowSuggestionsAfterPrefill = true; */
|
|
25
|
-
this.labelResourceKey = 'common.label.streetName';
|
|
26
|
-
this.maxSuggesionCount = 5;
|
|
27
|
-
this.visibleSuggesionCount = 5;
|
|
28
|
-
this.sortCriteria = '';
|
|
29
|
-
this.showDebugMessageToConsole = true;
|
|
30
|
-
this.messageOption = 'Y';
|
|
31
|
-
this.isReadonly = false;
|
|
32
|
-
this.messageChanged = new EventEmitter();
|
|
33
|
-
this.addressChanged = new EventEmitter();
|
|
34
|
-
this.focusEvent = new EventEmitter();
|
|
35
|
-
this.blurEvent = new EventEmitter();
|
|
36
|
-
this.textChangeEvent = new EventEmitter();
|
|
37
|
-
this.clearInputEventEmitter = new EventEmitter();
|
|
38
|
-
this.prefillEventEmitter = new EventEmitter();
|
|
39
|
-
this.numberOfExceptionsEmitter = new EventEmitter();
|
|
40
|
-
this.validationMessageCode = null;
|
|
41
|
-
this.validationMessageOptions = null;
|
|
42
|
-
this.prefilling = false;
|
|
43
|
-
this.isPrefillWithNoMatch = false;
|
|
44
|
-
}
|
|
45
|
-
Object.defineProperty(StreetComponent.prototype, "inputLang", {
|
|
46
|
-
// @ts-ignore
|
|
47
|
-
set: function (val) {
|
|
48
|
-
var _this = this;
|
|
49
|
-
this.localeService.changeLang(val);
|
|
50
|
-
this.translateService.use(val).subscribe(function (res) {
|
|
51
|
-
_this.onChangedLanguage();
|
|
52
|
-
});
|
|
53
|
-
},
|
|
54
|
-
enumerable: false,
|
|
55
|
-
configurable: true
|
|
56
|
-
});
|
|
57
|
-
StreetComponent.prototype.ngOnInit = function () {
|
|
58
|
-
this.searchText = '';
|
|
59
|
-
// instance properties
|
|
60
|
-
this.addressIsValidated = false;
|
|
61
|
-
this.suggestionValidationMessage = '';
|
|
62
|
-
this.suggestions = [];
|
|
63
|
-
this.previousIndex = -1;
|
|
64
|
-
this.lastSearchValue = '';
|
|
65
|
-
this.wordList = [];
|
|
66
|
-
this.suggestionsWordList = [];
|
|
67
|
-
this.bpTypeAhead = '';
|
|
68
|
-
this.placeHolderText = '';
|
|
69
|
-
this.skipNextBlur = false; // OnBlur is triggered when the user clicks suggestion/validator button
|
|
70
|
-
this.errorCode = null;
|
|
71
|
-
// scope properties
|
|
72
|
-
this.selectedIndex = -1;
|
|
73
|
-
// properties
|
|
74
|
-
this.typeAheadWord = '';
|
|
75
|
-
this.collapseDropdown = false;
|
|
76
|
-
this.sequenceNumber = 1;
|
|
77
|
-
this.consumedNumber = 1;
|
|
78
|
-
// initialization
|
|
79
|
-
this.setSearchText('');
|
|
80
|
-
// this.setPlaceHolderText();
|
|
81
|
-
this.onChangedLanguage();
|
|
82
|
-
};
|
|
83
|
-
StreetComponent.prototype.ngOnDestroy = function () {
|
|
84
|
-
if (this.subscription) {
|
|
85
|
-
this.subscription.unsubscribe();
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
StreetComponent.prototype.onChangedLanguage = function () {
|
|
89
|
-
var _this = this;
|
|
90
|
-
// this.placeHolderText = this.translateService.instant('street.placeholder.input-placeholder');
|
|
91
|
-
this.translateService.get('street.placeholder.input-placeholder')
|
|
92
|
-
.subscribe(function (res) {
|
|
93
|
-
// console.log('new placeholder', res);
|
|
94
|
-
// => 'hello world'
|
|
95
|
-
_this.placeHolderText = res;
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
StreetComponent.prototype.ngAfterViewChecked = function () {
|
|
99
|
-
if (this.selectionChanged) {
|
|
100
|
-
var overlay_1 = this.streetList.nativeElement;
|
|
101
|
-
setTimeout(function () {
|
|
102
|
-
var listItem = DomHandler.findSingle(overlay_1, 'li.active');
|
|
103
|
-
if (listItem) {
|
|
104
|
-
DomHandler.scrollInView(overlay_1, listItem);
|
|
105
|
-
}
|
|
106
|
-
}, 1);
|
|
107
|
-
this.selectionChanged = false;
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
StreetComponent.prototype.ngOnChanges = function (changes) {
|
|
111
|
-
if (changes) {
|
|
112
|
-
if (changes.hasOwnProperty('prefillData') && !changes.prefillData.firstChange) {
|
|
113
|
-
this.prefilling = true;
|
|
114
|
-
this.searchText = this.loadParams(changes.prefillData.currentValue);
|
|
115
|
-
if (this.searchText !== '' && this.minLevel === ADDRESSLEVEL.STREET) {
|
|
116
|
-
/*
|
|
117
|
-
this.onInputChange('prefilled');
|
|
118
|
-
this.streetSearchInput.nativeElement.focus();
|
|
119
|
-
*/
|
|
120
|
-
/*
|
|
121
|
-
this.prefilling = true;
|
|
122
|
-
this.collapseDropdown = true;
|
|
123
|
-
this.prefillMunicipalityName = this.transformMunicipalityInLowercaseAndWithoutDiacritics(this.addressParams.municipalityName);
|
|
124
|
-
this.onInputChange(/*'prefilled'* / // this.SOURCE_PREFILLED );
|
|
125
|
-
*/
|
|
126
|
-
this.collapseDropdown = true;
|
|
127
|
-
this.prefillData.prefillStreetName
|
|
128
|
-
= this.transformStreetNameInLowercaseAndWithoutDiacritics(this.prefillData.parameters.streetName);
|
|
129
|
-
this.onInputChange(/*'prefilled'*/ SourceType.SOURCE_PREFILLED);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
if (changes.hasOwnProperty('inputText') && !changes.inputText.firstChange) {
|
|
133
|
-
if (this.notEqualIgnoreCase(this.searchText, changes.inputText.currentValue)) {
|
|
134
|
-
this.clearWidget();
|
|
135
|
-
this.searchText = changes.inputText.currentValue;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Reset Street search bar on locality change/reset
|
|
139
|
-
if (changes.hasOwnProperty('postalCode') && !changes.postalCode.firstChange && !changes.hasOwnProperty('prefillData')) {
|
|
140
|
-
this.minLevel = ADDRESSLEVEL.STREET;
|
|
141
|
-
if (changes.postalCode.currentValue === '') {
|
|
142
|
-
this.clearWidget();
|
|
143
|
-
this.valueChanged();
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
StreetComponent.prototype.transformStreetNameInLowercaseAndWithoutDiacritics = function (streetName) {
|
|
149
|
-
var result = null;
|
|
150
|
-
if (streetName !== null && streetName !== undefined) {
|
|
151
|
-
result = this.unicodeService.removeDiacritics(streetName);
|
|
152
|
-
result = result.toLowerCase();
|
|
153
|
-
}
|
|
154
|
-
if (this.showDebugMessageToConsole) {
|
|
155
|
-
console.log('prefill streetName', result);
|
|
156
|
-
}
|
|
157
|
-
return result;
|
|
158
|
-
};
|
|
159
|
-
StreetComponent.prototype.onClearInputEvent = function (event, focus) {
|
|
160
|
-
this.clearInput(focus);
|
|
161
|
-
};
|
|
162
|
-
StreetComponent.prototype.onBlur = function (ev) {
|
|
163
|
-
if (this.isBrowserIE() && this.isDropdownClicked(ev)) {
|
|
164
|
-
this.streetSearchInput.nativeElement.focus();
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
if (this.skipNextBlur) {
|
|
168
|
-
this.skipNextBlur = false;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
this.collapseDropdown = true;
|
|
172
|
-
this.blurEvent.emit(ADDRESSLEVEL.STREET);
|
|
173
|
-
}
|
|
174
|
-
};
|
|
175
|
-
StreetComponent.prototype.isBrowserIE = function () {
|
|
176
|
-
return /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
|
|
177
|
-
};
|
|
178
|
-
StreetComponent.prototype.isDropdownClicked = function (ev) {
|
|
179
|
-
var target = ev.explicitOriginalTarget || document.activeElement;
|
|
180
|
-
return (target.id === 'bpaac-street-dropdown');
|
|
181
|
-
};
|
|
182
|
-
StreetComponent.prototype.onFocus = function () {
|
|
183
|
-
this.collapseDropdown = false;
|
|
184
|
-
// this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
|
|
185
|
-
// ? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
|
|
186
|
-
if (this.showDebugMessageToConsole) {
|
|
187
|
-
console.log('street comp - onFocus', this.prefilling, this.prefillData, this.collapseDropdown);
|
|
188
|
-
}
|
|
189
|
-
// this.prefilling = false;
|
|
190
|
-
this.skipNextBlur = false;
|
|
191
|
-
this.focusEvent.emit(ADDRESSLEVEL.STREET);
|
|
192
|
-
};
|
|
193
|
-
StreetComponent.prototype.mayShowDropdown = function () {
|
|
194
|
-
return this.suggestions.length > 0 && !this.collapseDropdown;
|
|
195
|
-
};
|
|
196
|
-
StreetComponent.prototype.buildInputWordList = function () {
|
|
197
|
-
var e_1, _a, e_2, _b;
|
|
198
|
-
this.wordList = this.searchText.split(/[\s, ]+/);
|
|
199
|
-
// console.log('word list - street:', this.wordList);
|
|
200
|
-
if (this.suggestions && this.wordList) {
|
|
201
|
-
try {
|
|
202
|
-
for (var _c = __values(this.suggestions), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
203
|
-
var sug = _d.value;
|
|
204
|
-
if (!sug || !sug.hasOwnProperty('string')) {
|
|
205
|
-
continue;
|
|
206
|
-
}
|
|
207
|
-
var _loop_1 = function (w) {
|
|
208
|
-
var start = this_1.startsWithIgnoreDiacritics(sug.string, w);
|
|
209
|
-
if (start >= 0) {
|
|
210
|
-
var ww_1 = sug.string.substr(start, w.length);
|
|
211
|
-
// console.log('adding word:' + ww);
|
|
212
|
-
// ww is a candidate to be added to the wordlist if not already present in it
|
|
213
|
-
var present = this_1.wordList.find(function (w1) { return w1.toLowerCase() === ww_1.toLowerCase(); });
|
|
214
|
-
if (present === null || present === undefined) {
|
|
215
|
-
this_1.wordList.push(ww_1);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
var this_1 = this;
|
|
220
|
-
try {
|
|
221
|
-
for (var _e = (e_2 = void 0, __values(this.wordList)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
222
|
-
var w = _f.value;
|
|
223
|
-
_loop_1(w);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
227
|
-
finally {
|
|
228
|
-
try {
|
|
229
|
-
if (_f && !_f.done && (_b = _e["return"])) _b.call(_e);
|
|
230
|
-
}
|
|
231
|
-
finally { if (e_2) throw e_2.error; }
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
236
|
-
finally {
|
|
237
|
-
try {
|
|
238
|
-
if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
|
|
239
|
-
}
|
|
240
|
-
finally { if (e_1) throw e_1.error; }
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
StreetComponent.prototype.startsWithIgnoreDiacritics = function (value, prefix) {
|
|
245
|
-
// console.log('Searching for prefix "' + prefix + '" inside suggestion: ' + value);
|
|
246
|
-
// tslint:disable-next-line:variable-name
|
|
247
|
-
var _value = this.unicodeService.removeDiacritics((value !== null && value !== undefined) ? value.toLowerCase() : value);
|
|
248
|
-
// tslint:disable-next-line:variable-name
|
|
249
|
-
var _prefix = this.unicodeService.removeDiacritics((prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix);
|
|
250
|
-
var start = _value.indexOf(_prefix);
|
|
251
|
-
// console.log('startsWithIgnoreDiacritics: ' + start);
|
|
252
|
-
return start;
|
|
253
|
-
};
|
|
254
|
-
StreetComponent.prototype.mayAddTypeAhead = function () {
|
|
255
|
-
if (this.searchText.length === 0) {
|
|
256
|
-
return false;
|
|
257
|
-
}
|
|
258
|
-
return (/[^\s, \\\/]$/).test(this.searchText);
|
|
259
|
-
};
|
|
260
|
-
StreetComponent.prototype.valueChanged = function () {
|
|
261
|
-
this.textChangeEvent.emit(this.searchText);
|
|
262
|
-
};
|
|
263
|
-
StreetComponent.prototype.buildTypeAhead = function (source) {
|
|
264
|
-
if (source === SourceType.SOURCE_PREFILLED) {
|
|
265
|
-
return false;
|
|
266
|
-
}
|
|
267
|
-
if (!this.mayAddTypeAhead()) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
var searchTextWords = this.searchText.split(/[\s, ]+/);
|
|
271
|
-
var lastWord = searchTextWords[searchTextWords.length - 1];
|
|
272
|
-
if (this.suggestions.some(function (sug) {
|
|
273
|
-
if (!sug || !sug.hasOwnProperty('string')) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
return sug.string.split(/[\s-]+/).some(function (word) {
|
|
277
|
-
if (this.stringStartsWithIgnoreDiacritics(word, lastWord)) {
|
|
278
|
-
this.typeAheadWord = word;
|
|
279
|
-
return true;
|
|
280
|
-
}
|
|
281
|
-
}.bind(this));
|
|
282
|
-
}.bind(this))) {
|
|
283
|
-
var appendix = this.typeAheadWord.slice(lastWord.length, this.typeAheadWord.length).toLowerCase();
|
|
284
|
-
this.bpTypeAhead = this.searchText + appendix;
|
|
285
|
-
}
|
|
286
|
-
};
|
|
287
|
-
StreetComponent.prototype.stringStartsWithIgnoreDiacritics = function (value, prefix) {
|
|
288
|
-
// tslint:disable-next-line:variable-name
|
|
289
|
-
var _value = this.unicodeService.removeDiacritics((value !== null && value !== undefined) ? value.toLowerCase() : value);
|
|
290
|
-
// tslint:disable-next-line:variable-name
|
|
291
|
-
var _prefix = this.unicodeService.removeDiacritics((prefix !== null && prefix !== undefined) ? prefix.toLowerCase() : prefix);
|
|
292
|
-
var start = _value.slice(0, _prefix.length).toLowerCase().indexOf(_prefix) !== -1;
|
|
293
|
-
return start;
|
|
294
|
-
};
|
|
295
|
-
StreetComponent.prototype.getTopSuggestions = function (source) {
|
|
296
|
-
var _this = this;
|
|
297
|
-
this.sequenceNumber += 1;
|
|
298
|
-
var param = this.generateParameters();
|
|
299
|
-
if (this.showDebugMessageToConsole) {
|
|
300
|
-
console.log('STREET calling service params', param);
|
|
301
|
-
}
|
|
302
|
-
if (this.searchText) {
|
|
303
|
-
this.subscription = this.addressService.getStreet(this.baseUrl, this.locality, this.postalCode, param)
|
|
304
|
-
.subscribe(function (response) {
|
|
305
|
-
_this.handleGetStreetResponse(response, source);
|
|
306
|
-
if (source === SourceType.SOURCE_PREFILLED) {
|
|
307
|
-
_this.isPrefillWithNoMatch = _this.prefillData.prefillStreetPerfectMatchFound === true ? false : true;
|
|
308
|
-
_this.prefillAnalyzeData();
|
|
309
|
-
}
|
|
310
|
-
else {
|
|
311
|
-
_this.isPrefillWithNoMatch = false;
|
|
312
|
-
}
|
|
313
|
-
}, function () { return _this.handleGetStreetError(); });
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
StreetComponent.prototype.getTextColor = function () {
|
|
317
|
-
return (this.isPrefillWithNoMatch === true) ? 'orangered' : '';
|
|
318
|
-
};
|
|
319
|
-
StreetComponent.prototype.loadParams = function (prefillData) {
|
|
320
|
-
var concatStr = '';
|
|
321
|
-
if (prefillData !== null && prefillData.parameters !== null) {
|
|
322
|
-
if (prefillData.parameters.hasOwnProperty('minLevel')) {
|
|
323
|
-
this.minLevel = prefillData.parameters.minLevel;
|
|
324
|
-
}
|
|
325
|
-
/*
|
|
326
|
-
if (params.hasOwnProperty('unstructuredAddress') && this.isString(params.unstructuredAddress)) {
|
|
327
|
-
this.valueChanged();
|
|
328
|
-
}
|
|
329
|
-
*/
|
|
330
|
-
if (prefillData.parameters.hasOwnProperty('postalCode') && this.isString(prefillData.parameters.postalCode)) {
|
|
331
|
-
this.postalCode = prefillData.parameters.postalCode;
|
|
332
|
-
}
|
|
333
|
-
if (prefillData.parameters.hasOwnProperty('municipalityName') && this.isString(prefillData.parameters.municipalityName)) {
|
|
334
|
-
this.locality = prefillData.parameters.municipalityName;
|
|
335
|
-
}
|
|
336
|
-
if (prefillData.parameters.hasOwnProperty('streetName')
|
|
337
|
-
&& this.isString(prefillData.parameters.streetName) && this.isParamsComplete()) {
|
|
338
|
-
concatStr = prefillData.parameters.streetName;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
return concatStr;
|
|
342
|
-
};
|
|
343
|
-
StreetComponent.prototype.isString = function (val) {
|
|
344
|
-
if (val === null || val === undefined) {
|
|
345
|
-
return false;
|
|
346
|
-
}
|
|
347
|
-
return val.constructor === String;
|
|
348
|
-
};
|
|
349
|
-
StreetComponent.prototype.isValid = function (val) {
|
|
350
|
-
return this.isString(val) && val !== '';
|
|
351
|
-
};
|
|
352
|
-
StreetComponent.prototype.isParamsComplete = function () {
|
|
353
|
-
if (!this.validatedByBackend) {
|
|
354
|
-
return this.isValid(this.postalCode) || this.isValid(this.locality);
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
return this.isValid(this.postalCode) && this.isValid(this.locality);
|
|
358
|
-
}
|
|
359
|
-
};
|
|
360
|
-
StreetComponent.prototype.generateParameters = function () {
|
|
361
|
-
var param = new QueryParameters({
|
|
362
|
-
id: this.sequenceNumber,
|
|
363
|
-
q: this.searchText,
|
|
364
|
-
postalCode: this.postalCode,
|
|
365
|
-
locality: this.locality,
|
|
366
|
-
maxNumberOfSuggestions: this.maxSuggesionCount
|
|
367
|
-
});
|
|
368
|
-
if (this.sortCriteria === 'S') {
|
|
369
|
-
param.sortByStreet(true);
|
|
370
|
-
}
|
|
371
|
-
return param;
|
|
372
|
-
};
|
|
373
|
-
StreetComponent.prototype.handleGetStreetResponse = function (data, source) {
|
|
374
|
-
if (data && data.response && data.response.sequenceNumber && data.response.sequenceNumber >= this.consumedNumber &&
|
|
375
|
-
data.response.topSuggestions) {
|
|
376
|
-
this.consumedNumber = data.response.sequenceNumber;
|
|
377
|
-
this.clearSuggestions();
|
|
378
|
-
this.parseTopSuggestions(data.response.topSuggestions, source);
|
|
379
|
-
this.buildTypeAhead(source);
|
|
380
|
-
this.clearConnectionErrorMessage();
|
|
381
|
-
this.buildInputWordList();
|
|
382
|
-
}
|
|
383
|
-
this.collapseDropdown = (this.prefilling === true && this.prefillData !== null)
|
|
384
|
-
? !this.prefillData.parameters.onFocusShowSuggestionsAfterPrefill : false;
|
|
385
|
-
};
|
|
386
|
-
StreetComponent.prototype.handleGetStreetError = function () {
|
|
387
|
-
if (this.allowNoValidation && this.validatedByBackend) {
|
|
388
|
-
this.numberOfExceptions += 1;
|
|
389
|
-
this.numberOfExceptionsEmitter.emit(this.numberOfExceptions);
|
|
390
|
-
}
|
|
391
|
-
this.setConnectionErrorMessage();
|
|
392
|
-
};
|
|
393
|
-
StreetComponent.prototype.setConnectionErrorMessage = function () {
|
|
394
|
-
this.errorCode = /*'service-unavailable'*/ ValidationMessageType.Service_Unavailable;
|
|
395
|
-
// this.setValidationMessage(this.errorCode);
|
|
396
|
-
this.emitTranslatedValidationMessage(ValidationMessageType.Service_Unavailable);
|
|
397
|
-
};
|
|
398
|
-
StreetComponent.prototype.clearConnectionErrorMessage = function () {
|
|
399
|
-
if (this.errorCode) {
|
|
400
|
-
var res = this.translateService.instant(this.errorCode);
|
|
401
|
-
if (this.suggestionValidationMessage === res) {
|
|
402
|
-
this.clearSuggestionValidationMessage();
|
|
403
|
-
}
|
|
404
|
-
this.errorCode = null;
|
|
405
|
-
}
|
|
406
|
-
};
|
|
407
|
-
StreetComponent.prototype.parseTopSuggestions = function (topSuggestions, source) {
|
|
408
|
-
var e_3, _a;
|
|
409
|
-
if (topSuggestions.constructor === Array) {
|
|
410
|
-
try {
|
|
411
|
-
// topSuggestions.forEach(this.parseSingleSuggestion.bind(this));
|
|
412
|
-
for (var topSuggestions_1 = __values(topSuggestions), topSuggestions_1_1 = topSuggestions_1.next(); !topSuggestions_1_1.done; topSuggestions_1_1 = topSuggestions_1.next()) {
|
|
413
|
-
var sug = topSuggestions_1_1.value;
|
|
414
|
-
this.parseSingleSuggestion(sug, source);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
418
|
-
finally {
|
|
419
|
-
try {
|
|
420
|
-
if (topSuggestions_1_1 && !topSuggestions_1_1.done && (_a = topSuggestions_1["return"])) _a.call(topSuggestions_1);
|
|
421
|
-
}
|
|
422
|
-
finally { if (e_3) throw e_3.error; }
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
this.parseSingleSuggestion(topSuggestions, source);
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
StreetComponent.prototype.parseSingleSuggestion = function (suggestion, source) {
|
|
430
|
-
var suggestionToAdd;
|
|
431
|
-
if (this.localeService.isLocaleFrench() && suggestion.hasOwnProperty('french')) {
|
|
432
|
-
suggestionToAdd = suggestion.french;
|
|
433
|
-
}
|
|
434
|
-
else if (this.localeService.isLocaleDutch() && suggestion.hasOwnProperty('dutch')) {
|
|
435
|
-
suggestionToAdd = suggestion.dutch;
|
|
436
|
-
}
|
|
437
|
-
else if (this.localeService.isLocaleGerman() && suggestion.hasOwnProperty('german')) {
|
|
438
|
-
suggestionToAdd = suggestion.german;
|
|
439
|
-
}
|
|
440
|
-
else if (suggestion.hasOwnProperty('address')) {
|
|
441
|
-
suggestionToAdd = suggestion.address;
|
|
442
|
-
}
|
|
443
|
-
if (suggestionToAdd) {
|
|
444
|
-
if (suggestion.messages) {
|
|
445
|
-
suggestionToAdd.messages = suggestion.messages;
|
|
446
|
-
}
|
|
447
|
-
this.suggestions.push(suggestionToAdd);
|
|
448
|
-
if (source === SourceType.SOURCE_PREFILLED) {
|
|
449
|
-
suggestion.address = suggestionToAdd;
|
|
450
|
-
this.prefillCheckForPerfectMatch(suggestion);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
};
|
|
454
|
-
StreetComponent.prototype.prefillCheckForPerfectMatch = function (suggestion) {
|
|
455
|
-
if (this.showDebugMessageToConsole) {
|
|
456
|
-
console.log('street - checking suggestion for perfect match', this.prefillData, suggestion);
|
|
457
|
-
}
|
|
458
|
-
var sugAddress = suggestion.address;
|
|
459
|
-
// if (sugAddress.streetName === this.prefillData.parameters.streetName )
|
|
460
|
-
var suggestionLocality = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.localityName);
|
|
461
|
-
var suggestionMunicipality = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.municipalityName);
|
|
462
|
-
if (suggestionLocality === this.prefillData.prefillMunicipalityName
|
|
463
|
-
|| suggestionMunicipality === this.prefillData.prefillMunicipalityName) {
|
|
464
|
-
var suggestionStreetName = this.transformStreetNameInLowercaseAndWithoutDiacritics(sugAddress.streetName);
|
|
465
|
-
// console.log('comparing street names', suggestionStreetName, this.prefillData.prefillStreetName);
|
|
466
|
-
if (suggestionStreetName === this.prefillData.prefillStreetName) {
|
|
467
|
-
this.prefillData.prefillStreetPerfectMatchFound = true;
|
|
468
|
-
this.prefillData.prefillStreetPerfectMatchSuggestion = suggestion;
|
|
469
|
-
this.searchText = sugAddress.streetName;
|
|
470
|
-
}
|
|
471
|
-
if (this.prefillData.prefillStreetPerfectMatchFound === true) {
|
|
472
|
-
if (this.showDebugMessageToConsole) {
|
|
473
|
-
console.log('STREET - PREFILL - Perfect match - street:', suggestion);
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
if (this.showDebugMessageToConsole) {
|
|
478
|
-
console.log('STREET - PREFILL - NO Perfect match:', suggestion);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
};
|
|
483
|
-
StreetComponent.prototype.onInputChange = function (source) {
|
|
484
|
-
// console.log('street onInputChange : source ', source);
|
|
485
|
-
this.collapseDropdown = false;
|
|
486
|
-
this.resetArrowSelectedIndex();
|
|
487
|
-
if (!source) {
|
|
488
|
-
this.prefilling = false;
|
|
489
|
-
this.valueChanged();
|
|
490
|
-
}
|
|
491
|
-
this.clearSuggestionValidationMessage();
|
|
492
|
-
if (this.searchText === '') {
|
|
493
|
-
this.sequenceNumber += 1;
|
|
494
|
-
this.consumedNumber = this.sequenceNumber;
|
|
495
|
-
this.clearSuggestions();
|
|
496
|
-
}
|
|
497
|
-
else {
|
|
498
|
-
if (!this.validatedByBackend) {
|
|
499
|
-
var suggestion = {
|
|
500
|
-
'string': this.searchText.toUpperCase(),
|
|
501
|
-
'municipalityName': this.locality ? this.locality.toLocaleUpperCase() : '',
|
|
502
|
-
'localityName': this.locality ? this.locality.toLocaleUpperCase() : '',
|
|
503
|
-
'postalCode': this.postalCode,
|
|
504
|
-
'searchBarString': this.searchText.toUpperCase(),
|
|
505
|
-
'streetName': this.searchText.toUpperCase()
|
|
506
|
-
};
|
|
507
|
-
this.setSelectedAddress(suggestion);
|
|
508
|
-
}
|
|
509
|
-
else {
|
|
510
|
-
this.getTopSuggestions(source);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
this.buildInputWordList();
|
|
514
|
-
};
|
|
515
|
-
StreetComponent.prototype.prefillAnalyzeData = function () {
|
|
516
|
-
if (this.prefillData.prefillStreetPerfectMatchFound === true) {
|
|
517
|
-
this.collapseDropdown = true;
|
|
518
|
-
}
|
|
519
|
-
this.prefillEventEmitter.emit(new PrefillEvent(ADDRESSLEVEL.STREET, this.prefillData));
|
|
520
|
-
};
|
|
521
|
-
StreetComponent.prototype.clickSuggestion = function (event, suggestion) {
|
|
522
|
-
this.isPrefillWithNoMatch = false;
|
|
523
|
-
if (this.showDebugMessageToConsole) {
|
|
524
|
-
console.log('streetNumber::clickSuggestion', event, suggestion);
|
|
525
|
-
}
|
|
526
|
-
event === null || event === void 0 ? void 0 : event.preventDefault();
|
|
527
|
-
this.clearTypeAhead();
|
|
528
|
-
this.resetArrowSelectedIndex();
|
|
529
|
-
this.setSearchText(suggestion.string);
|
|
530
|
-
this.collapseDropdown = true;
|
|
531
|
-
// if (suggestion.hasOwnProperty('isComplete')) {
|
|
532
|
-
// this.showAddressIsValidated();
|
|
533
|
-
// }
|
|
534
|
-
this.addressIsValidated = true;
|
|
535
|
-
if (event) {
|
|
536
|
-
this.clearSuggestions();
|
|
537
|
-
}
|
|
538
|
-
this.setSelectedAddress(suggestion);
|
|
539
|
-
};
|
|
540
|
-
StreetComponent.prototype.setSelectedAddress = function (suggestion) {
|
|
541
|
-
this.addressChanged.emit(suggestion);
|
|
542
|
-
};
|
|
543
|
-
StreetComponent.prototype.clearSelectedAddress = function () {
|
|
544
|
-
this.addressChanged.emit(null);
|
|
545
|
-
this.addressIsValidated = false;
|
|
546
|
-
};
|
|
547
|
-
StreetComponent.prototype.emitTranslatedValidationMessage = function (validationMessageType, options) {
|
|
548
|
-
// Momently, options are NOT used; so data type of these options will be reviewed once needed.
|
|
549
|
-
if (validationMessageType === null || validationMessageType === undefined) {
|
|
550
|
-
console.warn('Unable to emit validation message - message key is invalid!', validationMessageType);
|
|
551
|
-
return;
|
|
552
|
-
}
|
|
553
|
-
switch (validationMessageType) {
|
|
554
|
-
case ValidationMessageType.Address_Not_Found:
|
|
555
|
-
case ValidationMessageType.Address_Validated:
|
|
556
|
-
case ValidationMessageType.Service_Unavailable:
|
|
557
|
-
{
|
|
558
|
-
var message = this.translateService.instant(validationMessageType);
|
|
559
|
-
// this.messageChanged.emit(message);
|
|
560
|
-
this.messageChanged.emit({ messageType: validationMessageType, translatedMessage: message });
|
|
561
|
-
}
|
|
562
|
-
// tslint:disable-next-line:align
|
|
563
|
-
break;
|
|
564
|
-
default:
|
|
565
|
-
{
|
|
566
|
-
console.error('Unable to emit validation message - message key NOT supported!', validationMessageType);
|
|
567
|
-
}
|
|
568
|
-
// tslint:disable-next-line:align
|
|
569
|
-
break;
|
|
570
|
-
}
|
|
571
|
-
};
|
|
572
|
-
StreetComponent.prototype.showAddressIsValidated = function () {
|
|
573
|
-
// this.setValidationMessage('address-validated');
|
|
574
|
-
this.emitTranslatedValidationMessage(ValidationMessageType.Address_Validated);
|
|
575
|
-
};
|
|
576
|
-
StreetComponent.prototype.checkKeyDown = function (event) {
|
|
577
|
-
switch (event.which) {
|
|
578
|
-
// down key, increment selectedIndex
|
|
579
|
-
case 40:
|
|
580
|
-
event.preventDefault();
|
|
581
|
-
this.moveArrowSelectedIndexDown();
|
|
582
|
-
break;
|
|
583
|
-
// up key, decrement selectedIndex
|
|
584
|
-
case 38:
|
|
585
|
-
event.preventDefault();
|
|
586
|
-
this.moveArrowSelectedIndexUp();
|
|
587
|
-
break;
|
|
588
|
-
// right arrow key
|
|
589
|
-
case 39:
|
|
590
|
-
event.preventDefault();
|
|
591
|
-
if (this.cursorIsOnSuggestionList()) {
|
|
592
|
-
this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
|
|
593
|
-
}
|
|
594
|
-
else {
|
|
595
|
-
if (this.typeAheadWord && this.typeAheadIsShown()) {
|
|
596
|
-
this.setSearchText(this.bpTypeAhead);
|
|
597
|
-
this.typeAheadWord = '';
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
break;
|
|
601
|
-
// tab key
|
|
602
|
-
case 9:
|
|
603
|
-
if (!this.addressIsValidated && !event.shiftKey) {
|
|
604
|
-
event.preventDefault();
|
|
605
|
-
this.selectFirstInListOfSuggesions();
|
|
606
|
-
}
|
|
607
|
-
break;
|
|
608
|
-
case 46:
|
|
609
|
-
if (event.ctrlKey) {
|
|
610
|
-
this.clearWidget();
|
|
611
|
-
}
|
|
612
|
-
break;
|
|
613
|
-
// enter pressed
|
|
614
|
-
case 13:
|
|
615
|
-
event.preventDefault();
|
|
616
|
-
if (this.cursorIsOnSuggestionList()) {
|
|
617
|
-
this.clickSuggestion(event, this.suggestions[this.selectedIndex]);
|
|
618
|
-
}
|
|
619
|
-
else {
|
|
620
|
-
}
|
|
621
|
-
break;
|
|
622
|
-
default:
|
|
623
|
-
this.clearTypeAhead();
|
|
624
|
-
break;
|
|
625
|
-
}
|
|
626
|
-
};
|
|
627
|
-
StreetComponent.prototype.clearWidget = function () {
|
|
628
|
-
this.addressIsValidated = false;
|
|
629
|
-
this.clearSearchText();
|
|
630
|
-
this.clearSuggestions();
|
|
631
|
-
this.clearTypeAhead();
|
|
632
|
-
this.prefillData = null;
|
|
633
|
-
this.prefilling = false;
|
|
634
|
-
};
|
|
635
|
-
StreetComponent.prototype.clearSearchText = function () {
|
|
636
|
-
this.searchText = '';
|
|
637
|
-
};
|
|
638
|
-
StreetComponent.prototype.typeAheadIsShown = function () {
|
|
639
|
-
return this.bpTypeAhead && this.bpTypeAhead.length > 0;
|
|
640
|
-
};
|
|
641
|
-
StreetComponent.prototype.resetArrowSelectedIndex = function () {
|
|
642
|
-
this.selectedIndex = -1;
|
|
643
|
-
};
|
|
644
|
-
StreetComponent.prototype.moveArrowSelectedIndexDown = function () {
|
|
645
|
-
if (this.selectedIndex + 1 !== this.suggestions.length) {
|
|
646
|
-
this.selectedIndex++;
|
|
647
|
-
this.changeSelection();
|
|
648
|
-
this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
|
|
649
|
-
}
|
|
650
|
-
};
|
|
651
|
-
StreetComponent.prototype.moveArrowSelectedIndexUp = function () {
|
|
652
|
-
if (this.selectedIndex - 1 !== -2) {
|
|
653
|
-
this.selectedIndex--;
|
|
654
|
-
this.changeSelection();
|
|
655
|
-
this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex + 1);
|
|
656
|
-
}
|
|
657
|
-
};
|
|
658
|
-
StreetComponent.prototype.cursorIsOnSuggestionList = function () {
|
|
659
|
-
return this.selectedIndex >= 0;
|
|
660
|
-
};
|
|
661
|
-
StreetComponent.prototype.setSearchTextBasedOnArrowSelection = function (newVal, oldVal) {
|
|
662
|
-
if (newVal === undefined || this.suggestions.length <= 0) {
|
|
663
|
-
return;
|
|
664
|
-
}
|
|
665
|
-
if (newVal !== -1) {
|
|
666
|
-
if (oldVal === -1) {
|
|
667
|
-
this.lastSearchValue = this.searchText;
|
|
668
|
-
}
|
|
669
|
-
this.setSearchText(this.suggestions[this.selectedIndex].string);
|
|
670
|
-
this.clearTypeAhead();
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
this.setSearchText(this.lastSearchValue);
|
|
674
|
-
}
|
|
675
|
-
};
|
|
676
|
-
StreetComponent.prototype.mayShowClearButton = function () {
|
|
677
|
-
return this.searchText.length > 0;
|
|
678
|
-
};
|
|
679
|
-
StreetComponent.prototype.clearInput = function (focus, emit) {
|
|
680
|
-
if (emit === void 0) { emit = true; }
|
|
681
|
-
// console.warn('street clearInput called ...', focus, emit);
|
|
682
|
-
this.clearWidget();
|
|
683
|
-
this.resetArrowSelectedIndex();
|
|
684
|
-
this.previousIndex = -1;
|
|
685
|
-
this.lastSearchValue = '';
|
|
686
|
-
this.clearSuggestionValidationMessage();
|
|
687
|
-
this.valueChanged();
|
|
688
|
-
this.clearConnectionErrorMessage();
|
|
689
|
-
if (focus === true) {
|
|
690
|
-
// console.warn('street clearInput - set focus !!!', focus);
|
|
691
|
-
this.streetSearchInput.nativeElement.focus();
|
|
692
|
-
}
|
|
693
|
-
if (emit) {
|
|
694
|
-
this.clearInputEventEmitter.emit(/*'STREET'*/ InputNameType.STREET);
|
|
695
|
-
}
|
|
696
|
-
};
|
|
697
|
-
StreetComponent.prototype.clearSuggestions = function () {
|
|
698
|
-
this.wordList = [];
|
|
699
|
-
this.suggestions = [];
|
|
700
|
-
this.suggestionsWordList = [];
|
|
701
|
-
};
|
|
702
|
-
StreetComponent.prototype.clearTypeAhead = function () {
|
|
703
|
-
this.bpTypeAhead = '';
|
|
704
|
-
};
|
|
705
|
-
StreetComponent.prototype.clearSuggestionValidationMessage = function () {
|
|
706
|
-
this.suggestionValidationMessage = '';
|
|
707
|
-
this.addressIsValidated = false;
|
|
708
|
-
// this.messageChanged.emit(this.suggestionValidationMessage);
|
|
709
|
-
this.messageChanged.emit({ messageType: null, translatedMessage: this.suggestionValidationMessage });
|
|
710
|
-
this.validationMessageOptions = null;
|
|
711
|
-
this.validationMessageCode = null;
|
|
712
|
-
};
|
|
713
|
-
StreetComponent.prototype.setSearchText = function (value) {
|
|
714
|
-
this.searchText = value;
|
|
715
|
-
};
|
|
716
|
-
StreetComponent.prototype.selectFirstInListOfSuggesions = function () {
|
|
717
|
-
this.selectedIndex = 0;
|
|
718
|
-
this.changeSelection();
|
|
719
|
-
this.setSearchTextBasedOnArrowSelection(this.selectedIndex, this.selectedIndex - 1);
|
|
720
|
-
};
|
|
721
|
-
StreetComponent.prototype.changeSelection = function () {
|
|
722
|
-
if (this.suggestions.length > 0) {
|
|
723
|
-
this.selectionChanged = true;
|
|
724
|
-
}
|
|
725
|
-
};
|
|
726
|
-
StreetComponent.prototype.suggestionMouseLeave = function () {
|
|
727
|
-
this.selectedIndex = -1;
|
|
728
|
-
};
|
|
729
|
-
StreetComponent.prototype.notEqualIgnoreCase = function (oldVal, newVal) {
|
|
730
|
-
return oldVal.toLowerCase() !== newVal.toLowerCase();
|
|
731
|
-
};
|
|
732
|
-
StreetComponent.prototype.showAddressNotFoundMessage = function () {
|
|
733
|
-
// this.setValidationMessage('address-not-found');
|
|
734
|
-
this.emitTranslatedValidationMessage(ValidationMessageType.Address_Not_Found);
|
|
735
|
-
};
|
|
736
|
-
StreetComponent.prototype.isDisabled = function () {
|
|
737
|
-
return (this.locality === '' || this.postalCode === '' || this.minLevel > ADDRESSLEVEL.STREET);
|
|
738
|
-
};
|
|
739
|
-
StreetComponent.prototype.onInputClick = function () {
|
|
740
|
-
if (this.showDebugMessageToConsole) {
|
|
741
|
-
console.log('street click');
|
|
742
|
-
}
|
|
743
|
-
this.prefilling = false;
|
|
744
|
-
this.collapseDropdown = false;
|
|
745
|
-
};
|
|
746
|
-
StreetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: StreetComponent, deps: [{ token: i1.AddressService }, { token: i2.LocaleService }, { token: i3.TranslateService }, { token: i4.UnicodeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
747
|
-
StreetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: StreetComponent, selector: "bp-street", inputs: { labelResourceKey: "labelResourceKey", maxSuggesionCount: "maxSuggesionCount", visibleSuggesionCount: "visibleSuggesionCount", sortCriteria: "sortCriteria", baseUrl: "baseUrl", prefillData: "prefillData", showDebugMessageToConsole: "showDebugMessageToConsole", postalCode: "postalCode", locality: "locality", inputText: "inputText", messageOption: "messageOption", allowNoValidation: "allowNoValidation", validatedByBackend: "validatedByBackend", numberOfExceptions: "numberOfExceptions", inputLang: "inputLang", isReadonly: "isReadonly" }, outputs: { messageChanged: "messageChanged", addressChanged: "addressChanged", focusEvent: "focusEvent", blurEvent: "blurEvent", textChangeEvent: "textChangeEvent", clearInputEventEmitter: "clearInputEventEmitter", prefillEventEmitter: "prefillEventEmitter", numberOfExceptionsEmitter: "numberOfExceptionsEmitter" }, viewQueries: [{ propertyName: "streetSearchInput", first: true, predicate: ["streetSearchInput"], descendants: true }, { propertyName: "streetList", first: true, predicate: ["streetList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #streetSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"(validatedByBackend && (!locality || locality.trim().length === 0)) \n || (!validatedByBackend && ((!postalCode || postalCode.trim().length === 0) && (!locality || locality.trim().length === 0)))\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"streetInputField\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-street-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-street-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #streetList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-street-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-street-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [""] });
|
|
748
|
-
return StreetComponent;
|
|
749
|
-
}());
|
|
750
|
-
export { StreetComponent };
|
|
751
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: StreetComponent, decorators: [{
|
|
752
|
-
type: Component,
|
|
753
|
-
args: [{ selector: 'bp-street', template: "<span *ngIf=\"labelResourceKey\">{{ labelResourceKey | translate}}</span>\n<div class=\"bpaac-dropdown\">\n <div class=\"bpaac-search-bar\">\n <div class=\"bpaac-input-width\">\n <!-- [disabled]=\"isDisabled()\" -->\n <input type=\"text\" #streetSearchInput class=\"bpaac-input\" \n [readonly]=\"isReadonly\"\n [style.background-color]=\"!isParamsComplete() ? 'lightgrey' : ''\" \n [style.color]=\" getTextColor() \"\n [disabled]=\"(validatedByBackend && (!locality || locality.trim().length === 0)) \n || (!validatedByBackend && ((!postalCode || postalCode.trim().length === 0) && (!locality || locality.trim().length === 0)))\" (keydown)=\"checkKeyDown($event)\" \n (input)=\"onInputChange()\" (click)=\"onInputClick()\"\n [(ngModel)]=\"searchText\" id=\"streetInputField\" [attr.placeholder]=\"placeHolderText\" autocomplete=\"off\"\n (blur)=\"onBlur($event)\" (focus)=\"onFocus()\" />\n <div id=\"bpaac-clear-street-button\" *ngIf=\"mayShowClearButton()\" (click)=\"clearInput(true)\" class=\"bpaac-clear\">\n </div>\n </div>\n <!--<div ng-transclude></div>-->\n <input id=\"bpaac-street-typeahead\" type=\"text\" disabled autocomplete=\"off\" [(ngModel)]=\"bpTypeAhead\" />\n </div>\n <div [hidden]=\"collapseDropdown\" class=\"bpaac-dropdown-menu-container\" *ngIf=\"suggestions && suggestions.length>0\">\n <div #streetList [appVisibleSuggestion]=\"visibleSuggesionCount\" id=\"bpaac-street-dropdown\" class=\"bpaac-dropdown-menu\">\n <ul role=\"listbox\" id=\"bpaac-street-suggestionsList\" class=\"list-unstyled\">\n <li role=\"option\" *ngFor=\"let option of suggestions; let idx = index\" [ngClass]=\"{'active':(selectedIndex==idx)}\" (mousedown)=\"clickSuggestion($event, option)\"\n (mouseenter)=\"selectedIndex=idx\" (mouseleave)=\"selectedIndex=-1\">\n <span *ngIf=\"option\" [innerHtml]=\"option.string | highlightSuggestion : wordList\"></span>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [""] }]
|
|
754
|
-
}], ctorParameters: function () { return [{ type: i1.AddressService }, { type: i2.LocaleService }, { type: i3.TranslateService }, { type: i4.UnicodeService }]; }, propDecorators: { streetSearchInput: [{
|
|
755
|
-
type: ViewChild,
|
|
756
|
-
args: ['streetSearchInput', { static: false }]
|
|
757
|
-
}], streetList: [{
|
|
758
|
-
type: ViewChild,
|
|
759
|
-
args: ['streetList', { static: false }]
|
|
760
|
-
}], labelResourceKey: [{
|
|
761
|
-
type: Input
|
|
762
|
-
}], maxSuggesionCount: [{
|
|
763
|
-
type: Input
|
|
764
|
-
}], visibleSuggesionCount: [{
|
|
765
|
-
type: Input
|
|
766
|
-
}], sortCriteria: [{
|
|
767
|
-
type: Input
|
|
768
|
-
}], baseUrl: [{
|
|
769
|
-
type: Input
|
|
770
|
-
}], prefillData: [{
|
|
771
|
-
type: Input
|
|
772
|
-
}], showDebugMessageToConsole: [{
|
|
773
|
-
type: Input
|
|
774
|
-
}], postalCode: [{
|
|
775
|
-
type: Input
|
|
776
|
-
}], locality: [{
|
|
777
|
-
type: Input
|
|
778
|
-
}], inputText: [{
|
|
779
|
-
type: Input
|
|
780
|
-
}], messageOption: [{
|
|
781
|
-
type: Input
|
|
782
|
-
}], allowNoValidation: [{
|
|
783
|
-
type: Input
|
|
784
|
-
}], validatedByBackend: [{
|
|
785
|
-
type: Input
|
|
786
|
-
}], numberOfExceptions: [{
|
|
787
|
-
type: Input
|
|
788
|
-
}], inputLang: [{
|
|
789
|
-
type: Input
|
|
790
|
-
}], isReadonly: [{
|
|
791
|
-
type: Input
|
|
792
|
-
}], messageChanged: [{
|
|
793
|
-
type: Output
|
|
794
|
-
}], addressChanged: [{
|
|
795
|
-
type: Output
|
|
796
|
-
}], focusEvent: [{
|
|
797
|
-
type: Output
|
|
798
|
-
}], blurEvent: [{
|
|
799
|
-
type: Output
|
|
800
|
-
}], textChangeEvent: [{
|
|
801
|
-
type: Output
|
|
802
|
-
}], clearInputEventEmitter: [{
|
|
803
|
-
type: Output
|
|
804
|
-
}], prefillEventEmitter: [{
|
|
805
|
-
type: Output
|
|
806
|
-
}], numberOfExceptionsEmitter: [{
|
|
807
|
-
type: Output
|
|
808
|
-
}] } });
|
|
809
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQvc3JjL2xpYi9zdHJlZXQvc3RyZWV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1hZGRyZXNzLWF1dG9jb21wbGV0ZS1ieS1jb21wb25lbnQvc3JjL2xpYi9zdHJlZXQvc3RyZWV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUQsTUFBTSxlQUFlLENBQUM7QUFHN0osT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFLN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQUV4RDtJQW9GRSx5QkFDVSxjQUE4QixFQUM5QixhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsY0FBOEI7UUFIOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBOUVoQyxpQkFBWSxHQUFpQixJQUFJLENBQUM7UUFFMUMsYUFBYTtR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aW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcmVmaWxsZWRQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvcHJlZmlsbGVkLXBhcmFtZXRlcnMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlIH0gZnJvbSAnLi4vZW51bS92YWxpZGF0aW9uLW1lc3NhZ2UtdHlwZS5lbnVtJztcbmltcG9ydCB7IEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWRyZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFVuaWNvZGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdW5pY29kZS5zZXJ2aWNlJztcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICcuLi91dGlscy9kb21oYW5kbGVyJztcbmltcG9ydCB7IEFERFJFU1NMRVZFTCB9IGZyb20gJy4uL2VudW0vYWRkcmVzcy1sZXZlbC5lbnVtJztcbmltcG9ydCB7IFF1ZXJ5UGFyYW1ldGVycyB9IGZyb20gJy4uL21vZGVsL3F1ZXJ5LXBhcmFtZXRlcnMubW9kZWwnO1xuaW1wb3J0IHsgUHJlZmlsbERhdGEgfSBmcm9tICcuLi91dGlscy9wcmVmaWxsLWRhdGEnO1xuaW1wb3J0IHsgU291cmNlVHlwZSB9IGZyb20gJy4uL2VudW0vc291cmNlLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBQcmVmaWxsRXZlbnQgfSBmcm9tICcuLi91dGlscy9wcmVmbGxsLmV2ZW50JztcbmltcG9ydCB7IElucHV0TmFtZVR5cGUgfSBmcm9tICcuLi9lbnVtL2lucHV0LW5hbWUuZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JwLXN0cmVldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdHJlZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHJlZXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdHJlZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdzdHJlZXRTZWFyY2hJbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSApIHN0cmVldFNlYXJjaElucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzdHJlZXRMaXN0Jywge3N0YXRpYzogZmFsc2V9ICkgc3RyZWV0TGlzdDogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAvLyAyMDIwLTA2LTE1XG4gIC8qICBASW5wdXQoKVxuICBvbkZvY3VzU2hvd1N1Z2dlc3Rpb25zQWZ0ZXJQcmVmaWxsID0gdHJ1ZTsgKi9cblxuICBASW5wdXQoKSBsYWJlbFJlc291cmNlS2V5ID0gJ2NvbW1vbi5sYWJlbC5zdHJlZXROYW1lJztcbiAgQElucHV0KCkgbWF4U3VnZ2VzaW9uQ291bnQgPSA1O1xuICBASW5wdXQoKSB2aXNpYmxlU3VnZ2VzaW9uQ291bnQgPSA1O1xuICBASW5wdXQoKSBzb3J0Q3JpdGVyaWEgPSAnJztcbiAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nO1xuICAvLyBASW5wdXQoKSBhZGRyZXNzUGFyYW1zOiBQcmVmaWxsZWRQYXJhbWV0ZXJzO1xuICBASW5wdXQoKSBwcmVmaWxsRGF0YTogUHJlZmlsbERhdGE7XG4gIEBJbnB1dCgpIHNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHBvc3RhbENvZGU6IHN0cmluZztcbiAgQElucHV0KCkgbG9jYWxpdHk6IHN0cmluZztcbiAgQElucHV0KCkgaW5wdXRUZXh0OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgbWVzc2FnZU9wdGlvbiA9ICdZJztcbiAgQElucHV0KCkgYWxsb3dOb1ZhbGlkYXRpb246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHZhbGlkYXRlZEJ5QmFja2VuZDogYm9vbGVhbjtcbiAgQElucHV0KCkgbnVtYmVyT2ZFeGNlcHRpb25zOiBudW1iZXI7XG4gIC8vIEB0cy1pZ25vcmVcbiAgQElucHV0KCkgc2V0IGlucHV0TGFuZyh2YWw6IHN0cmluZykge1xuICAgIHRoaXMubG9jYWxlU2VydmljZS5jaGFuZ2VMYW5nKHZhbCk7XG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnVzZSh2YWwpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlZExhbmd1YWdlKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGlzUmVhZG9ubHk9ZmFsc2U7XG5cbiAgQE91dHB1dCgpIG1lc3NhZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8e21lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmd9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFkZHJlc3NDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgYmx1ckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRleHRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGNsZWFySW5wdXRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBwcmVmaWxsRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8UHJlZmlsbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8UHJlZmlsbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgbnVtYmVyT2ZFeGNlcHRpb25zRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPW5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBcbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xuXG4gIGFkZHJlc3NJc1ZhbGlkYXRlZDogYm9vbGVhbjtcbiAgc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gIHN1Z2dlc3Rpb25zOiBhbnk7XG4gIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgbGFzdFNlYXJjaFZhbHVlOiBzdHJpbmc7XG4gIHdvcmRMaXN0OiBhbnk7XG4gIHN1Z2dlc3Rpb25zV29yZExpc3Q6IGFueTtcbiAgYnBUeXBlQWhlYWQ6IHN0cmluZztcbiAgcGxhY2VIb2xkZXJUZXh0OiBzdHJpbmc7XG4gIHNraXBOZXh0Qmx1cjogYm9vbGVhbjsgLy8gT25CbHVyIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzdWdnZXN0aW9uL3ZhbGlkYXRvciBidXR0b25cbiAgZXJyb3JDb2RlOiBhbnk7XG5cbiAgbWluTGV2ZWw6IG51bWJlcjtcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICBjb2xsYXBzZURyb3Bkb3duOiBib29sZWFuO1xuICB0eXBlQWhlYWRXb3JkOiBzdHJpbmc7XG4gIHNlcXVlbmNlTnVtYmVyOiBudW1iZXI7XG4gIGNvbnN1bWVkTnVtYmVyOiBudW1iZXI7XG4gIHNlbGVjdGlvbkNoYW5nZWQ6IGJvb2xlYW47XG4gIHZhbGlkYXRpb25NZXNzYWdlQ29kZSA9IG51bGw7XG4gIHZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG5cbiAgcHJlZmlsbGluZyA9IGZhbHNlO1xuICBpc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWRkcmVzc1NlcnZpY2U6IEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1bmljb2RlU2VydmljZTogVW5pY29kZVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAvLyBpbnN0YW5jZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuc3VnZ2VzdGlvbnMgPSBbXTtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSAtMTtcbiAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMud29yZExpc3QgPSBbXTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zV29yZExpc3QgPSBbXTtcbiAgICB0aGlzLmJwVHlwZUFoZWFkID0gJyc7XG4gICAgdGhpcy5wbGFjZUhvbGRlclRleHQgPSAnJztcbiAgICB0aGlzLnNraXBOZXh0Qmx1ciA9IGZhbHNlOyAvLyBPbkJsdXIgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHN1Z2dlc3Rpb24vdmFsaWRhdG9yIGJ1dHRvblxuICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICAvLyBzY29wZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgLy8gcHJvcGVydGllc1xuICAgIHRoaXMudHlwZUFoZWFkV29yZCA9ICcnO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgPSAxO1xuICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSAxO1xuICAgIC8vIGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5zZXRTZWFyY2hUZXh0KCcnKTtcbiAgICAvLyB0aGlzLnNldFBsYWNlSG9sZGVyVGV4dCgpO1xuICAgIHRoaXMub25DaGFuZ2VkTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBvbkNoYW5nZWRMYW5ndWFnZSgpIHtcbiAgICAvLyB0aGlzLnBsYWNlSG9sZGVyVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdzdHJlZXQucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdzdHJlZXQucGxhY2Vob2xkZXIuaW5wdXQtcGxhY2Vob2xkZXInKVxuICAgICAgLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ25ldyBwbGFjZWhvbGRlcicsIHJlcyk7XG4gICAgICAgIC8vID0+ICdoZWxsbyB3b3JsZCdcbiAgICAgICAgdGhpcy5wbGFjZUhvbGRlclRleHQgPSByZXM7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCkge1xuICAgICAgY29uc3Qgb3ZlcmxheTogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnN0cmVldExpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9IERvbUhhbmRsZXIuZmluZFNpbmdsZShvdmVybGF5LCAnbGkuYWN0aXZlJyk7XG4gICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgIERvbUhhbmRsZXIuc2Nyb2xsSW5WaWV3KG92ZXJsYXksIGxpc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSwgMSk7XG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdwcmVmaWxsRGF0YScpICYmICFjaGFuZ2VzLnByZWZpbGxEYXRhLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMucHJlZmlsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMubG9hZFBhcmFtcyhjaGFuZ2VzLnByZWZpbGxEYXRhLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRleHQgIT09ICcnICYmIHRoaXMubWluTGV2ZWwgPT09IEFERFJFU1NMRVZFTC5TVFJFRVQpIHtcbiAgICAgICAgICAvKlxuICAgICAgICAgIHRoaXMub25JbnB1dENoYW5nZSgncHJlZmlsbGVkJyk7XG4gICAgICAgICAgdGhpcy5zdHJlZXRTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgKi9cbiAgICAgICAgIC8qXG4gICAgICAgICAgdGhpcy5wcmVmaWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSB0cnVlO1xuICAgICAgICAgIHRoaXMucHJlZmlsbE11bmljaXBhbGl0eU5hbWUgID0gdGhpcy50cmFuc2Zvcm1NdW5pY2lwYWxpdHlJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHRoaXMuYWRkcmVzc1BhcmFtcy5tdW5pY2lwYWxpdHlOYW1lKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyogLyAvLyB0aGlzLlNPVVJDRV9QUkVGSUxMRUQgKTtcbiAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TmFtZVxuICAgICAgICAgICAgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lKTtcbiAgICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoLyoncHJlZmlsbGVkJyovIFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdpbnB1dFRleHQnKSAmJiAhY2hhbmdlcy5pbnB1dFRleHQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMubm90RXF1YWxJZ25vcmVDYXNlKHRoaXMuc2VhcmNoVGV4dCwgY2hhbmdlcy5pbnB1dFRleHQuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBjaGFuZ2VzLmlucHV0VGV4dC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgU3RyZWV0IHNlYXJjaCBiYXIgb24gbG9jYWxpdHkgY2hhbmdlL3Jlc2V0XG4gICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgncG9zdGFsQ29kZScpICYmICFjaGFuZ2VzLnBvc3RhbENvZGUuZmlyc3RDaGFuZ2UgJiYgIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ3ByZWZpbGxEYXRhJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IEFERFJFU1NMRVZFTC5TVFJFRVQ7XG4gICAgICAgIGlmIChjaGFuZ2VzLnBvc3RhbENvZGUuY3VycmVudFZhbHVlID09PSAnJykge1xuICAgICAgICAgIHRoaXMuY2xlYXJXaWRnZXQoKTtcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhbnNmb3JtU3RyZWV0TmFtZUluTG93ZXJjYXNlQW5kV2l0aG91dERpYWNyaXRpY3Moc3RyZWV0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgPSBudWxsO1xuICAgIGlmIChzdHJlZXROYW1lICE9PSBudWxsICYmIHN0cmVldE5hbWUgIT09IHVuZGVmaW5lZCApXG4gICAge1xuICAgICAgcmVzdWx0ID0gdGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKHN0cmVldE5hbWUpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3ByZWZpbGwgc3RyZWV0TmFtZScsIHJlc3VsdCk7IH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25DbGVhcklucHV0RXZlbnQoZXZlbnQsIGZvY3VzKSB7XG4gICAgdGhpcy5jbGVhcklucHV0KGZvY3VzKTtcbiAgfVxuXG4gIG9uQmx1cihldjogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VySUUoKSAmJiB0aGlzLmlzRHJvcGRvd25DbGlja2VkKGV2KSkge1xuICAgICAgdGhpcy5zdHJlZXRTZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNraXBOZXh0Qmx1cikge1xuICAgICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gICAgfVxuICB9XG5cbiAgaXNCcm93c2VySUUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9tc2llXFxzfHRyaWRlbnRcXC98ZWRnZVxcLy9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgaXNEcm9wZG93bkNsaWNrZWQoZXYpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldi5leHBsaWNpdE9yaWdpbmFsVGFyZ2V0IHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgcmV0dXJuICh0YXJnZXQuaWQgPT09ICdicGFhYy1zdHJlZXQtZHJvcGRvd24nKTtcbiAgfVxuXG4gIG9uRm9jdXMoKSB7XG4gICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gZmFsc2U7XG4gICAgLy8gdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gKHRoaXMucHJlZmlsbGluZyA9PT0gdHJ1ZSAmJiB0aGlzLnByZWZpbGxEYXRhICE9PSBudWxsKVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgPyAhdGhpcy5wcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLm9uRm9jdXNTaG93U3VnZ2VzdGlvbnNBZnRlclByZWZpbGwgOiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3N0cmVldCBjb21wIC0gb25Gb2N1cycsIHRoaXMucHJlZmlsbGluZywgdGhpcy5wcmVmaWxsRGF0YSwgdGhpcy5jb2xsYXBzZURyb3Bkb3duKTsgfVxuXG4gICAgLy8gdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgdGhpcy5za2lwTmV4dEJsdXIgPSBmYWxzZTtcbiAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChBRERSRVNTTEVWRUwuU1RSRUVUKTtcbiAgfVxuXG4gIG1heVNob3dEcm9wZG93bigpIHtcbiAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggPiAwICYmICF0aGlzLmNvbGxhcHNlRHJvcGRvd247XG4gIH1cblxuICBidWlsZElucHV0V29yZExpc3QoKSB7XG4gICAgdGhpcy53b3JkTGlzdCA9IHRoaXMuc2VhcmNoVGV4dC5zcGxpdCgvW1xccywgXSsvKTtcbiAgICAvLyBjb25zb2xlLmxvZygnd29yZCBsaXN0IC0gc3RyZWV0OicsIHRoaXMud29yZExpc3QpO1xuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zICYmIHRoaXMud29yZExpc3QpIHtcbiAgICAgIGZvciAoY29uc3Qgc3VnIG9mIHRoaXMuc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgaWYgKCFzdWcgfHwgIXN1Zy5oYXNPd25Qcm9wZXJ0eSgnc3RyaW5nJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHcgb2YgdGhpcy53b3JkTGlzdCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyhzdWcuc3RyaW5nIGFzIHN0cmluZywgdyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCB3dyA9IHN1Zy5zdHJpbmcuc3Vic3RyKHN0YXJ0LCB3Lmxlbmd0aCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYWRkaW5nIHdvcmQ6JyArIHd3KTtcbiAgICAgICAgICAgIC8vIHd3IGlzIGEgY2FuZGlkYXRlIHRvIGJlIGFkZGVkIHRvIHRoZSB3b3JkbGlzdCBpZiBub3QgYWxyZWFkeSBwcmVzZW50IGluIGl0XG4gICAgICAgICAgICBjb25zdCBwcmVzZW50ID0gdGhpcy53b3JkTGlzdC5maW5kKCAodzE6IHN0cmluZykgID0+IHcxLnRvTG93ZXJDYXNlKCkgPT09IHd3LnRvTG93ZXJDYXNlKCkgKTtcbiAgICAgICAgICAgIGlmIChwcmVzZW50ID09PSBudWxsIHx8IHByZXNlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLndvcmRMaXN0LnB1c2god3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXJ0c1dpdGhJZ25vcmVEaWFjcml0aWNzKHZhbHVlOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBjb25zb2xlLmxvZygnU2VhcmNoaW5nIGZvciBwcmVmaXggXCInICsgcHJlZml4ICsgJ1wiIGluc2lkZSBzdWdnZXN0aW9uOiAnICsgdmFsdWUpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgY29uc3QgX3ZhbHVlID0gdGhpcy51bmljb2RlU2VydmljZS5yZW1vdmVEaWFjcml0aWNzKCAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdmFsdWUgKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuICAgIGNvbnN0IF9wcmVmaXggPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoIChwcmVmaXggIT09IG51bGwgJiYgcHJlZml4ICE9PSB1bmRlZmluZWQpID8gcHJlZml4LnRvTG93ZXJDYXNlKCkgOiBwcmVmaXgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gX3ZhbHVlLmluZGV4T2YoX3ByZWZpeCk7XG4gICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0c1dpdGhJZ25vcmVEaWFjcml0aWNzOiAnICsgc3RhcnQpO1xuICAgIHJldHVybiBzdGFydDtcbiAgfVxuXG4gIG1heUFkZFR5cGVBaGVhZCgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKC9bXlxccywgXFxcXFxcL10kLykudGVzdCh0aGlzLnNlYXJjaFRleHQpO1xuICB9XG5cbiAgdmFsdWVDaGFuZ2VkKCkge1xuICAgIHRoaXMudGV4dENoYW5nZUV2ZW50LmVtaXQodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIGJ1aWxkVHlwZUFoZWFkKHNvdXJjZTogU291cmNlVHlwZSkge1xuICAgIGlmIChzb3VyY2UgPT09IFNvdXJjZVR5cGUuU09VUkNFX1BSRUZJTExFRCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAoIXRoaXMubWF5QWRkVHlwZUFoZWFkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoVGV4dFdvcmRzID0gdGhpcy5zZWFyY2hUZXh0LnNwbGl0KC9bXFxzLCBdKy8pO1xuICAgIGNvbnN0IGxhc3RXb3JkID0gc2VhcmNoVGV4dFdvcmRzW3NlYXJjaFRleHRXb3Jkcy5sZW5ndGggLSAxXTtcblxuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLnNvbWUoZnVuY3Rpb24oc3VnKSB7XG4gICAgICBpZiAoIXN1ZyB8fCAhc3VnLmhhc093blByb3BlcnR5KCdzdHJpbmcnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VnLnN0cmluZy5zcGxpdCgvW1xccy1dKy8pLnNvbWUoZnVuY3Rpb24od29yZCkge1xuICAgICAgICBpZiAodGhpcy5zdHJpbmdTdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyh3b3JkLCBsYXN0V29yZCkpIHtcbiAgICAgICAgICB0aGlzLnR5cGVBaGVhZFdvcmQgPSB3b3JkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgIH0uYmluZCh0aGlzKSkpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGl4ID0gdGhpcy50eXBlQWhlYWRXb3JkLnNsaWNlKGxhc3RXb3JkLmxlbmd0aCwgdGhpcy50eXBlQWhlYWRXb3JkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIHRoaXMuYnBUeXBlQWhlYWQgPSB0aGlzLnNlYXJjaFRleHQgKyBhcHBlbmRpeDtcbiAgICB9XG4gIH1cblxuICBzdHJpbmdTdGFydHNXaXRoSWdub3JlRGlhY3JpdGljcyh2YWx1ZSwgcHJlZml4KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbiAgICBjb25zdCBfdmFsdWUgPSB0aGlzLnVuaWNvZGVTZXJ2aWNlLnJlbW92ZURpYWNyaXRpY3MoICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZSApO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG4gICAgY29uc3QgX3ByZWZpeCA9IHRoaXMudW5pY29kZVNlcnZpY2UucmVtb3ZlRGlhY3JpdGljcyggKHByZWZpeCAhPT0gbnVsbCAmJiBwcmVmaXggIT09IHVuZGVmaW5lZCkgPyBwcmVmaXgudG9Mb3dlckNhc2UoKSA6IHByZWZpeCk7XG4gICAgY29uc3Qgc3RhcnQgPSBfdmFsdWUuc2xpY2UoMCwgX3ByZWZpeC5sZW5ndGgpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihfcHJlZml4KSAhPT0gLTE7XG4gICAgcmV0dXJuIHN0YXJ0O1xuICB9XG5cbiAgZ2V0VG9wU3VnZ2VzdGlvbnMoc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgKz0gMTtcbiAgICBjb25zdCBwYXJhbSA9IHRoaXMuZ2VuZXJhdGVQYXJhbWV0ZXJzKCk7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnU1RSRUVUIGNhbGxpbmcgc2VydmljZSBwYXJhbXMnLCBwYXJhbSk7IH1cbiAgICBpZiAodGhpcy5zZWFyY2hUZXh0KSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuYWRkcmVzc1NlcnZpY2UuZ2V0U3RyZWV0KHRoaXMuYmFzZVVybCwgdGhpcy5sb2NhbGl0eSwgdGhpcy5wb3N0YWxDb2RlLCBwYXJhbSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUdldFN0cmVldFJlc3BvbnNlKHJlc3BvbnNlLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gU291cmNlVHlwZS5TT1VSQ0VfUFJFRklMTEVEKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aGlzLmlzUHJlZmlsbFdpdGhOb01hdGNoID0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMucHJlZmlsbEFuYWx5emVEYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRoaXMuaXNQcmVmaWxsV2l0aE5vTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLFxuICAgICAgICAgICgpID0+IHRoaXMuaGFuZGxlR2V0U3RyZWV0RXJyb3IoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBnZXRUZXh0Q29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKCB0aGlzLmlzUHJlZmlsbFdpdGhOb01hdGNoID09PSB0cnVlICkgPyAnb3JhbmdlcmVkJyA6ICcnO1xuICB9XG5cbiAgbG9hZFBhcmFtcyhwcmVmaWxsRGF0YTogUHJlZmlsbERhdGEpIHtcbiAgICBsZXQgY29uY2F0U3RyID0gJyc7XG4gICAgaWYgKHByZWZpbGxEYXRhICE9PSBudWxsICYmIHByZWZpbGxEYXRhLnBhcmFtZXRlcnMgIT09IG51bGwpXG4gICAge1xuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ21pbkxldmVsJykpIHtcbiAgICAgICAgdGhpcy5taW5MZXZlbCA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubWluTGV2ZWw7XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgndW5zdHJ1Y3R1cmVkQWRkcmVzcycpICYmIHRoaXMuaXNTdHJpbmcocGFyYW1zLnVuc3RydWN0dXJlZEFkZHJlc3MpKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgICAqL1xuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ3Bvc3RhbENvZGUnKSAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMucG9zdGFsQ29kZSkpIHtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5wb3N0YWxDb2RlO1xuICAgICAgfVxuICAgICAgaWYgKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoJ211bmljaXBhbGl0eU5hbWUnKSAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2NhbGl0eSA9IHByZWZpbGxEYXRhLnBhcmFtZXRlcnMubXVuaWNpcGFsaXR5TmFtZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVmaWxsRGF0YS5wYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KCdzdHJlZXROYW1lJylcbiAgICAgICAgICAmJiB0aGlzLmlzU3RyaW5nKHByZWZpbGxEYXRhLnBhcmFtZXRlcnMuc3RyZWV0TmFtZSkgJiYgdGhpcy5pc1BhcmFtc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgY29uY2F0U3RyID0gcHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uY2F0U3RyO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yID09PSBTdHJpbmc7XG4gIH1cblxuICBpc1ZhbGlkKHZhbCkge1xuICAgIHJldHVybiB0aGlzLmlzU3RyaW5nKHZhbCkgJiYgdmFsICE9PSAnJztcbiAgfVxuXG4gIGlzUGFyYW1zQ29tcGxldGUoKTogYm9vbGVhbiB7XG4gICAgaWYoIXRoaXMudmFsaWRhdGVkQnlCYWNrZW5kKXtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQodGhpcy5wb3N0YWxDb2RlKSB8fCB0aGlzLmlzVmFsaWQodGhpcy5sb2NhbGl0eSk7XG4gICAgfWVsc2V7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKHRoaXMucG9zdGFsQ29kZSkgJiYgdGhpcy5pc1ZhbGlkKHRoaXMubG9jYWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUGFyYW1ldGVycygpOiBRdWVyeVBhcmFtZXRlcnMge1xuICAgIGNvbnN0IHBhcmFtID0gbmV3IFF1ZXJ5UGFyYW1ldGVycyh7XG4gICAgICBpZDogdGhpcy5zZXF1ZW5jZU51bWJlcixcbiAgICAgIHE6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIHBvc3RhbENvZGU6IHRoaXMucG9zdGFsQ29kZSxcbiAgICAgIGxvY2FsaXR5OiB0aGlzLmxvY2FsaXR5LFxuICAgICAgbWF4TnVtYmVyT2ZTdWdnZXN0aW9uczogdGhpcy5tYXhTdWdnZXNpb25Db3VudFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc29ydENyaXRlcmlhID09PSAnUycpIHtcbiAgICAgIHBhcmFtLnNvcnRCeVN0cmVldCh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtO1xuICB9XG5cbiAgaGFuZGxlR2V0U3RyZWV0UmVzcG9uc2UoZGF0YTogYW55LCBzb3VyY2U/OiBTb3VyY2VUeXBlKSB7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5yZXNwb25zZSAmJiBkYXRhLnJlc3BvbnNlLnNlcXVlbmNlTnVtYmVyICYmIGRhdGEucmVzcG9uc2Uuc2VxdWVuY2VOdW1iZXIgPj0gdGhpcy5jb25zdW1lZE51bWJlciAmJlxuICAgICAgZGF0YS5yZXNwb25zZS50b3BTdWdnZXN0aW9ucykge1xuICAgICAgdGhpcy5jb25zdW1lZE51bWJlciA9IGRhdGEucmVzcG9uc2Uuc2VxdWVuY2VOdW1iZXI7XG4gICAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvbnMoKTtcbiAgICAgIHRoaXMucGFyc2VUb3BTdWdnZXN0aW9ucyhkYXRhLnJlc3BvbnNlLnRvcFN1Z2dlc3Rpb25zLCBzb3VyY2UpO1xuICAgICAgdGhpcy5idWlsZFR5cGVBaGVhZChzb3VyY2UpO1xuICAgICAgdGhpcy5jbGVhckNvbm5lY3Rpb25FcnJvck1lc3NhZ2UoKTtcbiAgICAgIHRoaXMuYnVpbGRJbnB1dFdvcmRMaXN0KCk7XG4gICAgfVxuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9ICh0aGlzLnByZWZpbGxpbmcgPT09IHRydWUgJiYgdGhpcy5wcmVmaWxsRGF0YSAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICF0aGlzLnByZWZpbGxEYXRhLnBhcmFtZXRlcnMub25Gb2N1c1Nob3dTdWdnZXN0aW9uc0FmdGVyUHJlZmlsbCA6IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlR2V0U3RyZWV0RXJyb3IoKSB7XG4gICAgaWYodGhpcy5hbGxvd05vVmFsaWRhdGlvbiAmJiB0aGlzLnZhbGlkYXRlZEJ5QmFja2VuZCl7XG4gICAgICB0aGlzLm51bWJlck9mRXhjZXB0aW9ucys9MTtcbiAgICAgIHRoaXMubnVtYmVyT2ZFeGNlcHRpb25zRW1pdHRlci5lbWl0KHRoaXMubnVtYmVyT2ZFeGNlcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5zZXRDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gIH1cblxuICBzZXRDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIHRoaXMuZXJyb3JDb2RlID0gLyonc2VydmljZS11bmF2YWlsYWJsZScqLyBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuU2VydmljZV9VbmF2YWlsYWJsZTtcbiAgICAvLyB0aGlzLnNldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuZXJyb3JDb2RlKTtcbiAgICB0aGlzLmVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGUpO1xuICB9XG5cbiAgY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCkge1xuICAgIGlmICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY29uc3QgcmVzID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5lcnJvckNvZGUpO1xuICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlID09PSByZXMgKSB7XG4gICAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JDb2RlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwYXJzZVRvcFN1Z2dlc3Rpb25zKHRvcFN1Z2dlc3Rpb25zLCBzb3VyY2U6IFNvdXJjZVR5cGUpIHtcbiAgICBpZiAodG9wU3VnZ2VzdGlvbnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICAvLyB0b3BTdWdnZXN0aW9ucy5mb3JFYWNoKHRoaXMucGFyc2VTaW5nbGVTdWdnZXN0aW9uLmJpbmQodGhpcykpO1xuICAgICAgZm9yIChjb25zdCBzdWcgb2YgdG9wU3VnZ2VzdGlvbnMpXG4gICAgICB7XG4gICAgICAgIHRoaXMucGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Zywgc291cmNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJzZVNpbmdsZVN1Z2dlc3Rpb24odG9wU3VnZ2VzdGlvbnMsIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VTaW5nbGVTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IGFueSwgc291cmNlOiBTb3VyY2VUeXBlKSB7XG4gICAgbGV0IHN1Z2dlc3Rpb25Ub0FkZDogYW55O1xuICAgIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVGcmVuY2goKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdmcmVuY2gnKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5mcmVuY2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVEdXRjaCgpICYmIHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2R1dGNoJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uZHV0Y2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsZVNlcnZpY2UuaXNMb2NhbGVHZXJtYW4oKSAmJiBzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdnZXJtYW4nKSkge1xuICAgICAgc3VnZ2VzdGlvblRvQWRkID0gc3VnZ2VzdGlvbi5nZXJtYW47XG4gICAgfSBlbHNlIGlmIChzdWdnZXN0aW9uLmhhc093blByb3BlcnR5KCdhZGRyZXNzJykpIHtcbiAgICAgIHN1Z2dlc3Rpb25Ub0FkZCA9IHN1Z2dlc3Rpb24uYWRkcmVzcztcbiAgICB9XG4gICAgaWYgKHN1Z2dlc3Rpb25Ub0FkZCkge1xuICAgICAgaWYgKHN1Z2dlc3Rpb24ubWVzc2FnZXMpIHtcbiAgICAgICAgc3VnZ2VzdGlvblRvQWRkLm1lc3NhZ2VzID0gc3VnZ2VzdGlvbi5tZXNzYWdlcztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3VnZ2VzdGlvbnMucHVzaChzdWdnZXN0aW9uVG9BZGQpO1xuICAgICAgaWYgKHNvdXJjZSA9PT0gU291cmNlVHlwZS5TT1VSQ0VfUFJFRklMTEVEKVxuICAgICAge1xuICAgICAgICBzdWdnZXN0aW9uLmFkZHJlc3MgPSBzdWdnZXN0aW9uVG9BZGQ7XG4gICAgICAgIHRoaXMucHJlZmlsbENoZWNrRm9yUGVyZmVjdE1hdGNoKHN1Z2dlc3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByZWZpbGxDaGVja0ZvclBlcmZlY3RNYXRjaChzdWdnZXN0aW9uKVxuICB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkge2NvbnNvbGUubG9nKCdzdHJlZXQgLSBjaGVja2luZyBzdWdnZXN0aW9uIGZvciBwZXJmZWN0IG1hdGNoJywgdGhpcy5wcmVmaWxsRGF0YSwgc3VnZ2VzdGlvbik7IH1cbiAgICBjb25zdCBzdWdBZGRyZXNzID0gc3VnZ2VzdGlvbi5hZGRyZXNzO1xuICAgIC8vIGlmIChzdWdBZGRyZXNzLnN0cmVldE5hbWUgPT09IHRoaXMucHJlZmlsbERhdGEucGFyYW1ldGVycy5zdHJlZXROYW1lIClcbiAgICBjb25zdCBzdWdnZXN0aW9uTG9jYWxpdHkgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHN1Z0FkZHJlc3MubG9jYWxpdHlOYW1lKTtcbiAgICBjb25zdCBzdWdnZXN0aW9uTXVuaWNpcGFsaXR5ID0gdGhpcy50cmFuc2Zvcm1TdHJlZXROYW1lSW5Mb3dlcmNhc2VBbmRXaXRob3V0RGlhY3JpdGljcyhzdWdBZGRyZXNzLm11bmljaXBhbGl0eU5hbWUpO1xuICAgIGlmIChzdWdnZXN0aW9uTG9jYWxpdHkgPT09IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eU5hbWVcbiAgICAgIHx8IHN1Z2dlc3Rpb25NdW5pY2lwYWxpdHkgPT09IHRoaXMucHJlZmlsbERhdGEucHJlZmlsbE11bmljaXBhbGl0eU5hbWUpXG4gICAge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvblN0cmVldE5hbWUgPSB0aGlzLnRyYW5zZm9ybVN0cmVldE5hbWVJbkxvd2VyY2FzZUFuZFdpdGhvdXREaWFjcml0aWNzKHN1Z0FkZHJlc3Muc3RyZWV0TmFtZSk7XG4gICAgICAvLyBjb25zb2xlLmxvZygnY29tcGFyaW5nIHN0cmVldCBuYW1lcycsIHN1Z2dlc3Rpb25TdHJlZXROYW1lLCB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXROYW1lKTtcbiAgICAgIGlmIChzdWdnZXN0aW9uU3RyZWV0TmFtZSA9PT0gdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0TmFtZSlcbiAgICAgIHtcbiAgICAgICAgdGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZWZpbGxEYXRhLnByZWZpbGxTdHJlZXRQZXJmZWN0TWF0Y2hTdWdnZXN0aW9uID0gc3VnZ2VzdGlvbjtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc3VnQWRkcmVzcy5zdHJlZXROYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgID09PSB0cnVlKVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdTVFJFRVQgLSBQUkVGSUxMIC0gUGVyZmVjdCBtYXRjaCAtIHN0cmVldDonLCBzdWdnZXN0aW9uKTsgfVxuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAge1xuICAgICAgICBpZiAodGhpcy5zaG93RGVidWdNZXNzYWdlVG9Db25zb2xlKSB7IGNvbnNvbGUubG9nKCdTVFJFRVQgLSBQUkVGSUxMIC0gTk8gUGVyZmVjdCBtYXRjaDonLCBzdWdnZXN0aW9uKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRDaGFuZ2Uoc291cmNlPzogU291cmNlVHlwZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdzdHJlZXQgb25JbnB1dENoYW5nZSA6IHNvdXJjZSAnLCBzb3VyY2UpO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgdGhpcy5wcmVmaWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyU3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKCk7XG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXIgKz0gMTtcbiAgICAgIHRoaXMuY29uc3VtZWROdW1iZXIgPSB0aGlzLnNlcXVlbmNlTnVtYmVyO1xuICAgICAgdGhpcy5jbGVhclN1Z2dlc3Rpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLnZhbGlkYXRlZEJ5QmFja2VuZCl7XG4gICAgICAgIGxldCBzdWdnZXN0aW9uID0ge1xuICAgICAgICAgICdzdHJpbmcnOiB0aGlzLnNlYXJjaFRleHQudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAnbXVuaWNpcGFsaXR5TmFtZSc6IHRoaXMubG9jYWxpdHkgPyB0aGlzLmxvY2FsaXR5LnRvTG9jYWxlVXBwZXJDYXNlKCkgOicnLFxuICAgICAgICAgICdsb2NhbGl0eU5hbWUnOiB0aGlzLmxvY2FsaXR5ID8gdGhpcy5sb2NhbGl0eS50b0xvY2FsZVVwcGVyQ2FzZSgpIDonJyxcbiAgICAgICAgICAncG9zdGFsQ29kZSc6IHRoaXMucG9zdGFsQ29kZSxcbiAgICAgICAgICAnc2VhcmNoQmFyU3RyaW5nJzogdGhpcy5zZWFyY2hUZXh0LnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgJ3N0cmVldE5hbWUnOiB0aGlzLnNlYXJjaFRleHQudG9VcHBlckNhc2UoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRBZGRyZXNzKHN1Z2dlc3Rpb24pO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHRoaXMuZ2V0VG9wU3VnZ2VzdGlvbnMoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWlsZElucHV0V29yZExpc3QoKTtcbiAgfVxuXG4gIHByZWZpbGxBbmFseXplRGF0YSgpXG4gIHtcbiAgICBpZiAodGhpcy5wcmVmaWxsRGF0YS5wcmVmaWxsU3RyZWV0UGVyZmVjdE1hdGNoRm91bmQgPT09IHRydWUpXG4gICAge1xuICAgICAgdGhpcy5jb2xsYXBzZURyb3Bkb3duID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wcmVmaWxsRXZlbnRFbWl0dGVyLmVtaXQobmV3IFByZWZpbGxFdmVudChBRERSRVNTTEVWRUwuU1RSRUVULCB0aGlzLnByZWZpbGxEYXRhKSApO1xuICB9XG5cblxuICBjbGlja1N1Z2dlc3Rpb24oZXZlbnQ6IGFueSwgc3VnZ2VzdGlvbjogYW55KSB7XG4gICAgdGhpcy5pc1ByZWZpbGxXaXRoTm9NYXRjaCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNob3dEZWJ1Z01lc3NhZ2VUb0NvbnNvbGUpIHsgY29uc29sZS5sb2coJ3N0cmVldE51bWJlcjo6Y2xpY2tTdWdnZXN0aW9uJywgZXZlbnQsIHN1Z2dlc3Rpb24pOyB9XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICB0aGlzLnNldFNlYXJjaFRleHQoc3VnZ2VzdGlvbi5zdHJpbmcpO1xuICAgIHRoaXMuY29sbGFwc2VEcm9wZG93biA9IHRydWU7XG4gICAgLy8gaWYgKHN1Z2dlc3Rpb24uaGFzT3duUHJvcGVydHkoJ2lzQ29tcGxldGUnKSkge1xuICAgIC8vICAgdGhpcy5zaG93QWRkcmVzc0lzVmFsaWRhdGVkKCk7XG4gICAgLy8gfVxuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLnNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkQWRkcmVzcyhzdWdnZXN0aW9uOiBhbnkpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQoc3VnZ2VzdGlvbik7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkQWRkcmVzcygpIHtcbiAgICB0aGlzLmFkZHJlc3NDaGFuZ2VkLmVtaXQobnVsbCk7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGVtaXRUcmFuc2xhdGVkVmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2VUeXBlOiBWYWxpZGF0aW9uTWVzc2FnZVR5cGUsIG9wdGlvbnM/OiBzdHJpbmdbXSkge1xuICAgIC8vIE1vbWVudGx5LCBvcHRpb25zIGFyZSBOT1QgdXNlZDsgc28gZGF0YSB0eXBlIG9mIHRoZXNlIG9wdGlvbnMgd2lsbCBiZSByZXZpZXdlZCBvbmNlIG5lZWRlZC5cbiAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VUeXBlID09PSBudWxsIHx8IHZhbGlkYXRpb25NZXNzYWdlVHlwZSA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gZW1pdCB2YWxpZGF0aW9uIG1lc3NhZ2UgLSBtZXNzYWdlIGtleSBpcyBpbnZhbGlkIScsIHZhbGlkYXRpb25NZXNzYWdlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh2YWxpZGF0aW9uTWVzc2FnZVR5cGUpIHtcblxuICAgICAgY2FzZSBWYWxpZGF0aW9uTWVzc2FnZVR5cGUuQWRkcmVzc19Ob3RfRm91bmQ6XG4gICAgICBjYXNlIFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX1ZhbGlkYXRlZDpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbk1lc3NhZ2VUeXBlLlNlcnZpY2VfVW5hdmFpbGFibGU6IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodmFsaWRhdGlvbk1lc3NhZ2VUeXBlKTtcbiAgICAgICAgICAvLyB0aGlzLm1lc3NhZ2VDaGFuZ2VkLmVtaXQobWVzc2FnZSk7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHttZXNzYWdlVHlwZTogdmFsaWRhdGlvbk1lc3NhZ2VUeXBlLCB0cmFuc2xhdGVkTWVzc2FnZTogbWVzc2FnZX0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTphbGlnblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBlbWl0IHZhbGlkYXRpb24gbWVzc2FnZSAtIG1lc3NhZ2Uga2V5IE5PVCBzdXBwb3J0ZWQhJywgdmFsaWRhdGlvbk1lc3NhZ2VUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gIH1cblxuICBzaG93QWRkcmVzc0lzVmFsaWRhdGVkKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3MtdmFsaWRhdGVkJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX1ZhbGlkYXRlZCk7XG4gIH1cblxuICBjaGVja0tleURvd24oZXZlbnQpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAvLyBkb3duIGtleSwgaW5jcmVtZW50IHNlbGVjdGVkSW5kZXhcbiAgICAgIGNhc2UgNDA6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUFycm93U2VsZWN0ZWRJbmRleERvd24oKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIHVwIGtleSwgZGVjcmVtZW50IHNlbGVjdGVkSW5kZXhcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUFycm93U2VsZWN0ZWRJbmRleFVwKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gcmlnaHQgYXJyb3cga2V5XG4gICAgICBjYXNlIDM5OlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5jdXJzb3JJc09uU3VnZ2VzdGlvbkxpc3QoKSkge1xuICAgICAgICAgIHRoaXMuY2xpY2tTdWdnZXN0aW9uKGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGVBaGVhZFdvcmQgJiYgdGhpcy50eXBlQWhlYWRJc1Nob3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dCh0aGlzLmJwVHlwZUFoZWFkKTtcbiAgICAgICAgICAgIHRoaXMudHlwZUFoZWFkV29yZCA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIC8vIHRhYiBrZXlcbiAgICAgIGNhc2UgOTpcbiAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NJc1ZhbGlkYXRlZCAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0Rmlyc3RJbkxpc3RPZlN1Z2dlc2lvbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSA0NjpcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyV2lkZ2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBlbnRlciBwcmVzc2VkXG4gICAgICBjYXNlIDEzOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5jdXJzb3JJc09uU3VnZ2VzdGlvbkxpc3QoKSkge1xuICAgICAgICAgIHRoaXMuY2xpY2tTdWdnZXN0aW9uKGV2ZW50LCB0aGlzLnN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmNsZWFyVHlwZUFoZWFkKCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgfVxuICB9XG5cbiAgY2xlYXJXaWRnZXQoKSB7XG4gICAgdGhpcy5hZGRyZXNzSXNWYWxpZGF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyU2VhcmNoVGV4dCgpO1xuICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9ucygpO1xuICAgIHRoaXMuY2xlYXJUeXBlQWhlYWQoKTtcbiAgICB0aGlzLnByZWZpbGxEYXRhID0gbnVsbDtcbiAgICB0aGlzLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoVGV4dCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgfVxuXG4gIHR5cGVBaGVhZElzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYnBUeXBlQWhlYWQgJiYgdGhpcy5icFR5cGVBaGVhZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgcmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cblxuICBtb3ZlQXJyb3dTZWxlY3RlZEluZGV4RG93bigpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ICsgMSAhPT0gdGhpcy5zdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCsrO1xuICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVBcnJvd1NlbGVjdGVkSW5kZXhVcCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4IC0gMSAhPT0gLTIpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleC0tO1xuICAgICAgdGhpcy5jaGFuZ2VTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvcklzT25TdWdnZXN0aW9uTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEluZGV4ID49IDA7XG4gIH1cblxuICBzZXRTZWFyY2hUZXh0QmFzZWRPbkFycm93U2VsZWN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7XG4gICAgaWYgKG5ld1ZhbCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuc3VnZ2VzdGlvbnMubGVuZ3RoIDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5ld1ZhbCAhPT0gLTEpIHtcbiAgICAgIGlmIChvbGRWYWwgPT09IC0xKSB7XG4gICAgICAgIHRoaXMubGFzdFNlYXJjaFZhbHVlID0gdGhpcy5zZWFyY2hUZXh0O1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRTZWFyY2hUZXh0KHRoaXMuc3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS5zdHJpbmcpO1xuICAgICAgdGhpcy5jbGVhclR5cGVBaGVhZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFNlYXJjaFRleHQodGhpcy5sYXN0U2VhcmNoVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG1heVNob3dDbGVhckJ1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBjbGVhcklucHV0KGZvY3VzPywgZW1pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBjb25zb2xlLndhcm4oJ3N0cmVldCBjbGVhcklucHV0IGNhbGxlZCAuLi4nLCBmb2N1cywgZW1pdCk7XG4gICAgdGhpcy5jbGVhcldpZGdldCgpO1xuICAgIHRoaXMucmVzZXRBcnJvd1NlbGVjdGVkSW5kZXgoKTtcbiAgICB0aGlzLnByZXZpb3VzSW5kZXggPSAtMTtcbiAgICB0aGlzLmxhc3RTZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuY2xlYXJTdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMuY2xlYXJDb25uZWN0aW9uRXJyb3JNZXNzYWdlKCk7XG4gICAgaWYgKGZvY3VzID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLndhcm4oJ3N0cmVldCBjbGVhcklucHV0IC0gc2V0IGZvY3VzICEhIScsIGZvY3VzKTtcbiAgICAgIHRoaXMuc3RyZWV0U2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5jbGVhcklucHV0RXZlbnRFbWl0dGVyLmVtaXQoLyonU1RSRUVUJyovIElucHV0TmFtZVR5cGUuU1RSRUVUKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclN1Z2dlc3Rpb25zKCkge1xuICAgIHRoaXMud29yZExpc3QgPSBbXTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5zdWdnZXN0aW9uc1dvcmRMaXN0ID0gW107XG4gIH1cblxuICBjbGVhclR5cGVBaGVhZCgpIHtcbiAgICB0aGlzLmJwVHlwZUFoZWFkID0gJyc7XG4gIH1cblxuICBjbGVhclN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSgpIHtcbiAgICB0aGlzLnN1Z2dlc3Rpb25WYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIHRoaXMuYWRkcmVzc0lzVmFsaWRhdGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5tZXNzYWdlQ2hhbmdlZC5lbWl0KHRoaXMuc3VnZ2VzdGlvblZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICB0aGlzLm1lc3NhZ2VDaGFuZ2VkLmVtaXQoe21lc3NhZ2VUeXBlOiBudWxsLCB0cmFuc2xhdGVkTWVzc2FnZTogdGhpcy5zdWdnZXN0aW9uVmFsaWRhdGlvbk1lc3NhZ2V9KTtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlT3B0aW9ucyA9IG51bGw7XG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZUNvZGUgPSBudWxsO1xuICB9XG5cbiAgc2V0U2VhcmNoVGV4dCh2YWx1ZSkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IHZhbHVlO1xuICB9XG5cbiAgc2VsZWN0Rmlyc3RJbkxpc3RPZlN1Z2dlc2lvbnMoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICB0aGlzLmNoYW5nZVNlbGVjdGlvbigpO1xuICAgIHRoaXMuc2V0U2VhcmNoVGV4dEJhc2VkT25BcnJvd1NlbGVjdGlvbih0aGlzLnNlbGVjdGVkSW5kZXgsIHRoaXMuc2VsZWN0ZWRJbmRleCAtIDEpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc3VnZ2VzdGlvbk1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cblxuICBub3RFcXVhbElnbm9yZUNhc2Uob2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG9sZFZhbC50b0xvd2VyQ2FzZSgpICE9PSBuZXdWYWwudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHNob3dBZGRyZXNzTm90Rm91bmRNZXNzYWdlKCkge1xuICAgIC8vIHRoaXMuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoJ2FkZHJlc3Mtbm90LWZvdW5kJyk7XG4gICAgdGhpcy5lbWl0VHJhbnNsYXRlZFZhbGlkYXRpb25NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlVHlwZS5BZGRyZXNzX05vdF9Gb3VuZCk7XG4gIH1cblxuICBpc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiAodGhpcy5sb2NhbGl0eSA9PT0gJycgfHwgdGhpcy5wb3N0YWxDb2RlID09PSAnJyB8fCB0aGlzLm1pbkxldmVsID4gQUREUkVTU0xFVkVMLlNUUkVFVCk7XG4gIH1cblxuICBvbklucHV0Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuc2hvd0RlYnVnTWVzc2FnZVRvQ29uc29sZSkgeyBjb25zb2xlLmxvZygnc3RyZWV0IGNsaWNrJyk7IH1cbiAgICB0aGlzLnByZWZpbGxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNvbGxhcHNlRHJvcGRvd24gPSBmYWxzZTtcbiAgfVxuXG59XG4iLCI8c3BhbiAqbmdJZj1cImxhYmVsUmVzb3VyY2VLZXlcIj57eyBsYWJlbFJlc291cmNlS2V5IHwgdHJhbnNsYXRlfX08L3NwYW4+XG48ZGl2IGNsYXNzPVwiYnBhYWMtZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiYnBhYWMtc2VhcmNoLWJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnBhYWMtaW5wdXQtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIiAtLT5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICNzdHJlZXRTZWFyY2hJbnB1dCBjbGFzcz1cImJwYWFjLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiIWlzUGFyYW1zQ29tcGxldGUoKSA/ICdsaWdodGdyZXknIDogJydcIiBcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIiBnZXRUZXh0Q29sb3IoKSBcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKHZhbGlkYXRlZEJ5QmFja2VuZCAmJiAoIWxvY2FsaXR5IHx8IGxvY2FsaXR5LnRyaW0oKS5sZW5ndGggPT09IDApKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIXZhbGlkYXRlZEJ5QmFja2VuZCAmJiAoKCFwb3N0YWxDb2RlIHx8IHBvc3RhbENvZGUudHJpbSgpLmxlbmd0aCA9PT0gMCkgJiYgKCFsb2NhbGl0eSB8fCBsb2NhbGl0eS50cmltKCkubGVuZ3RoID09PSAwKSkpXCIgKGtleWRvd24pPVwiY2hlY2tLZXlEb3duKCRldmVudClcIiBcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uSW5wdXRDaGFuZ2UoKVwiIChjbGljayk9XCJvbklucHV0Q2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIGlkPVwic3RyZWV0SW5wdXRGaWVsZFwiIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyVGV4dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIC8+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiYnBhYWMtY2xlYXItc3RyZWV0LWJ1dHRvblwiICpuZ0lmPVwibWF5U2hvd0NsZWFyQnV0dG9uKClcIiAoY2xpY2spPVwiY2xlYXJJbnB1dCh0cnVlKVwiIGNsYXNzPVwiYnBhYWMtY2xlYXJcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLTxkaXYgbmctdHJhbnNjbHVkZT48L2Rpdj4tLT5cbiAgICAgICAgPGlucHV0IGlkPVwiYnBhYWMtc3RyZWV0LXR5cGVhaGVhZFwiIHR5cGU9XCJ0ZXh0XCIgZGlzYWJsZWQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgWyhuZ01vZGVsKV09XCJicFR5cGVBaGVhZFwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBbaGlkZGVuXT1cImNvbGxhcHNlRHJvcGRvd25cIiBjbGFzcz1cImJwYWFjLWRyb3Bkb3duLW1lbnUtY29udGFpbmVyXCIgKm5nSWY9XCJzdWdnZXN0aW9ucyAmJiBzdWdnZXN0aW9ucy5sZW5ndGg+MFwiPlxuICAgICAgICA8ZGl2ICNzdHJlZXRMaXN0IFthcHBWaXNpYmxlU3VnZ2VzdGlvbl09XCJ2aXNpYmxlU3VnZ2VzaW9uQ291bnRcIiBpZD1cImJwYWFjLXN0cmVldC1kcm9wZG93blwiIGNsYXNzPVwiYnBhYWMtZHJvcGRvd24tbWVudVwiPlxuICAgICAgICAgICAgPHVsIHJvbGU9XCJsaXN0Ym94XCIgaWQ9XCJicGFhYy1zdHJlZXQtc3VnZ2VzdGlvbnNMaXN0XCIgY2xhc3M9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgICAgICAgICAgICAgPGxpIHJvbGU9XCJvcHRpb25cIiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN1Z2dlc3Rpb25zOyBsZXQgaWR4ID0gaW5kZXhcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6KHNlbGVjdGVkSW5kZXg9PWlkeCl9XCIgKG1vdXNlZG93bik9XCJjbGlja1N1Z2dlc3Rpb24oJGV2ZW50LCBvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3RlZEluZGV4PWlkeFwiIChtb3VzZWxlYXZlKT1cInNlbGVjdGVkSW5kZXg9LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJvcHRpb25cIiBbaW5uZXJIdG1sXT1cIm9wdGlvbi5zdHJpbmcgfCBoaWdobGlnaHRTdWdnZXN0aW9uIDogd29yZExpc3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|