@glowgreen/gg-questionnaire-v2 0.0.14 → 0.0.16

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.
@@ -15,6 +15,7 @@ var QuestionnaireService = /** @class */ (function () {
15
15
  this.formConstuctor = formConstuctor;
16
16
  this.options = options;
17
17
  this.dataChangedEvent = new EventEmitter();
18
+ this.sectionFinishedEvent = new EventEmitter();
18
19
  this.skippable = true;
19
20
  }
20
21
  /**
@@ -158,6 +159,38 @@ var QuestionnaireService = /** @class */ (function () {
158
159
  enumerable: true,
159
160
  configurable: true
160
161
  });
162
+ Object.defineProperty(QuestionnaireService.prototype, "isFirstQuestion", {
163
+ get: /**
164
+ * @return {?}
165
+ */
166
+ function () {
167
+ if (!this.currentSection || !this.currentQuestion) {
168
+ return false;
169
+ }
170
+ /** @type {?} */
171
+ var currentIndex = this.currentSection.data.questions.indexOf(this.currentQuestion.data);
172
+ return currentIndex === 0;
173
+ },
174
+ enumerable: true,
175
+ configurable: true
176
+ });
177
+ Object.defineProperty(QuestionnaireService.prototype, "isLastQuestion", {
178
+ get: /**
179
+ * @return {?}
180
+ */
181
+ function () {
182
+ if (!this.currentSection || !this.currentQuestion) {
183
+ return false;
184
+ }
185
+ /** @type {?} */
186
+ var currentIndex = this.currentSection.data.questions.indexOf(this.currentQuestion.data);
187
+ /** @type {?} */
188
+ var maxIndex = this.currentSection.data.questions.length - 1;
189
+ return currentIndex === maxIndex;
190
+ },
191
+ enumerable: true,
192
+ configurable: true
193
+ });
161
194
  /**
162
195
  * @param {?} name
163
196
  * @return {?}
@@ -385,6 +418,14 @@ var QuestionnaireService = /** @class */ (function () {
385
418
  * @return {?}
386
419
  */
387
420
  function (currentIndex) {
421
+ /** @type {?} */
422
+ var lastQuestionIndex = _this.currentSection.data.questions.length - 1;
423
+ /** @type {?} */
424
+ var isLastQuestion = lastQuestionIndex === currentIndex;
425
+ if (isLastQuestion) {
426
+ _this.sectionFinishedEvent.emit();
427
+ return;
428
+ }
388
429
  /** @type {?} */
389
430
  var newIndex = currentIndex + 1;
390
431
  _this.navigateToQuestion(newIndex).then((/**
@@ -723,15 +764,23 @@ var QuestionnaireService = /** @class */ (function () {
723
764
  */
724
765
  function (answer, sendToNextQuestion) {
725
766
  var _this = this;
726
- this.currentQuestion.formControl.setValue(answer);
727
- if (sendToNextQuestion && this.skippable) { // Timeout to prevent skipping glitch.
767
+ if (!sendToNextQuestion) {
768
+ this.currentQuestion.formControl.setValue(answer);
769
+ return;
770
+ }
771
+ if (this.skippable) { // Timeout to prevent skipping glitch.
728
772
  this.skippable = false;
729
773
  setTimeout((/**
730
774
  * @return {?}
731
775
  */
732
776
  function () {
733
- _this.nextQuestion();
734
- _this.skippable = true;
777
+ _this.currentQuestion.formControl.setValue(answer);
778
+ _this.nextQuestion().then((/**
779
+ * @return {?}
780
+ */
781
+ function () {
782
+ _this.skippable = true;
783
+ }));
735
784
  }), 150);
736
785
  }
737
786
  };
@@ -894,6 +943,8 @@ export { QuestionnaireService };
894
943
  if (false) {
895
944
  /** @type {?} */
896
945
  QuestionnaireService.prototype.dataChangedEvent;
946
+ /** @type {?} */
947
+ QuestionnaireService.prototype.sectionFinishedEvent;
897
948
  /**
898
949
  * @type {?}
899
950
  * @private
@@ -950,4 +1001,4 @@ if (false) {
950
1001
  */
951
1002
  QuestionnaireService.prototype.options;
952
1003
  }
953
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb25uYWlyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdsb3dncmVlbi9nZy1xdWVzdGlvbm5haXJlLXYyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3F1ZXN0aW9ubmFpcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVwRSxPQUFPLEVBQThCLFNBQVMsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBSXBGLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7O0FBRTNEO0lBcUJFLDhCQUNVLGNBQXNDLEVBQ25CLE9BQTZCO1FBRGhELG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQW5CbkQscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFlN0QsY0FBUyxHQUFHLElBQUksQ0FBQztJQUtyQixDQUFDO0lBRUw7Ozs7OztPQU1HOzs7Ozs7Ozs7SUFDVSxnREFBaUI7Ozs7Ozs7O0lBQTlCLFVBQStCLGFBQTRCLEVBQUUsVUFBbUIsRUFBRSxjQUF1Qjs7Ozs7Ozt3QkFDdkcsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUV2RCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQzt3QkFFckMsSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FB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QUFhLENBQUEsNENBQUEsdUVBQUU7Z0JBQXJDLElBQU0sWUFBWSwwQkFBQTtnQkFDckIsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFOzt3QkFDM0IsSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQzs7d0JBQzVDLElBQUksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzs7d0JBQzdCLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHO29CQUMzQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQjtxQkFBTTtvQkFDTCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNqQzthQUNGOzs7Ozs7Ozs7O1lBRUssT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3RDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O2dCQXplRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7O2dCQVpRLHNCQUFzQjtnREFpQzFCLE1BQU0sU0FBQyxTQUFTOzs7K0JBbENyQjtDQXFmQyxBQTFlRCxJQTBlQztTQXZlWSxvQkFBb0I7OztJQUMvQixnREFBcUU7Ozs7O0lBRXJFLHFEQUE2Qzs7Ozs7SUFFN0Msb0RBQTRDOzs7OztJQUM1Qyx3REFBNEM7Ozs7O0lBRTVDLGtEQUFtQzs7Ozs7SUFDbkMsbURBQW9DOzs7OztJQUVwQyxvRUFBMkQ7Ozs7O0lBQzNELCtEQUFzRDs7Ozs7SUFFdEQsOENBQStCOzs7OztJQUUvQix5Q0FBeUI7Ozs7O0lBR3ZCLDhDQUE4Qzs7Ozs7SUFDOUMsdUNBQXdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db25zdHJ1Y3RvclNlcnZpY2UgfSBmcm9tICcuL2Zvcm0tY29uc3RydWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBRdWVzdGlvbm5haXJlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbm5haXJlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2VjdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VjdGlvbic7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb24nO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBRdWVzdGlvbm5haXJlT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb25uYWlyZS1vcHRpb25zJztcbmltcG9ydCB7IFF1ZXN0aW9uVHlwZSB9IGZyb20gJy4uL2VudW1zL3F1ZXN0aW9uLXR5cGUuZW51bSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9ubmFpcmVTZXJ2aWNlIHtcbiAgcHVibGljIGRhdGFDaGFuZ2VkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHJpdmF0ZSBvcmlnaW5hbFF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmU7XG5cbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb25uYWlyZTogUXVlc3Rpb25uYWlyZTtcbiAgcHJpdmF0ZSBjdXJyZW50UXVlc3Rpb25uYWlyZUZvcm06IEZvcm1Hcm91cDtcblxuICBwcml2YXRlIGN1cnJlbnRTZWN0aW9uTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGN1cnJlbnRRdWVzdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBwcml2YXRlIGFkZGl0aW9uYWxEYXRhOiBPYmplY3Q7XG5cbiAgcHJpdmF0ZSBza2lwcGFibGUgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUNvbnN0dWN0b3I6IEZvcm1Db25zdHJ1Y3RvclNlcnZpY2UsXG4gICAgQEluamVjdCgnb3B0aW9ucycpIHByaXZhdGUgb3B0aW9uczogUXVlc3Rpb25uYWlyZU9wdGlvbnNcbiAgKSB7IH1cblxuICAvKipcbiAgICogTG9hZHMgYSBxdWVzdGlvbm5haXJlIGZyb20gZGF0YS5cbiAgICogQHBhcmFtIHF1ZXN0aW9ubmFpcmUgVGhlIHF1ZXN0aW9ubmFpcmUgZGF0YSB0byBsb2FkLCBvZnRlbiBwYXJzZWQgSlNPTiBmcm9tIHRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBzYXZlZFN0YXRlIFRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgcXVlc3Rpb25uYWlyZSwgb2Z0ZW4gZnJvbSBsb2NhbHN0b3JhZ2UuXG4gICAqIEByZXR1cm5zIG51bGxcbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkUXVlc3Rpb25uYWlyZShxdWVzdGlvbm5haXJlOiBRdWVzdGlvbm5haXJlLCBzYXZlZFN0YXRlPzogT2JqZWN0LCBhZGRpdGlvbmFsRGF0YT86IE9iamVjdCk6IFByb21pc2U8YW55PiB7XG4gICAgdGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUgPSBfLmNsb25lRGVlcChxdWVzdGlvbm5haXJlKTtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlID0gXy5jbG9uZURlZXAocXVlc3Rpb25uYWlyZSk7XG5cbiAgICB0aGlzLmFkZGl0aW9uYWxEYXRhID0gYWRkaXRpb25hbERhdGE7XG5cbiAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBPYmplY3Qua2V5cyhzYXZlZFN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5mb3JtQ29uc3R1Y3Rvci5nZW5lcmF0ZUZvcm1zRm9yUXVlc3Rpb25uYWlyZShcbiAgICAgICAgXy5jbG9uZURlZXAodGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUpLFxuICAgICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSxcbiAgICAgICAgdGhpcy5hZGRpdGlvbmFsRGF0YSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIHRoaXMuZm9ybUNvbnN0dWN0b3IuY29uc3RydWN0UmVwZWF0ZXJGcm9tc0Zyb21TdGF0ZShzYXZlZFN0YXRlLCBuZXdEYXRhLnNlY3Rpb25zLCBuZXdEYXRhLmZvcm1zKTtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtID0gbmV3RGF0YS5mb3JtcztcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnBhdGNoVmFsdWUoc2F2ZWRTdGF0ZSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy51cGRhdGVRdWVzdGlvbm5haXJlKHNhdmVkU3RhdGUpO1xuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2Ygc2VjdGlvbi5xdWVzdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChbc2VjdGlvbi5uYW1lLCBxdWVzdGlvbi5uYW1lXSk7XG4gICAgICAgIGlmICghY29udHJvbC52YWx1ZSAmJiBxdWVzdGlvbi5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHF1ZXN0aW9uLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNraXBUb0ZpcnN0U2VjdGlvbikge1xuICAgICAgdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUgPSBPYmplY3Qua2V5cyh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5jb250cm9scylbMF07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5za2lwVG9GaXJzdFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbk5hbWUgPSBPYmplY3Qua2V5cyh0aGlzLmN1cnJlbnRTZWN0aW9uLmZvcm1Hcm91cC5jb250cm9scylbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGN1cnJlbnQgcXVlc3Rpb25uYWlyZSwgdXNlZCB3aGVuIGEgdmFsdWUgaXMgdXBkYXRlZCB0byBjaGVjayBjb25kaXRpb25zLlxuICAgKiBAcGFyYW0gc2F2ZWRTdGF0ZSBUaGUgc2F2ZWQgc3RhdGUgb2YgdGhlIHF1ZXN0aW9ubmFpcmUsIG9mdGVuIGZyb20gbG9jYWxzdG9yYWdlLlxuICAgKiBAcmV0dXJucyBudWxsXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUXVlc3Rpb25uYWlyZShzYXZlZFN0YXRlPzogT2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBuZXdEYXRhID0gdGhpcy5mb3JtQ29uc3R1Y3Rvci5nZW5lcmF0ZUZvcm1zRm9yUXVlc3Rpb25uYWlyZShcbiAgICAgIF8uY2xvbmVEZWVwKHRoaXMub3JpZ2luYWxRdWVzdGlvbm5haXJlKSxcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLFxuICAgICAgdGhpcy5hZGRpdGlvbmFsRGF0YVxuICAgICk7XG4gICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gPSBuZXdEYXRhLmZvcm1zO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMgPSBuZXdEYXRhLnNlY3Rpb25zO1xuXG4gICAgaWYgKHNhdmVkU3RhdGUgJiYgT2JqZWN0LmtleXMoc2F2ZWRTdGF0ZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0ucGF0Y2hWYWx1ZShzYXZlZFN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvbm5haXJlVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucXVlc3Rpb25uYWlyZVZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlc3Rpb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWVzdGlvbm5haXJlVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YUNoYW5nZWRFdmVudC5lbWl0KCk7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9ubmFpcmUodGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyRmllbGRzKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEuY2xlYXJmaWVsZHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS52YWxpZDtcbiAgfVxuXG4gIHB1YmxpYyBzZWN0aW9uVmFsaWQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChuYW1lKS52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIHRoZSBmaWVsZHMgcGFyc2VkXG4gICAqIEBwYXJhbSBjbGVhcmZpZWxkcyBBbiBhcnJheSBvZiBzdHJpbmdzLCBwYXRocyB0byBjbGVhci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgY2xlYXJGaWVsZHMoY2xlYXJmaWVsZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAoIWNsZWFyZmllbGRzIHx8IGNsZWFyZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2xlYXJmaWVsZCBvZiBjbGVhcmZpZWxkcykge1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldChjbGVhcmZpZWxkKTtcblxuICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5yZXNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBjdXJyZW50IHF1ZXN0aW9ubmFpcmUuXG4gICAqIFVzZWZ1bCB3aGVuIGV4aXRpbmcgYSBxdWVzdGlvbm5haXJlIHBhZ2Ugb3IgY29tcGxldGluZyBhIHF1ZXN0aW9ubmFpcmUuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgdW5sb2FkUXVlc3Rpb25uYWlyZSgpIHtcbiAgICB0aGlzLm9yaWdpbmFsUXVlc3Rpb25uYWlyZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFNlY3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFkZGl0aW9uYWxEYXRhID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgc2VjdGlvbi5cbiAgICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNlY3Rpb24gZGF0YSBhbmQgdGhlIHJlbGF0ZWQgZm9ybSBncm91cC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFNlY3Rpb24oKTogeyBkYXRhOiBTZWN0aW9uOyBmb3JtR3JvdXA6IEZvcm1Hcm91cDsgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmZpbmQoKHgpID0+IHtcbiAgICAgIHJldHVybiB4Lm5hbWUgPT09IHRoaXMuY3VycmVudFNlY3Rpb25OYW1lO1xuICAgIH0pO1xuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGZvcm1Hcm91cDogdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KGRhdGEubmFtZSkgYXMgRm9ybUdyb3VwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFsbCB0aGUgYXZhaWFsYmxlIHNlY3Rpb25zLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgYXZhaWFsYmxlIHNlY3Rpb25zLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldCBhdmFpbGFibGVTZWN0aW9ucygpOiBBcnJheTxTZWN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZGF0YSBmb3IgdGhlIGVudGlyZSBxdWVzdGlvbm5haXJlLlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgb2YgZGF0YS5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudERhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmdldFJhd1ZhbHVlKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlbGVjdGVkIHF1ZXN0aW9uLlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcXVlc3Rpb24gZGF0YSBhbmQgdGhlIHJlbGF0ZWQgZm9ybSBjb250cm9sLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UXVlc3Rpb24oKTogeyBkYXRhOiBRdWVzdGlvbjsgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDsgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5jdXJyZW50UXVlc3Rpb25OYW1lKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5maW5kKCh4KSA9PiB7XG4gICAgICByZXR1cm4geC5uYW1lID09PSB0aGlzLmN1cnJlbnRRdWVzdGlvbk5hbWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZm9ybUNvbnRyb2w6IHRoaXMuY3VycmVudFNlY3Rpb24uZm9ybUdyb3VwLmdldChkYXRhLm5hbWUpIGFzIEFic3RyYWN0Q29udHJvbFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvIHRoZSBuZXh0IHF1ZXN0aW9uLlxuICAgKiBJZiB0aGVyZSBpcyBubyBxdWVzdGlvbiB0byBuYXZpZ2F0ZSB0byBpdCB3aWxsIHJlamVjdCB3aXRoIGEgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uXG4gICAqIElmIGFsbG93U2tpcFJlcXVpcmVkRmllbGQgaXMgZmFsc2UgdGhlbiBpdCB3aWxsIHJlamVjdCBpZiB0aGUgY3VycmVudCBxdWVzdGlvbiBpcyBpbnZhbGlkLlxuICAgKiBJZiBlbWl0U2VjdGlvbkZpbmlzaEV2ZW50IGlzIHRydWUgdGhlbiBpdCB3aWxsIGVtaXQgYW4gZXZlbnQgaWYgaXQncyBuYXZpZ2F0aW5nIHBhc3QgdGhlIGxlbmd0aCBvZiBxdWVzdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgcXVlc3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5leHRRdWVzdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYWxsb3dTa2lwUmVxdWlyZWRGaWVsZCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnQ3VycmVudCBxdWVzdGlvbiBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRDdXJyZW50UXVlc3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUXVlc3Rpb24obmV3SW5kZXgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgcHJldmlvdXMgcXVlc3Rpb24uXG4gICAqIElmIHRoZXJlIGlzIG5vIHF1ZXN0aW9uIHRvIG5hdmlnYXRlIHRvIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi5cbiAgICogSWYgYWxsb3dOYXZpZ2F0ZUJhY2t3YXJkcyBpcyBmYWxzZSB0aGVuIGl0IHdpbGwgcmVqZWN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBwcmV2UXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93TmF2aWdhdGVCYWNrd2FyZHMpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnVGhpcyBxdWVzdGlvbm5haXJlIGRvZXMgbm90IGFsbG93IGZvciBiYWNrd2FyZHMgbmF2aWdhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmdldEN1cnJlbnRRdWVzdGlvbkluZGV4KCkudGhlbigoY3VycmVudEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gY3VycmVudEluZGV4IC0gMTtcblxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9RdWVzdGlvbihuZXdJbmRleCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBxdWVzdGlvbnMgaW5kZXguXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBhIG51bWJlci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFF1ZXN0aW9uSW5kZXgoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5pbmRleE9mKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEpO1xuXG4gICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdDb3VsZCBub3QgZmluZCBjdXJyZW50IHF1ZXN0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKGN1cnJlbnRJbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGEgcXVlc3Rpb24gaXMgaW4gYm91bmRzIHRoZW4gbmF2aWdhdGVzIHRvIGl0LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIG5hdmlnYXRlIHRvLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHF1ZXN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvUXVlc3Rpb24oaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxIDwgaW5kZXggfHwgaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ091dCBvZiBib3VuZHMgZXhjZXB0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnNbaW5kZXhdLm5hbWU7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgbmV4dCBzZWN0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHNlY3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5leHRTZWN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldEN1cnJlbnRTZWN0aW9uSW5kZXgoKS50aGVuKChjdXJyZW50SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG9TZWN0aW9uKG5ld0luZGV4KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgc2VjdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgcHJldlNlY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q3VycmVudFNlY3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1F1ZXN0aW9uKG5ld0luZGV4KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlY3Rpb24gaW5kZXguXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyBhIG51bWJlci5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHByaXZhdGUgZ2V0Q3VycmVudFNlY3Rpb25JbmRleCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlLnNlY3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhKTtcblxuICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnQ291bGQgbm90IGZpbmQgY3VycmVudCBzZWN0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlKGN1cnJlbnRJbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGEgc2VjdGlvbiBpcyBpbiBib3VuZHMgdGhlbiBuYXZpZ2F0ZXMgdG8gaXQuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gbmF2aWdhdGUgdG8uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiB0aGUgc2VjdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGVUb1NlY3Rpb24oaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZS5zZWN0aW9ucy5sZW5ndGggLSAxIDwgaW5kZXggfHwgaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ091dCBvZiBib3VuZHMgZXhjZXB0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFNlY3Rpb25OYW1lID0gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZS5zZWN0aW9uc1tpbmRleF0ubmFtZTtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQW5zd2VycyB0aGUgY3VycmVudCBxdWVzdGlvbiB3aXRoIHRoZSBwYXJzZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBhbnN3ZXIgVGhlIHZhbHVlIHRvIGFuc3dlciB0aGUgcXVlc3Rpb24gd2l0aC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBhbnN3ZXJDdXJyZW50UXVlc3Rpb24oYW5zd2VyOiBhbnksIHNlbmRUb05leHRRdWVzdGlvbj86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5zZXRWYWx1ZShhbnN3ZXIpO1xuICAgIGlmIChzZW5kVG9OZXh0UXVlc3Rpb24gJiYgdGhpcy5za2lwcGFibGUpIHsgLy8gVGltZW91dCB0byBwcmV2ZW50IHNraXBwaW5nIGdsaXRjaC5cbiAgICAgIHRoaXMuc2tpcHBhYmxlID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5uZXh0UXVlc3Rpb24oKTtcbiAgICAgICAgdGhpcy5za2lwcGFibGUgPSB0cnVlO1xuICAgICAgfSwgMTUwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlcGVhdGVyIGl0ZW0gdG8gdGhlIGN1cnJlbnQgcXVlc3Rpb24uXG4gICAqIEN1cnJlbnQgcXVlc3Rpb24gbXVzdCBiZSBvZiB0eXBlIFJlcGVhdGVyLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVwZWF0ZXIgaXRlbSBoYXMgYmVlbiBhZGRlZC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBhZGRSZXBlYXRlckl0ZW0oKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5SZXBlYXRlcikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGBDdXJyZW50IHF1ZXN0aW9uIGlzbid0IGEgcmVwZWF0ZXJgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGVhdGVyRm9ybSA9IHRoaXMuZm9ybUNvbnN0dWN0b3IuZ2VuZXJhdGVGb3Jtc0ZvclJlcGVhdGVyKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEpO1xuXG4gICAgICBpZiAoIXJlcGVhdGVyRm9ybSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGBSZXBlYXRlciB0ZW1wbGF0ZSBmYWlsZWQgdG8gZ2VuZXJhdGUuIE1heSBiZSBkdWUgdG8gdGhlIHJlcGVhdGVyIGhhdmluZyBubyBpdGVtcyBpbiB0aGUgZWRpdG9yLmApO1xuICAgICAgfVxuXG5cbiAgICAgIGlmICghKHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGBUaGUgY3VycmVudCBxdWVzdGlvbnMgY29udHJvbCBpc24ndCBvZiB0eXBlIEZvcm1BcnJheWApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5wdXNoKHJlcGVhdGVyRm9ybSk7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByZXBlYXRlciBpdGVtIG9uIHRoZSBjdXJyZW50IHF1ZXN0aW9uLlxuICAgKiBDdXJyZW50IHF1ZXN0aW9uIG11c3QgYmUgb2YgdHlwZSBSZXBlYXRlci5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSByZXBlYXRlciBpdGVtIGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUmVwZWF0ZXJJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEudHlwZSAhPT0gUXVlc3Rpb25UeXBlLlJlcGVhdGVyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoYEN1cnJlbnQgcXVlc3Rpb24gaXNuJ3QgYSByZXBlYXRlcmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoISh0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgVGhlIGN1cnJlbnQgcXVlc3Rpb25zIGNvbnRyb2wgaXNuJ3Qgb2YgdHlwZSBGb3JtQXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IHRleHQgZm9yIGEgZ2l2ZW4gcmVwZWF0ZXIgaXRlbVxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZm9yLlxuICAgKiBAcmV0dXJucyBBIHN0cmluZyB3aGljaCBpcyB0aGUgZGlzcGxheSB0ZXh0LlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldFJlcGVhdGVySXRlbUxhYmVsKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgfHwgISh0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCByZXBlYXRlckl0ZW0gPSB0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbC5jb250cm9sc1tpbmRleF07XG5cbiAgICBpZiAoIXJlcGVhdGVySXRlbSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YS5yZXBlYXRlckRpc3BsYXlOYW1lO1xuICAgIGNvbnN0IHNwbGl0VGVtcGxhdGUgPSB0ZW1wbGF0ZS5zcGxpdCgnICcpO1xuXG4gICAgY29uc3QgZGlzcGxheUFycmF5ID0gW107XG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZUl0ZW0gb2Ygc3BsaXRUZW1wbGF0ZSkge1xuICAgICAgaWYgKHRlbXBsYXRlSXRlbS5tYXRjaCgvXFxbLio/XFxdLykpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHRlbXBsYXRlSXRlbS5yZXBsYWNlKC9bXFxbXFxdJ10rL2csICcnKTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHJlcGVhdGVySXRlbS5nZXQocGF0aCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS52YWx1ZSA/IGl0ZW0udmFsdWUgOiAnPyc7XG4gICAgICAgIGRpc3BsYXlBcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BsYXlBcnJheS5wdXNoKHRlbXBsYXRlSXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGlzcGxheSA9IGRpc3BsYXlBcnJheS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIGRpc3BsYXk7XG4gIH1cbn1cbiJdfQ==
1004
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb25uYWlyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdsb3dncmVlbi9nZy1xdWVzdGlvbm5haXJlLXYyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3F1ZXN0aW9ubmFpcmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVwRSxPQUFPLEVBQThCLFNBQVMsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBSXBGLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7O0FBRTNEO0lBc0JFLDhCQUNVLGNBQXNDLEVBQ25CLE9BQTZCO1FBRGhELG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQXBCbkQscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDOUQseUJBQW9CLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFlakUsY0FBUyxHQUFHLElBQUksQ0FBQztJQUtyQixDQUFDO0lBRUw7Ozs7OztPQU1HOzs7Ozs7Ozs7SUFDVSxnREFBaUI7Ozs7Ozs7O0lBQTlCLFVBQStCLGFBQTRCLEVBQUUsVUFBbUIsRUFBRSxjQUF1Qjs7Ozs7Ozt3QkFDdkcsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ3hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUV2RCxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQzt3QkFFckMsSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUM5QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FDL0QsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFDdkMsSUFBSSxDQUFDLHdCQUF3QixFQUM3QixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQ0w7NEJBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2pHLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDOzRCQUM5QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUN0RDt3QkFFRCxxQkFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUE7O3dCQUExQyxTQUEwQyxDQUFDOzs0QkFFM0MsS0FBc0IsS0FBQSxpQkFBQSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFBLDRDQUFFO2dDQUEvQyxPQUFPOztvQ0FDaEIsS0FBdUIsb0JBQUEsaUJBQUEsT0FBTyxDQUFDLFNBQVMsQ0FBQSxDQUFBLDRDQUFFO3dDQUEvQixRQUFRO3dDQUNYLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7d0NBQ2hGLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7NENBQzNDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO3lDQUN6QztxQ0FDRjs7Ozs7Ozs7OzZCQUNGOzs7Ozs7Ozs7d0JBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFOzRCQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2xGO3dCQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTs0QkFDcEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ25GO3dCQUVELHNCQUFPOzs7O0tBQ1I7SUFFRDs7Ozs7T0FLRzs7Ozs7OztJQUNJLGtEQUFtQjs7Ozs7O0lBQTFCLFVBQTJCLFVBQW1CO1FBQTlDLGlCQWlDQzs7WUFoQ08sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQy9ELENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsRUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FDcEI7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFdEQsSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRTtZQUM3QyxJQUFJLENBQUMsb0NBQW9DLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDekQ7UUFFRCxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRTtZQUN4QyxJQUFJLENBQUMsK0JBQStCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEQ7UUFFRCxJQUFJLENBQUMsb0NBQW9DLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFlBQVksQ0FBQyxTQUFTOzs7UUFBQztZQUMvRixLQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0IsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsRUFBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUzs7O1lBQUM7Z0JBQzdGLEtBQUksQ0FBQyxXQUFXLENBQUMsS0FBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsQ0FBQyxFQUFDLENBQUM7U0FDSjtRQUVELE9BQU87SUFDVCxDQUFDO0lBRUQsc0JBQVcseUNBQU87Ozs7UUFBbEI7WUFDRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7UUFDN0MsQ0FBQzs7O09BQUE7SUFFRCxzQkFBVyxpREFBZTs7OztRQUExQjtZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDakQsT0FBTyxLQUFLLENBQUM7YUFDZDs7Z0JBQ0ssWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFDMUYsT0FBTyxZQUFZLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7OztPQUFBO0lBRUQsc0JBQVcsZ0RBQWM7Ozs7UUFBekI7WUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2pELE9BQU8sS0FBSyxDQUFDO2FBQ2Q7O2dCQUNLLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDOztnQkFDcEYsUUFBUSxHQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMvRCxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7Ozs7O0lBRU0sMkNBQVk7Ozs7SUFBbkIsVUFBb0IsSUFBWTtRQUM5QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7OztJQUNLLDBDQUFXOzs7Ozs7O0lBQW5CLFVBQW9CLFdBQTBCOztRQUM1QyxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzVDLE9BQU87U0FDUjs7WUFFRCxLQUF5QixJQUFBLGdCQUFBLGlCQUFBLFdBQVcsQ0FBQSx3Q0FBQSxpRUFBRTtnQkFBakMsSUFBTSxVQUFVLHdCQUFBOztvQkFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBRTdELElBQUksT0FBTyxFQUFFO29CQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzFCO2FBQ0Y7Ozs7Ozs7OztJQUNILENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7O0lBQ0ksa0RBQW1COzs7Ozs7SUFBMUI7UUFDRSxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFDMUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQU9ELHNCQUFXLGdEQUFjO1FBTHpCOzs7O1dBSUc7Ozs7OztRQUNIO1lBQUEsaUJBaUJDO1lBaEJDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzVCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7O2dCQUVLLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDNUMsQ0FBQyxFQUFDO1lBRUYsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsT0FBTztnQkFDTCxJQUFJLEVBQUUsSUFBSTtnQkFDVixTQUFTLEVBQUUsbUJBQUEsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQWE7YUFDckUsQ0FBQztRQUNKLENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsbURBQWlCO1FBTDVCOzs7O1dBSUc7Ozs7OztRQUNIO1lBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JFLE9BQU8sRUFBRSxDQUFDO2FBQ1g7WUFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7UUFDNUMsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyw2Q0FBVztRQUx0Qjs7OztXQUlHOzs7Ozs7UUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JELENBQUM7OztPQUFBO0lBUUQsc0JBQVcsaURBQWU7UUFMMUI7Ozs7V0FJRzs7Ozs7O1FBQ0g7WUFBQSxpQkFpQkM7WUFoQkMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDN0IsT0FBTyxJQUFJLENBQUM7YUFDYjs7Z0JBRUssSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJOzs7O1lBQUMsVUFBQyxDQUFDO2dCQUNyRCxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzdDLENBQUMsRUFBQztZQUVGLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsV0FBVyxFQUFFLG1CQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQW1CO2FBQzdFLENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUVEOzs7Ozs7O09BT0c7Ozs7Ozs7OztJQUNJLDJDQUFZOzs7Ozs7OztJQUFuQjtRQUFBLGlCQTRCQztRQTNCQyxPQUFPLElBQUksT0FBTzs7Ozs7UUFBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2pDLElBQUksQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFO2dCQUN4QyxJQUFJLENBQUMsS0FBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFO29CQUMzQyxPQUFPLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2lCQUM5QzthQUNGO1lBRUQsS0FBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSTs7OztZQUFDLFVBQUMsWUFBWTs7b0JBQ3pDLGlCQUFpQixHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQzs7b0JBQ2pFLGNBQWMsR0FBRyxpQkFBaUIsS0FBSyxZQUFZO2dCQUV6RCxJQUFJLGNBQWMsRUFBRTtvQkFDbEIsS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO29CQUNqQyxPQUFPO2lCQUNSOztvQkFFSyxRQUFRLEdBQUcsWUFBWSxHQUFHLENBQUM7Z0JBRWpDLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJOzs7Z0JBQUM7b0JBQ3JDLE9BQU8sT0FBTyxFQUFFLENBQUM7Z0JBQ25CLENBQUMsRUFBQyxDQUFDLEtBQUs7Ozs7Z0JBQUMsVUFBQyxLQUFLO29CQUNiLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDLEtBQUs7Ozs7WUFBQyxVQUFDLEtBQUs7Z0JBQ2IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7Ozs7Ozs7O0lBQ0ksMkNBQVk7Ozs7Ozs7SUFBbkI7UUFBQSxpQkFrQkM7UUFqQkMsT0FBTyxJQUFJLE9BQU87Ozs7O1FBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNqQyxJQUFJLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtnQkFDeEMsT0FBTyxNQUFNLENBQUMsNERBQTRELENBQUMsQ0FBQzthQUM3RTtZQUVELEtBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLFlBQVk7O29CQUN6QyxRQUFRLEdBQUcsWUFBWSxHQUFHLENBQUM7Z0JBRWpDLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJOzs7Z0JBQUM7b0JBQ3JDLE9BQU8sT0FBTyxFQUFFLENBQUM7Z0JBQ25CLENBQUMsRUFBQyxDQUFDLEtBQUs7Ozs7Z0JBQUMsVUFBQyxLQUFLO29CQUNiLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDLEtBQUs7Ozs7WUFBQyxVQUFDLEtBQUs7Z0JBQ2IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7O0lBQ0ssc0RBQXVCOzs7Ozs7SUFBL0I7UUFBQSxpQkFVQztRQVRDLE9BQU8sSUFBSSxPQUFPOzs7OztRQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07O2dCQUMzQixZQUFZLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztZQUUxRixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsT0FBTyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQzthQUNsRDtZQUVELE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7O0lBQ0ksaURBQWtCOzs7Ozs7SUFBekIsVUFBMEIsS0FBYTtRQUF2QyxpQkFTQztRQVJDLE9BQU8sSUFBSSxPQUFPOzs7OztRQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakMsSUFBSSxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDdEUsT0FBTyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQzthQUMxQztZQUVELEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzFFLE9BQU8sT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7O0lBQ0ksMENBQVc7Ozs7O0lBQWxCO1FBQUEsaUJBYUM7UUFaQyxPQUFPLElBQUksT0FBTzs7Ozs7UUFBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2pDLEtBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFDLFlBQVk7O29CQUN4QyxRQUFRLEdBQUcsWUFBWSxHQUFHLENBQUM7Z0JBQ2pDLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJOzs7Z0JBQUM7b0JBQ3BDLE9BQU8sT0FBTyxFQUFFLENBQUM7Z0JBQ25CLENBQUMsRUFBQyxDQUFDLEtBQUs7Ozs7Z0JBQUMsVUFBQyxLQUFLO29CQUNiLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDLEtBQUs7Ozs7WUFBQyxVQUFDLEtBQUs7Z0JBQ2IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7SUFDSSwwQ0FBVzs7Ozs7SUFBbEI7UUFBQSxpQkFhQztRQVpDLE9BQU8sSUFBSSxPQUFPOzs7OztRQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakMsS0FBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSTs7OztZQUFDLFVBQUMsWUFBWTs7b0JBQ3hDLFFBQVEsR0FBRyxZQUFZLEdBQUcsQ0FBQztnQkFDakMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUk7OztnQkFBQztvQkFDckMsT0FBTyxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQyxFQUFDLENBQUMsS0FBSzs7OztnQkFBQyxVQUFDLEtBQUs7b0JBQ2IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsRUFBQyxDQUFDO1lBQ0wsQ0FBQyxFQUFDLENBQUMsS0FBSzs7OztZQUFDLFVBQUMsS0FBSztnQkFDYixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDLEVBQUMsQ0FBQztRQUNMLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSyxxREFBc0I7Ozs7OztJQUE5QjtRQUFBLGlCQVVDO1FBVEMsT0FBTyxJQUFJLE9BQU87Ozs7O1FBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTs7Z0JBQzNCLFlBQVksR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUV6RixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsT0FBTyxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzthQUNqRDtZQUVELE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7O0lBQ0ksZ0RBQWlCOzs7Ozs7SUFBeEIsVUFBeUIsS0FBYTtRQUF0QyxpQkFTQztRQVJDLE9BQU8sSUFBSSxPQUFPOzs7OztRQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakMsSUFBSSxLQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ3RFLE9BQU8sTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7YUFDMUM7WUFFRCxLQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDekUsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHOzs7Ozs7OztJQUNJLG9EQUFxQjs7Ozs7OztJQUE1QixVQUE2QixNQUFXLEVBQUUsa0JBQTRCO1FBQXRFLGlCQWVDO1FBZEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxzQ0FBc0M7WUFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsVUFBVTs7O1lBQUM7Z0JBQ1QsS0FBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxLQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSTs7O2dCQUFDO29CQUN2QixLQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDeEIsQ0FBQyxFQUFDLENBQUM7WUFDTCxDQUFDLEdBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRzs7Ozs7OztJQUNJLDhDQUFlOzs7Ozs7SUFBdEI7UUFBQSxpQkFtQkM7UUFsQkMsT0FBTyxJQUFJLE9BQU87Ozs7O1FBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUNqQyxJQUFJLEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUM1RCxPQUFPLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2FBQ3BEOztnQkFDSyxZQUFZLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztZQUU1RixJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNqQixPQUFPLE1BQU0sQ0FBQyxpR0FBaUcsQ0FBQyxDQUFDO2FBQ2xIO1lBR0QsSUFBSSxDQUFDLENBQUMsS0FBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLFlBQVksU0FBUyxDQUFDLEVBQUU7Z0JBQzVELE9BQU8sTUFBTSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7YUFDeEU7WUFFRCxLQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDcEQsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7Ozs7Ozs7O0lBQ0ksaURBQWtCOzs7Ozs7O0lBQXpCLFVBQTBCLEtBQWE7UUFBdkMsaUJBYUM7UUFaQyxPQUFPLElBQUksT0FBTzs7Ozs7UUFBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2pDLElBQUksS0FBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQzVELE9BQU8sTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7YUFDcEQ7WUFFRCxJQUFJLENBQUMsQ0FBQyxLQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsWUFBWSxTQUFTLENBQUMsRUFBRTtnQkFDNUQsT0FBTyxNQUFNLENBQUMsdURBQXVELENBQUMsQ0FBQzthQUN4RTtZQUVELEtBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRCxPQUFPLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7O0lBQ0ksbURBQW9COzs7Ozs7SUFBM0IsVUFBNEIsS0FBYTs7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsWUFBWSxTQUFTLENBQUMsRUFBRTtZQUNqRyxPQUFPLEVBQUUsQ0FBQztTQUNYOztZQUVLLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRXJFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxFQUFFLENBQUM7U0FDWDs7WUFFSyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1COztZQUN4RCxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7O1lBRW5DLFlBQVksR0FBRyxFQUFFOztZQUN2QixLQUEyQixJQUFBLGtCQUFBLGlCQUFBLGFBQWEsQ0FBQSw0Q0FBQSx1RUFBRTtnQkFBckMsSUFBTSxZQUFZLDBCQUFBO2dCQUNyQixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7O3dCQUMzQixJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDOzt3QkFDNUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDOzt3QkFDN0IsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUc7b0JBQzNDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7Ozs7Ozs7Ozs7WUFFSyxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdEMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7Z0JBemdCRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7O2dCQVpRLHNCQUFzQjtnREFrQzFCLE1BQU0sU0FBQyxTQUFTOzs7K0JBbkNyQjtDQXFoQkMsQUExZ0JELElBMGdCQztTQXZnQlksb0JBQW9COzs7SUFDL0IsZ0RBQXFFOztJQUNyRSxvREFBeUU7Ozs7O0lBRXpFLHFEQUE2Qzs7Ozs7SUFFN0Msb0RBQTRDOzs7OztJQUM1Qyx3REFBNEM7Ozs7O0lBRTVDLGtEQUFtQzs7Ozs7SUFDbkMsbURBQW9DOzs7OztJQUVwQyxvRUFBMkQ7Ozs7O0lBQzNELCtEQUFzRDs7Ozs7SUFFdEQsOENBQStCOzs7OztJQUUvQix5Q0FBeUI7Ozs7O0lBR3ZCLDhDQUE4Qzs7Ozs7SUFDOUMsdUNBQXdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db25zdHJ1Y3RvclNlcnZpY2UgfSBmcm9tICcuL2Zvcm0tY29uc3RydWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBRdWVzdGlvbm5haXJlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbm5haXJlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2VjdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VjdGlvbic7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb24nO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBRdWVzdGlvbm5haXJlT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVlc3Rpb25uYWlyZS1vcHRpb25zJztcbmltcG9ydCB7IFF1ZXN0aW9uVHlwZSB9IGZyb20gJy4uL2VudW1zL3F1ZXN0aW9uLXR5cGUuZW51bSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9ubmFpcmVTZXJ2aWNlIHtcbiAgcHVibGljIGRhdGFDaGFuZ2VkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHB1YmxpYyBzZWN0aW9uRmluaXNoZWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwcml2YXRlIG9yaWdpbmFsUXVlc3Rpb25uYWlyZTogUXVlc3Rpb25uYWlyZTtcblxuICBwcml2YXRlIGN1cnJlbnRRdWVzdGlvbm5haXJlOiBRdWVzdGlvbm5haXJlO1xuICBwcml2YXRlIGN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybTogRm9ybUdyb3VwO1xuXG4gIHByaXZhdGUgY3VycmVudFNlY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgY3VycmVudFF1ZXN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcXVlc3Rpb25uYWlyZVZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcXVlc3Rpb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgYWRkaXRpb25hbERhdGE6IE9iamVjdDtcblxuICBwcml2YXRlIHNraXBwYWJsZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQ29uc3R1Y3RvcjogRm9ybUNvbnN0cnVjdG9yU2VydmljZSxcbiAgICBASW5qZWN0KCdvcHRpb25zJykgcHJpdmF0ZSBvcHRpb25zOiBRdWVzdGlvbm5haXJlT3B0aW9uc1xuICApIHsgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHF1ZXN0aW9ubmFpcmUgZnJvbSBkYXRhLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25uYWlyZSBUaGUgcXVlc3Rpb25uYWlyZSBkYXRhIHRvIGxvYWQsIG9mdGVuIHBhcnNlZCBKU09OIGZyb20gdGhlIGVkaXRvci5cbiAgICogQHBhcmFtIHNhdmVkU3RhdGUgVGhlIHNhdmVkIHN0YXRlIG9mIHRoZSBxdWVzdGlvbm5haXJlLCBvZnRlbiBmcm9tIGxvY2Fsc3RvcmFnZS5cbiAgICogQHJldHVybnMgbnVsbFxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRRdWVzdGlvbm5haXJlKHF1ZXN0aW9ubmFpcmU6IFF1ZXN0aW9ubmFpcmUsIHNhdmVkU3RhdGU/OiBPYmplY3QsIGFkZGl0aW9uYWxEYXRhPzogT2JqZWN0KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLm9yaWdpbmFsUXVlc3Rpb25uYWlyZSA9IF8uY2xvbmVEZWVwKHF1ZXN0aW9ubmFpcmUpO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUgPSBfLmNsb25lRGVlcChxdWVzdGlvbm5haXJlKTtcblxuICAgIHRoaXMuYWRkaXRpb25hbERhdGEgPSBhZGRpdGlvbmFsRGF0YTtcblxuICAgIGlmIChzYXZlZFN0YXRlICYmIE9iamVjdC5rZXlzKHNhdmVkU3RhdGUpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JRdWVzdGlvbm5haXJlKFxuICAgICAgICBfLmNsb25lRGVlcCh0aGlzLm9yaWdpbmFsUXVlc3Rpb25uYWlyZSksXG4gICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLFxuICAgICAgICB0aGlzLmFkZGl0aW9uYWxEYXRhLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdGhpcy5mb3JtQ29uc3R1Y3Rvci5jb25zdHJ1Y3RSZXBlYXRlckZyb21zRnJvbVN0YXRlKHNhdmVkU3RhdGUsIG5ld0RhdGEuc2VjdGlvbnMsIG5ld0RhdGEuZm9ybXMpO1xuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0gPSBuZXdEYXRhLmZvcm1zO1xuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0ucGF0Y2hWYWx1ZShzYXZlZFN0YXRlKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVF1ZXN0aW9ubmFpcmUoc2F2ZWRTdGF0ZSk7XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZS5zZWN0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiBzZWN0aW9uLnF1ZXN0aW9ucykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KFtzZWN0aW9uLm5hbWUsIHF1ZXN0aW9uLm5hbWVdKTtcbiAgICAgICAgaWYgKCFjb250cm9sLnZhbHVlICYmIHF1ZXN0aW9uLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUocXVlc3Rpb24uZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFRvRmlyc3RTZWN0aW9uKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTZWN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzKVswXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNraXBUb0ZpcnN0UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY3VycmVudFNlY3Rpb24uZm9ybUdyb3VwLmNvbnRyb2xzKVswXTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY3VycmVudCBxdWVzdGlvbm5haXJlLCB1c2VkIHdoZW4gYSB2YWx1ZSBpcyB1cGRhdGVkIHRvIGNoZWNrIGNvbmRpdGlvbnMuXG4gICAqIEBwYXJhbSBzYXZlZFN0YXRlIFRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgcXVlc3Rpb25uYWlyZSwgb2Z0ZW4gZnJvbSBsb2NhbHN0b3JhZ2UuXG4gICAqIEByZXR1cm5zIG51bGxcbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVRdWVzdGlvbm5haXJlKHNhdmVkU3RhdGU/OiBPYmplY3QpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG5ld0RhdGEgPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JRdWVzdGlvbm5haXJlKFxuICAgICAgXy5jbG9uZURlZXAodGhpcy5vcmlnaW5hbFF1ZXN0aW9ubmFpcmUpLFxuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0sXG4gICAgICB0aGlzLmFkZGl0aW9uYWxEYXRhXG4gICAgKTtcbiAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybSA9IG5ld0RhdGEuZm9ybXM7XG4gICAgdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZS5zZWN0aW9ucyA9IG5ld0RhdGEuc2VjdGlvbnM7XG5cbiAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBPYmplY3Qua2V5cyhzYXZlZFN0YXRlKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5wYXRjaFZhbHVlKHNhdmVkU3RhdGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvbm5haXJlVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWVzdGlvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXN0aW9ubmFpcmVWYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhQ2hhbmdlZEV2ZW50LmVtaXQoKTtcbiAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25uYWlyZSh0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWVsZHModGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YS5jbGVhcmZpZWxkcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVmFsaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtLnZhbGlkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0ZpcnN0UXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIGN1cnJlbnRJbmRleCA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNMYXN0UXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmluZGV4T2YodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YSk7XG4gICAgY29uc3QgbWF4SW5kZXggPSAgdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBjdXJyZW50SW5kZXggPT09IG1heEluZGV4O1xuICB9XG5cbiAgcHVibGljIHNlY3Rpb25WYWxpZChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KG5hbWUpLnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgdGhlIGZpZWxkcyBwYXJzZWRcbiAgICogQHBhcmFtIGNsZWFyZmllbGRzIEFuIGFycmF5IG9mIHN0cmluZ3MsIHBhdGhzIHRvIGNsZWFyLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhckZpZWxkcyhjbGVhcmZpZWxkczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICghY2xlYXJmaWVsZHMgfHwgY2xlYXJmaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjbGVhcmZpZWxkIG9mIGNsZWFyZmllbGRzKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0KGNsZWFyZmllbGQpO1xuXG4gICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICBjb250cm9sLnJlc2V0KHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVubG9hZHMgdGhlIGN1cnJlbnQgcXVlc3Rpb25uYWlyZS5cbiAgICogVXNlZnVsIHdoZW4gZXhpdGluZyBhIHF1ZXN0aW9ubmFpcmUgcGFnZSBvciBjb21wbGV0aW5nIGEgcXVlc3Rpb25uYWlyZS5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyB1bmxvYWRRdWVzdGlvbm5haXJlKCkge1xuICAgIHRoaXMub3JpZ2luYWxRdWVzdGlvbm5haXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmVGb3JtID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXJyZW50U2VjdGlvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jdXJyZW50UXVlc3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYWRkaXRpb25hbERhdGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzZWxlY3RlZCBzZWN0aW9uLlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgc2VjdGlvbiBkYXRhIGFuZCB0aGUgcmVsYXRlZCBmb3JtIGdyb3VwLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50U2VjdGlvbigpOiB7IGRhdGE6IFNlY3Rpb247IGZvcm1Hcm91cDogRm9ybUdyb3VwOyB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTZWN0aW9uTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMuZmluZCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHgubmFtZSA9PT0gdGhpcy5jdXJyZW50U2VjdGlvbk5hbWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgZm9ybUdyb3VwOiB0aGlzLmN1cnJlbnRRdWVzdGlvbm5haXJlRm9ybS5nZXQoZGF0YS5uYW1lKSBhcyBGb3JtR3JvdXBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYWxsIHRoZSBhdmFpYWxibGUgc2VjdGlvbnMuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBhdmFpYWxibGUgc2VjdGlvbnMuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGF2YWlsYWJsZVNlY3Rpb25zKCk6IEFycmF5PFNlY3Rpb24+IHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUgfHwgIXRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBkYXRhIGZvciB0aGUgZW50aXJlIHF1ZXN0aW9ubmFpcmUuXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCBvZiBkYXRhLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50RGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZUZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgcXVlc3Rpb24uXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBxdWVzdGlvbiBkYXRhIGFuZCB0aGUgcmVsYXRlZCBmb3JtIGNvbnRyb2wuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRRdWVzdGlvbigpOiB7IGRhdGE6IFF1ZXN0aW9uOyBmb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sOyB9IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRRdWVzdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zLmZpbmQoKHgpID0+IHtcbiAgICAgIHJldHVybiB4Lm5hbWUgPT09IHRoaXMuY3VycmVudFF1ZXN0aW9uTmFtZTtcbiAgICB9KTtcblxuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBmb3JtQ29udHJvbDogdGhpcy5jdXJyZW50U2VjdGlvbi5mb3JtR3JvdXAuZ2V0KGRhdGEubmFtZSkgYXMgQWJzdHJhY3RDb250cm9sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIG5leHQgcXVlc3Rpb24uXG4gICAqIElmIHRoZXJlIGlzIG5vIHF1ZXN0aW9uIHRvIG5hdmlnYXRlIHRvIGl0IHdpbGwgcmVqZWN0IHdpdGggYSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi5cbiAgICogSWYgYWxsb3dTa2lwUmVxdWlyZWRGaWVsZCBpcyBmYWxzZSB0aGVuIGl0IHdpbGwgcmVqZWN0IGlmIHRoZSBjdXJyZW50IHF1ZXN0aW9uIGlzIGludmFsaWQuXG4gICAqIElmIGVtaXRTZWN0aW9uRmluaXNoRXZlbnQgaXMgdHJ1ZSB0aGVuIGl0IHdpbGwgZW1pdCBhbiBldmVudCBpZiBpdCdzIG5hdmlnYXRpbmcgcGFzdCB0aGUgbGVuZ3RoIG9mIHF1ZXN0aW9ucy5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBxdWVzdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgbmV4dFF1ZXN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd1NraXBSZXF1aXJlZEZpZWxkKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdDdXJyZW50IHF1ZXN0aW9uIGlzIGludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmdldEN1cnJlbnRRdWVzdGlvbkluZGV4KCkudGhlbigoY3VycmVudEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhc3RRdWVzdGlvbkluZGV4ID0gdGhpcy5jdXJyZW50U2VjdGlvbi5kYXRhLnF1ZXN0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBpc0xhc3RRdWVzdGlvbiA9IGxhc3RRdWVzdGlvbkluZGV4ID09PSBjdXJyZW50SW5kZXg7XG5cbiAgICAgICAgaWYgKGlzTGFzdFF1ZXN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZWN0aW9uRmluaXNoZWRFdmVudC5lbWl0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuXG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1F1ZXN0aW9uKG5ld0luZGV4KS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIHF1ZXN0aW9uLlxuICAgKiBJZiB0aGVyZSBpcyBubyBxdWVzdGlvbiB0byBuYXZpZ2F0ZSB0byBpdCB3aWxsIHJlamVjdCB3aXRoIGEgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24uXG4gICAqIElmIGFsbG93TmF2aWdhdGVCYWNrd2FyZHMgaXMgZmFsc2UgdGhlbiBpdCB3aWxsIHJlamVjdC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBxdWVzdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgcHJldlF1ZXN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd05hdmlnYXRlQmFja3dhcmRzKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ1RoaXMgcXVlc3Rpb25uYWlyZSBkb2VzIG5vdCBhbGxvdyBmb3IgYmFja3dhcmRzIG5hdmlnYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRDdXJyZW50UXVlc3Rpb25JbmRleCgpLnRoZW4oKGN1cnJlbnRJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG5cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUXVlc3Rpb24obmV3SW5kZXgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgcXVlc3Rpb25zIGluZGV4LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgYSBudW1iZXIuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRRdWVzdGlvbkluZGV4KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnMuaW5kZXhPZih0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhKTtcblxuICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnQ291bGQgbm90IGZpbmQgY3VycmVudCBxdWVzdGlvbicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzb2x2ZShjdXJyZW50SW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBhIHF1ZXN0aW9uIGlzIGluIGJvdW5kcyB0aGVuIG5hdmlnYXRlcyB0byBpdC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBuYXZpZ2F0ZSB0by5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBxdWVzdGlvbiBoYXMgYmVlbiBuYXZpZ2F0ZWQgdG8uXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGVUb1F1ZXN0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YS5xdWVzdGlvbnMubGVuZ3RoIC0gMSA8IGluZGV4IHx8IGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdPdXQgb2YgYm91bmRzIGV4Y2VwdGlvbicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRRdWVzdGlvbk5hbWUgPSB0aGlzLmN1cnJlbnRTZWN0aW9uLmRhdGEucXVlc3Rpb25zW2luZGV4XS5uYW1lO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIG5leHQgc2VjdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBzZWN0aW9uIGhhcyBiZWVuIG5hdmlnYXRlZCB0by5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBuZXh0U2VjdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZXRDdXJyZW50U2VjdGlvbkluZGV4KCkudGhlbigoY3VycmVudEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvU2VjdGlvbihuZXdJbmRleCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvIHRoZSBwcmV2aW91cyBzZWN0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHNlY3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIHByZXZTZWN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmdldEN1cnJlbnRTZWN0aW9uSW5kZXgoKS50aGVuKChjdXJyZW50SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICB0aGlzLm5hdmlnYXRlVG9RdWVzdGlvbihuZXdJbmRleCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzZWN0aW9uIGluZGV4LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgYSBudW1iZXIuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRTZWN0aW9uSW5kZXgoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5jdXJyZW50UXVlc3Rpb25uYWlyZS5zZWN0aW9ucy5pbmRleE9mKHRoaXMuY3VycmVudFNlY3Rpb24uZGF0YSk7XG5cbiAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ0NvdWxkIG5vdCBmaW5kIGN1cnJlbnQgc2VjdGlvbicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzb2x2ZShjdXJyZW50SW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBhIHNlY3Rpb24gaXMgaW4gYm91bmRzIHRoZW4gbmF2aWdhdGVzIHRvIGl0LlxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIG5hdmlnYXRlIHRvLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gdGhlIHNlY3Rpb24gaGFzIGJlZW4gbmF2aWdhdGVkIHRvLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIG5hdmlnYXRlVG9TZWN0aW9uKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnMubGVuZ3RoIC0gMSA8IGluZGV4IHx8IGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdPdXQgb2YgYm91bmRzIGV4Y2VwdGlvbicpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRTZWN0aW9uTmFtZSA9IHRoaXMuY3VycmVudFF1ZXN0aW9ubmFpcmUuc2VjdGlvbnNbaW5kZXhdLm5hbWU7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgdGhlIGN1cnJlbnQgcXVlc3Rpb24gd2l0aCB0aGUgcGFyc2VkIHZhbHVlLlxuICAgKiBAcGFyYW0gYW5zd2VyIFRoZSB2YWx1ZSB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9uIHdpdGguXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgYW5zd2VyQ3VycmVudFF1ZXN0aW9uKGFuc3dlcjogYW55LCBzZW5kVG9OZXh0UXVlc3Rpb24/OiBib29sZWFuKSB7XG4gICAgaWYgKCFzZW5kVG9OZXh0UXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnNldFZhbHVlKGFuc3dlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2tpcHBhYmxlKSB7IC8vIFRpbWVvdXQgdG8gcHJldmVudCBza2lwcGluZyBnbGl0Y2guXG4gICAgICB0aGlzLnNraXBwYWJsZSA9IGZhbHNlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnNldFZhbHVlKGFuc3dlcik7XG4gICAgICAgIHRoaXMubmV4dFF1ZXN0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5za2lwcGFibGUgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0sIDE1MCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXBlYXRlciBpdGVtIHRvIHRoZSBjdXJyZW50IHF1ZXN0aW9uLlxuICAgKiBDdXJyZW50IHF1ZXN0aW9uIG11c3QgYmUgb2YgdHlwZSBSZXBlYXRlci5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIHJlcGVhdGVyIGl0ZW0gaGFzIGJlZW4gYWRkZWQuXG4gICAqIEBhdXRob3IgV2lsbCBQb3Vsc29uXG4gICAqL1xuICBwdWJsaWMgYWRkUmVwZWF0ZXJJdGVtKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb24uZGF0YS50eXBlICE9PSBRdWVzdGlvblR5cGUuUmVwZWF0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgQ3VycmVudCBxdWVzdGlvbiBpc24ndCBhIHJlcGVhdGVyYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXBlYXRlckZvcm0gPSB0aGlzLmZvcm1Db25zdHVjdG9yLmdlbmVyYXRlRm9ybXNGb3JSZXBlYXRlcih0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhKTtcblxuICAgICAgaWYgKCFyZXBlYXRlckZvcm0pIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgUmVwZWF0ZXIgdGVtcGxhdGUgZmFpbGVkIHRvIGdlbmVyYXRlLiBNYXkgYmUgZHVlIHRvIHRoZSByZXBlYXRlciBoYXZpbmcgbm8gaXRlbXMgaW4gdGhlIGVkaXRvci5gKTtcbiAgICAgIH1cblxuXG4gICAgICBpZiAoISh0aGlzLmN1cnJlbnRRdWVzdGlvbi5mb3JtQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChgVGhlIGN1cnJlbnQgcXVlc3Rpb25zIGNvbnRyb2wgaXNuJ3Qgb2YgdHlwZSBGb3JtQXJyYXlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wucHVzaChyZXBlYXRlckZvcm0pO1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcmVwZWF0ZXIgaXRlbSBvbiB0aGUgY3VycmVudCBxdWVzdGlvbi5cbiAgICogQ3VycmVudCBxdWVzdGlvbiBtdXN0IGJlIG9mIHR5cGUgUmVwZWF0ZXIuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVwZWF0ZXIgaXRlbSBoYXMgYmVlbiByZW1vdmVkLlxuICAgKiBAYXV0aG9yIFdpbGwgUG91bHNvblxuICAgKi9cbiAgcHVibGljIHJlbW92ZVJlcGVhdGVySXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbi5kYXRhLnR5cGUgIT09IFF1ZXN0aW9uVHlwZS5SZXBlYXRlcikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGBDdXJyZW50IHF1ZXN0aW9uIGlzbid0IGEgcmVwZWF0ZXJgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoYFRoZSBjdXJyZW50IHF1ZXN0aW9ucyBjb250cm9sIGlzbid0IG9mIHR5cGUgRm9ybUFycmF5YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sLnJlbW92ZUF0KGluZGV4KTtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzcGxheSB0ZXh0IGZvciBhIGdpdmVuIHJlcGVhdGVyIGl0ZW1cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0byBnZXQgdGhlIGxhYmVsIGZvci5cbiAgICogQHJldHVybnMgQSBzdHJpbmcgd2hpY2ggaXMgdGhlIGRpc3BsYXkgdGV4dC5cbiAgICogQGF1dGhvciBXaWxsIFBvdWxzb25cbiAgICovXG4gIHB1YmxpYyBnZXRSZXBlYXRlckl0ZW1MYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudFF1ZXN0aW9uLmZvcm1Db250cm9sIHx8ICEodGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwZWF0ZXJJdGVtID0gdGhpcy5jdXJyZW50UXVlc3Rpb24uZm9ybUNvbnRyb2wuY29udHJvbHNbaW5kZXhdO1xuXG4gICAgaWYgKCFyZXBlYXRlckl0ZW0pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuY3VycmVudFF1ZXN0aW9uLmRhdGEucmVwZWF0ZXJEaXNwbGF5TmFtZTtcbiAgICBjb25zdCBzcGxpdFRlbXBsYXRlID0gdGVtcGxhdGUuc3BsaXQoJyAnKTtcblxuICAgIGNvbnN0IGRpc3BsYXlBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGVJdGVtIG9mIHNwbGl0VGVtcGxhdGUpIHtcbiAgICAgIGlmICh0ZW1wbGF0ZUl0ZW0ubWF0Y2goL1xcWy4qP1xcXS8pKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSB0ZW1wbGF0ZUl0ZW0ucmVwbGFjZSgvW1xcW1xcXSddKy9nLCAnJyk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSByZXBlYXRlckl0ZW0uZ2V0KHBhdGgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0udmFsdWUgPyBpdGVtLnZhbHVlIDogJz8nO1xuICAgICAgICBkaXNwbGF5QXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwbGF5QXJyYXkucHVzaCh0ZW1wbGF0ZUl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXkgPSBkaXNwbGF5QXJyYXkuam9pbignICcpO1xuICAgIHJldHVybiBkaXNwbGF5O1xuICB9XG59XG4iXX0=
@@ -625,6 +625,7 @@ class QuestionnaireService {
625
625
  this.formConstuctor = formConstuctor;
626
626
  this.options = options;
627
627
  this.dataChangedEvent = new EventEmitter();
628
+ this.sectionFinishedEvent = new EventEmitter();
628
629
  this.skippable = true;
629
630
  }
630
631
  /**
@@ -709,6 +710,30 @@ class QuestionnaireService {
709
710
  get isValid() {
710
711
  return this.currentQuestionnaireForm.valid;
711
712
  }
713
+ /**
714
+ * @return {?}
715
+ */
716
+ get isFirstQuestion() {
717
+ if (!this.currentSection || !this.currentQuestion) {
718
+ return false;
719
+ }
720
+ /** @type {?} */
721
+ const currentIndex = this.currentSection.data.questions.indexOf(this.currentQuestion.data);
722
+ return currentIndex === 0;
723
+ }
724
+ /**
725
+ * @return {?}
726
+ */
727
+ get isLastQuestion() {
728
+ if (!this.currentSection || !this.currentQuestion) {
729
+ return false;
730
+ }
731
+ /** @type {?} */
732
+ const currentIndex = this.currentSection.data.questions.indexOf(this.currentQuestion.data);
733
+ /** @type {?} */
734
+ const maxIndex = this.currentSection.data.questions.length - 1;
735
+ return currentIndex === maxIndex;
736
+ }
712
737
  /**
713
738
  * @param {?} name
714
739
  * @return {?}
@@ -843,6 +868,14 @@ class QuestionnaireService {
843
868
  * @return {?}
844
869
  */
845
870
  (currentIndex) => {
871
+ /** @type {?} */
872
+ const lastQuestionIndex = this.currentSection.data.questions.length - 1;
873
+ /** @type {?} */
874
+ const isLastQuestion = lastQuestionIndex === currentIndex;
875
+ if (isLastQuestion) {
876
+ this.sectionFinishedEvent.emit();
877
+ return;
878
+ }
846
879
  /** @type {?} */
847
880
  const newIndex = currentIndex + 1;
848
881
  this.navigateToQuestion(newIndex).then((/**
@@ -1081,15 +1114,23 @@ class QuestionnaireService {
1081
1114
  * @return {?}
1082
1115
  */
1083
1116
  answerCurrentQuestion(answer, sendToNextQuestion) {
1084
- this.currentQuestion.formControl.setValue(answer);
1085
- if (sendToNextQuestion && this.skippable) { // Timeout to prevent skipping glitch.
1117
+ if (!sendToNextQuestion) {
1118
+ this.currentQuestion.formControl.setValue(answer);
1119
+ return;
1120
+ }
1121
+ if (this.skippable) { // Timeout to prevent skipping glitch.
1086
1122
  this.skippable = false;
1087
1123
  setTimeout((/**
1088
1124
  * @return {?}
1089
1125
  */
1090
1126
  () => {
1091
- this.nextQuestion();
1092
- this.skippable = true;
1127
+ this.currentQuestion.formControl.setValue(answer);
1128
+ this.nextQuestion().then((/**
1129
+ * @return {?}
1130
+ */
1131
+ () => {
1132
+ this.skippable = true;
1133
+ }));
1093
1134
  }), 150);
1094
1135
  }
1095
1136
  }
@@ -1199,6 +1240,8 @@ QuestionnaireService.ctorParameters = () => [
1199
1240
  if (false) {
1200
1241
  /** @type {?} */
1201
1242
  QuestionnaireService.prototype.dataChangedEvent;
1243
+ /** @type {?} */
1244
+ QuestionnaireService.prototype.sectionFinishedEvent;
1202
1245
  /**
1203
1246
  * @type {?}
1204
1247
  * @private